Introduce bitmap256.cc for FindNextSetBit().

Defining the member function in `bitmap256.h` seems to be
problematic when using Clang modules AKA header modules.

Change-Id: I7f6b1b3aba8739678a0356590a86ded36a18185b
Reviewed-on: https://code-review.googlesource.com/c/re2/+/60930
Reviewed-by: Paul Wankadia <junyer@google.com>
Reviewed-by: Perry Lorier <perryl@google.com>
This commit is contained in:
Paul Wankadia
2023-01-23 06:36:13 -08:00
parent 954656f47f
commit ba541565b4
5 changed files with 47 additions and 31 deletions

1
BUILD
View File

@@ -11,6 +11,7 @@ exports_files(["LICENSE"])
cc_library(
name = "re2",
srcs = [
"re2/bitmap256.cc",
"re2/bitmap256.h",
"re2/bitstate.cc",
"re2/compile.cc",

View File

@@ -54,6 +54,7 @@ if(USEPCRE)
endif()
set(RE2_SOURCES
re2/bitmap256.cc
re2/bitstate.cc
re2/compile.cc
re2/dfa.cc

View File

@@ -112,6 +112,7 @@ HFILES=\
OFILES=\
obj/util/rune.o\
obj/util/strutil.o\
obj/re2/bitmap256.o\
obj/re2/bitstate.o\
obj/re2/compile.o\
obj/re2/dfa.o\

44
re2/bitmap256.cc Normal file
View File

@@ -0,0 +1,44 @@
// Copyright 2023 The RE2 Authors. All Rights Reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
#include "re2/bitmap256.h"
#include <stdint.h>
#include "util/util.h"
#include "util/logging.h"
namespace re2 {
int Bitmap256::FindNextSetBit(int c) const {
DCHECK_GE(c, 0);
DCHECK_LE(c, 255);
// Check the word that contains the bit. Mask out any lower bits.
int i = c / 64;
uint64_t word = words_[i] & (~uint64_t{0} << (c % 64));
if (word != 0)
return (i * 64) + FindLSBSet(word);
// Check any following words.
i++;
switch (i) {
case 1:
if (words_[1] != 0)
return (1 * 64) + FindLSBSet(words_[1]);
FALLTHROUGH_INTENDED;
case 2:
if (words_[2] != 0)
return (2 * 64) + FindLSBSet(words_[2]);
FALLTHROUGH_INTENDED;
case 3:
if (words_[3] != 0)
return (3 * 64) + FindLSBSet(words_[3]);
FALLTHROUGH_INTENDED;
default:
return -1;
}
}
} // namespace re2

View File

@@ -11,7 +11,6 @@
#include <stdint.h>
#include <string.h>
#include "util/util.h"
#include "util/logging.h"
namespace re2 {
@@ -82,36 +81,6 @@ class Bitmap256 {
uint64_t words_[4];
};
int Bitmap256::FindNextSetBit(int c) const {
DCHECK_GE(c, 0);
DCHECK_LE(c, 255);
// Check the word that contains the bit. Mask out any lower bits.
int i = c / 64;
uint64_t word = words_[i] & (~uint64_t{0} << (c % 64));
if (word != 0)
return (i * 64) + FindLSBSet(word);
// Check any following words.
i++;
switch (i) {
case 1:
if (words_[1] != 0)
return (1 * 64) + FindLSBSet(words_[1]);
FALLTHROUGH_INTENDED;
case 2:
if (words_[2] != 0)
return (2 * 64) + FindLSBSet(words_[2]);
FALLTHROUGH_INTENDED;
case 3:
if (words_[3] != 0)
return (3 * 64) + FindLSBSet(words_[3]);
FALLTHROUGH_INTENDED;
default:
return -1;
}
}
} // namespace re2
#endif // RE2_BITMAP256_H_