8#ifndef OPENVDB_UTIL_NODEMASKS_HAS_BEEN_INCLUDED
9#define OPENVDB_UTIL_NODEMASKS_HAS_BEEN_INCLUDED
29#if defined(OPENVDB_USE_SSE42) && defined(_MSC_VER)
31#elif defined(OPENVDB_USE_SSE42) && (defined(__GNUC__) || defined(__clang__))
32 return __builtin_popcount(v);
35 static const Byte numBits[256] = {
36#define COUNTONB2(n) n, n+1, n+1, n+2
37#define COUNTONB4(n) COUNTONB2(n), COUNTONB2(n+1), COUNTONB2(n+1), COUNTONB2(n+2)
38#define COUNTONB6(n) COUNTONB4(n), COUNTONB4(n+1), COUNTONB4(n+1), COUNTONB4(n+2)
55 v = v - ((v >> 1) & 0x55555555U);
56 v = (v & 0x33333333U) + ((v >> 2) & 0x33333333U);
57 return (((v + (v >> 4)) & 0xF0F0F0FU) * 0x1010101U) >> 24;
67#if defined(OPENVDB_USE_SSE42) && defined(_MSC_VER) && defined(_M_X64)
69#elif defined(OPENVDB_USE_SSE42) && (defined(__GNUC__) || defined(__clang__))
70 v = __builtin_popcountll(v);
73 v = v - ((v >> 1) & UINT64_C(0x5555555555555555));
74 v = (v & UINT64_C(0x3333333333333333)) + ((v >> 2) & UINT64_C(0x3333333333333333));
75 v = (((v + (v >> 4)) & UINT64_C(0xF0F0F0F0F0F0F0F)) * UINT64_C(0x101010101010101)) >> 56;
88#if defined(OPENVDB_USE_SSE42) && defined(_MSC_VER)
90 _BitScanForward(&index,
static_cast<Index32>(v));
91 return static_cast<Index32>(index);
92#elif defined(OPENVDB_USE_SSE42) && (defined(__GNUC__) || defined(__clang__))
93 return __builtin_ctz(v);
96 static const Byte DeBruijn[8] = {0, 1, 6, 2, 7, 5, 4, 3};
97 return DeBruijn[
Byte((v & -v) * 0x1DU) >> 5];
107 static const Byte DeBruijn[32] = {
108 0, 1, 28, 2, 29, 14, 24, 3, 30, 22, 20, 15, 25, 17, 4, 8,
109 31, 27, 13, 23, 21, 19, 16, 7, 26, 12, 18, 6, 11, 5, 10, 9
115#pragma warning(disable:4146)
117 return DeBruijn[
Index32((v & -v) * 0x077CB531U) >> 27];
128#if defined(OPENVDB_USE_SSE42) && defined(_MSC_VER)
130 _BitScanForward64(&index, v);
131 return static_cast<Index32>(index);
132#elif defined(OPENVDB_USE_SSE42) && (defined(__GNUC__) || defined(__clang__))
133 return static_cast<Index32>(__builtin_ctzll(v));
136 static const Byte DeBruijn[64] = {
137 0, 1, 2, 53, 3, 7, 54, 27, 4, 38, 41, 8, 34, 55, 48, 28,
138 62, 5, 39, 46, 44, 42, 22, 9, 24, 35, 59, 56, 49, 18, 29, 11,
139 63, 52, 6, 26, 37, 40, 33, 47, 61, 45, 43, 21, 23, 58, 17, 10,
140 51, 25, 36, 32, 60, 20, 57, 16, 50, 31, 19, 15, 30, 14, 13, 12,
147#pragma warning(disable:4146)
149 return DeBruijn[
Index64((v & -v) * UINT64_C(0x022FDD63CC95386D)) >> 58];
161 static const Byte DeBruijn[32] = {
162 0, 9, 1, 10, 13, 21, 2, 29, 11, 14, 16, 18, 22, 25, 3, 30,
163 8, 12, 20, 28, 15, 17, 24, 7, 19, 27, 23, 6, 26, 5, 4, 31
170 return DeBruijn[
Index32(v * 0x07C4ACDDU) >> 27];
178template<
typename NodeMask>
202 operator bool()
const {
return this->
test(); }
207template <
typename NodeMask>
220 mPos = mParent->findNextOn(mPos+1);
238template <
typename NodeMask>
251 mPos=mParent->findNextOff(mPos+1);
269template <
typename NodeMask>
306template<Index Log2Dim>
310 static_assert(Log2Dim > 2,
"expected NodeMask template specialization, got base template");
343 const Word* w2 = other.mWords;
344 for (
Word* w1 = mWords; n--; ++w1, ++w2) *w1 = *w2;
362 for (
const Word *w1=mWords, *w2=other.mWords; n-- && *w1++ == *w2++;) ;
366 bool operator != (
const NodeMask &other)
const {
return !(*
this == other); }
378 template<
typename WordOp>
382 const Word *w2 = other.mWords;
386 template<
typename WordOp>
390 const Word *w2 = other1.mWords, *w3 = other2.mWords;
394 template<
typename WordOp>
399 const Word *w2 = other1.mWords, *w3 = other2.mWords, *w4 = other3.mWords;
400 for (
Index32 n =
WORD_COUNT; n--; ++w1, ++w2, ++w3, ++w4) op( *w1, *w2, *w3, *w4);
407 const Word *w2 = other.mWords;
415 const Word *w2 = other.mWords;
423 const Word *w2 = other.mWords;
431 const Word *w2 = other.mWords;
446 for (
const Word* w = mWords; n--; ++w) sum +=
CountOn(*w);
454 mWords[n >> 6] |=
Word(1) << (n & 63);
459 mWords[n >> 6] &= ~(
Word(1) << (n & 63));
468 for (
Word* w = mWords; n--; ++w) *w = state;
474 for (
Word* w = mWords; n--; ++w) *w = ~
Word(0);
480 for (
Word* w = mWords; n--; ++w) *w =
Word(0);
485 mWords[n >> 6] ^=
Word(1) << (n & 63);
491 for (
Word* w = mWords; n--; ++w) *w = ~*w;
505 return 0 != (mWords[n >> 6] & (
Word(1) << (n & 63)));
513 for (
const Word *w = mWords; n-- && *w++ ==
~Word(0);) ;
520 for (
const Word *w = mWords; n-- && *w++ ==
Word(0);) ;
529 if ( !
isOn && mWords[0] !=
Word(0))
return false;
531 while( w<n && *w == mWords[0] ) ++w;
537 const Word* w = mWords;
544 const Word* w = mWords;
551 template<
typename WordT>
555 return reinterpret_cast<const WordT*
>(mWords)[n];
557 template<
typename WordT>
561 return reinterpret_cast<WordT*
>(mWords)[n];
565 void save(std::ostream& os)
const
567 os.write(
reinterpret_cast<const char*
>(mWords), this->
memUsage());
569 void load(std::istream& is) { is.read(
reinterpret_cast<char*
>(mWords), this->
memUsage()); }
570 void seek(std::istream& is)
const { is.seekg(this->
memUsage(), std::ios_base::cur); }
574 os <<
"NodeMask: Dim=" <<
DIM <<
" Log2Dim=" << Log2Dim
575 <<
" Bit count=" <<
SIZE <<
" word count=" <<
WORD_COUNT << std::endl;
580 for (
Index32 i=0; i < n; ++i) {
587 os <<
"|" << std::endl;
601 if (b & (
Word(1) << m))
return start;
613 if (b & (
Word(1) << m))
return start;
647 void operator = (
const NodeMask &other) { mByte = other.mByte; }
660 bool operator == (
const NodeMask &other)
const {
return mByte == other.mByte; }
662 bool operator != (
const NodeMask &other)
const {
return mByte != other.mByte; }
674 template<
typename WordOp>
677 op(mByte, other.mByte);
680 template<
typename WordOp>
683 op(mByte, other1.mByte, other2.mByte);
686 template<
typename WordOp>
690 op(mByte, other1.mByte, other2.mByte, other3.mByte);
696 mByte &= other.mByte;
702 mByte |= other.mByte;
708 mByte &=
static_cast<Byte>(~other.mByte);
714 mByte ^= other.mByte;
730 mByte =
static_cast<Byte>(mByte | 0x01U << (n & 7));
735 mByte =
static_cast<Byte>(mByte & ~(0x01U << (n & 7)));
740 void set(
bool on) { mByte = on ? 0xFFU : 0x00U; }
748 mByte =
static_cast<Byte>(mByte ^ 0x01U << (n & 7));
764 return mByte & (0x01U << (n & 7));
769 bool isOn()
const {
return mByte == 0xFFU; }
771 bool isOff()
const {
return mByte == 0; }
783 const Byte b =
static_cast<Byte>(~mByte);
790 template<typename WordT>
791 WordT getWord(Index n) const
793 static_assert(sizeof(WordT) == sizeof(Byte), "expected word size to be one byte");
794 OPENVDB_ASSERT(n == 0);
795 return reinterpret_cast<WordT>(mByte);
797 template<typename WordT>
798 WordT& getWord(Index n)
800 static_assert(sizeof(WordT) == sizeof(Byte), "expected word size to be one byte");
801 OPENVDB_ASSERT(n == 0);
802 return reinterpret_cast<WordT&>(mByte);
806 void save(std::ostream& os)
const { os.write(
reinterpret_cast<const char*
>(&mByte), 1); }
807 void load(std::istream& is) { is.read(
reinterpret_cast<char*
>(&mByte), 1); }
808 void seek(std::istream& is)
const { is.seekg(1, std::ios_base::cur); }
812 os <<
"NodeMask: Dim=2, Log2Dim=1, Bit count=8, Word count=1"<<std::endl;
818 os <<
"||" << std::endl;
828 if (start>=8)
return 8;
829 const Byte b =
static_cast<Byte>(mByte & (0xFFU << start));
835 if (start>=8)
return 8;
836 const Byte b =
static_cast<Byte>(~mByte & (0xFFU << start));
863 NodeMask(
bool on) : mWord(on ? UINT64_C(0xFFFFFFFFFFFFFFFF) : UINT64_C(0x00)) {}
869 void operator = (
const NodeMask &other) { mWord = other.mWord; }
882 bool operator == (
const NodeMask &other)
const {
return mWord == other.mWord; }
884 bool operator != (
const NodeMask &other)
const {
return mWord != other.mWord; }
896 template<
typename WordOp>
899 op(mWord, other.mWord);
902 template<
typename WordOp>
905 op(mWord, other1.mWord, other2.mWord);
908 template<
typename WordOp>
912 op(mWord, other1.mWord, other2.mWord, other3.mWord);
918 mWord &= other.mWord;
924 mWord |= other.mWord;
930 mWord &= ~other.mWord;
936 mWord ^= other.mWord;
952 mWord |= UINT64_C(0x01) << (n & 63);
957 mWord &= ~(UINT64_C(0x01) << (n & 63));
962 void set(
bool on) { mWord = on ? UINT64_C(0xFFFFFFFFFFFFFFFF) : UINT64_C(0x00); }
964 void setOn() { mWord = UINT64_C(0xFFFFFFFFFFFFFFFF); }
966 void setOff() { mWord = UINT64_C(0x00); }
970 mWord ^= UINT64_C(0x01) << (n & 63);
986 return 0 != (mWord & (UINT64_C(0x01) << (n & 63)));
991 bool isOn()
const {
return mWord == UINT64_C(0xFFFFFFFFFFFFFFFF); }
993 bool isOff()
const {
return mWord == 0; }
998 {
isOn = this->isOn();
1004 const Word w = ~mWord;
1009 template<
typename WordT>
1013 return reinterpret_cast<const WordT*
>(&mWord)[n];
1015 template<
typename WordT>
1019 return reinterpret_cast<WordT*
>(mWord)[n];
1022 void save(std::ostream& os)
const { os.write(
reinterpret_cast<const char*
>(&mWord), 8); }
1023 void load(std::istream& is) { is.read(
reinterpret_cast<char*
>(&mWord), 8); }
1024 void seek(std::istream& is)
const { is.seekg(8, std::ios_base::cur); }
1028 os <<
"NodeMask: Dim=4, Log2Dim=2, Bit count=64, Word count=1"<<std::endl;
1033 for (
Index32 i=0; i < 64; ++i) {
1034 if ( !(i%8) ) os <<
"|";
1035 os << this->
isOn(i);
1037 os <<
"||" << std::endl;
1047 if (start>=64)
return 64;
1048 const Word w = mWord & (UINT64_C(0xFFFFFFFFFFFFFFFF) << start);
1054 if (start>=64)
return 64;
1055 const Word w = ~mWord & (UINT64_C(0xFFFFFFFFFFFFFFFF) << start);
1139 operator bool()
const {
return this->
test();}
1158 for (
Index i=0; i<n && this->
next(); ++i) {}
1162 return this->
test();
1186 for (
Index i=0; i<n && this->
next(); ++i) {}
1190 return this->
test();
1214 for (
Index i=0; i<n && this->
next(); ++i) {}
1218 return this->
test();
1299 mBits[i>>5] |= 1<<(i&31);
1305 mBits[i>>5] &= ~(1<<(i&31));
1321 mBits[i>>5] ^= 1<<(i&31);
1334 return (
mBits[i >> 5] & (1<<(i&31)) );
1339 return ( ~
mBits[i >> 5] & (1<<(i&31)) );
1343 if (!
mBits)
return false;
1349 if (!
mBits)
return true;
1368 void save(std::ostream& os)
const {
1376 void seek(std::istream& is)
const {
1382 os <<
"RootNodeMask: Bit-size="<<
mBitSize<<
" Int-size="<<
mIntSize<<std::endl;
1387 for (
Index32 i=0; i < n; ++i) {
1392 os << this->
isOn(i);
1394 os <<
"|" << std::endl;
1404 Index32 n = start >> 5, m = start & 31;
1407 if (b & (1<<m))
return start;
1408 b &= 0xFFFFFFFF << m;
1415 Index32 n = start >> 5, m = start & 31;
1418 if (b & (1<<m))
return start;
#define OPENVDB_ASSERT(X)
Definition Assert.h:41
OPENVDB_API void printBits(std::ostream &os, half h)
bool operator==(const BaseMaskIterator &iter) const
Definition NodeMasks.h:192
bool test() const
Definition NodeMasks.h:201
BaseMaskIterator(const BaseMaskIterator &)=default
bool operator!=(const BaseMaskIterator &iter) const
Definition NodeMasks.h:193
BaseMaskIterator()
Definition NodeMasks.h:186
Index32 mPos
Definition NodeMasks.h:182
Index32 pos() const
Definition NodeMasks.h:200
BaseMaskIterator(Index32 pos, const NodeMask *parent)
Definition NodeMasks.h:188
Index32 offset() const
Definition NodeMasks.h:199
const NodeMask * mParent
Definition NodeMasks.h:183
BaseMaskIterator & operator=(const BaseMaskIterator &iter)
Definition NodeMasks.h:195
Definition NodeMasks.h:271
DenseMaskIterator & operator++()
Definition NodeMasks.h:293
bool operator*() const
Definition NodeMasks.h:292
DenseMaskIterator()
Definition NodeMasks.h:278
DenseMaskIterator(Index32 pos, const NodeMask *parent)
Definition NodeMasks.h:279
bool next()
Definition NodeMasks.h:287
void increment(Index n)
Definition NodeMasks.h:286
void increment()
Definition NodeMasks.h:280
const NodeMask & operator^=(const NodeMask &other)
Bitwise XOR.
Definition NodeMasks.h:712
bool isOff(Index32 n) const
Return true if the nth bit is off.
Definition NodeMasks.h:767
NodeMask operator|(const NodeMask &other) const
Definition NodeMasks.h:719
const NodeMask & operator&=(const NodeMask &other)
Bitwise intersection.
Definition NodeMasks.h:694
Index32 countOn() const
Return the total number of on bits.
Definition NodeMasks.h:724
const NodeMask & operator-=(const NodeMask &other)
Bitwise difference.
Definition NodeMasks.h:706
void printAll(std::ostream &os=std::cout) const
Definition NodeMasks.h:820
OnIterator beginOn() const
Definition NodeMasks.h:653
NodeMask operator^(const NodeMask &other) const
Definition NodeMasks.h:720
DenseIterator endDense() const
Definition NodeMasks.h:658
DenseIterator beginDense() const
Definition NodeMasks.h:657
OffIterator beginOff() const
Definition NodeMasks.h:655
void set(Index32 n, bool On)
Set the nth bit to the specified state.
Definition NodeMasks.h:738
void setOn()
Set all bits on.
Definition NodeMasks.h:742
DenseMaskIterator< NodeMask > DenseIterator
Definition NodeMasks.h:651
bool isOn(Index32 n) const
Return true if the nth bit is on.
Definition NodeMasks.h:761
void printBits(std::ostream &os=std::cout) const
Definition NodeMasks.h:814
bool isConstant(bool &isOn) const
Definition NodeMasks.h:775
static const Index32 WORD_COUNT
Definition NodeMasks.h:630
Index32 countOff() const
Return the total number of on bits.
Definition NodeMasks.h:726
void toggle(Index32 n)
Toggle the state of the nth bit.
Definition NodeMasks.h:746
void setLastOff()
Set the last bit off.
Definition NodeMasks.h:759
NodeMask(bool on)
All bits are set to the specified state.
Definition NodeMasks.h:641
Index32 findNextOff(Index32 start) const
Definition NodeMasks.h:833
void seek(std::istream &is) const
Definition NodeMasks.h:808
void setFirstOff()
Set the first bit off.
Definition NodeMasks.h:757
OnMaskIterator< NodeMask > OnIterator
Definition NodeMasks.h:649
void set(bool on)
Set all bits to the specified state.
Definition NodeMasks.h:740
NodeMask operator!() const
Definition NodeMasks.h:717
static const Index32 SIZE
Definition NodeMasks.h:629
void setFirstOn()
Set the first bit on.
Definition NodeMasks.h:753
static const Index32 DIM
Definition NodeMasks.h:628
OnIterator endOn() const
Definition NodeMasks.h:654
void load(std::istream &is)
Definition NodeMasks.h:807
const NodeMask & operator|=(const NodeMask &other)
Bitwise union.
Definition NodeMasks.h:700
void save(std::ostream &os) const
Definition NodeMasks.h:806
Index32 findFirstOff() const
Definition NodeMasks.h:781
static Index32 memUsage()
Return the byte size of this NodeMask.
Definition NodeMasks.h:722
void setOff()
Set all bits off.
Definition NodeMasks.h:744
void setOff(Index32 n)
Set the nth bit off.
Definition NodeMasks.h:733
void setOn(Index32 n)
Set the nth bit on.
Definition NodeMasks.h:728
NodeMask operator&(const NodeMask &other) const
Definition NodeMasks.h:718
bool isOff() const
Return true if all the bits are off.
Definition NodeMasks.h:771
static const Index32 LOG2DIM
Definition NodeMasks.h:627
NodeMask()
Default constructor sets all bits off.
Definition NodeMasks.h:639
NodeMask(const NodeMask &other)
Copy constructor.
Definition NodeMasks.h:643
Byte Word
Definition NodeMasks.h:631
void toggle()
Toggle the state of all bits in the mask.
Definition NodeMasks.h:751
void printInfo(std::ostream &os=std::cout) const
simple print method for debugging
Definition NodeMasks.h:810
OffMaskIterator< NodeMask > OffIterator
Definition NodeMasks.h:650
Index32 findNextOn(Index32 start) const
Definition NodeMasks.h:826
void setLastOn()
Set the last bit on.
Definition NodeMasks.h:755
~NodeMask()
Destructor.
Definition NodeMasks.h:645
OffIterator endOff() const
Definition NodeMasks.h:656
bool isOn() const
Return true if all the bits are on.
Definition NodeMasks.h:769
Index32 findFirstOn() const
Definition NodeMasks.h:780
const NodeMask & operator^=(const NodeMask &other)
Bitwise XOR.
Definition NodeMasks.h:934
bool isOff(Index32 n) const
Return true if the nth bit is off.
Definition NodeMasks.h:989
NodeMask operator|(const NodeMask &other) const
Definition NodeMasks.h:941
const NodeMask & operator&=(const NodeMask &other)
Bitwise intersection.
Definition NodeMasks.h:916
Index32 countOn() const
Return the total number of on bits.
Definition NodeMasks.h:946
const NodeMask & operator-=(const NodeMask &other)
Bitwise difference.
Definition NodeMasks.h:928
Index64 Word
Definition NodeMasks.h:853
void printAll(std::ostream &os=std::cout) const
Definition NodeMasks.h:1039
OnIterator beginOn() const
Definition NodeMasks.h:875
WordT & getWord(Index n)
Definition NodeMasks.h:1016
NodeMask operator^(const NodeMask &other) const
Definition NodeMasks.h:942
DenseIterator endDense() const
Definition NodeMasks.h:880
DenseIterator beginDense() const
Definition NodeMasks.h:879
OffIterator beginOff() const
Definition NodeMasks.h:877
void set(Index32 n, bool On)
Set the nth bit to the specified state.
Definition NodeMasks.h:960
void setOn()
Set all bits on.
Definition NodeMasks.h:964
DenseMaskIterator< NodeMask > DenseIterator
Definition NodeMasks.h:873
bool isOn(Index32 n) const
Return true if the nth bit is on.
Definition NodeMasks.h:983
void printBits(std::ostream &os=std::cout) const
Definition NodeMasks.h:1030
bool isConstant(bool &isOn) const
Definition NodeMasks.h:997
static const Index32 WORD_COUNT
Definition NodeMasks.h:852
Index32 countOff() const
Return the total number of on bits.
Definition NodeMasks.h:948
void toggle(Index32 n)
Toggle the state of the nth bit.
Definition NodeMasks.h:968
void setLastOff()
Set the last bit off.
Definition NodeMasks.h:981
NodeMask(bool on)
All bits are set to the specified state.
Definition NodeMasks.h:863
WordT getWord(Index n) const
Return the nth word of the bit mask, for a word of arbitrary size.
Definition NodeMasks.h:1010
Index32 findNextOff(Index32 start) const
Definition NodeMasks.h:1052
void seek(std::istream &is) const
Definition NodeMasks.h:1024
void setFirstOff()
Set the first bit off.
Definition NodeMasks.h:979
OnMaskIterator< NodeMask > OnIterator
Definition NodeMasks.h:871
void set(bool on)
Set all bits to the specified state.
Definition NodeMasks.h:962
NodeMask operator!() const
Definition NodeMasks.h:939
static const Index32 SIZE
Definition NodeMasks.h:851
void setFirstOn()
Set the first bit on.
Definition NodeMasks.h:975
static const Index32 DIM
Definition NodeMasks.h:850
OnIterator endOn() const
Definition NodeMasks.h:876
void load(std::istream &is)
Definition NodeMasks.h:1023
const NodeMask & operator|=(const NodeMask &other)
Bitwise union.
Definition NodeMasks.h:922
void save(std::ostream &os) const
Definition NodeMasks.h:1022
Index32 findFirstOff() const
Definition NodeMasks.h:1002
static Index32 memUsage()
Return the byte size of this NodeMask.
Definition NodeMasks.h:944
void setOff()
Set all bits off.
Definition NodeMasks.h:966
void setOff(Index32 n)
Set the nth bit off.
Definition NodeMasks.h:955
void setOn(Index32 n)
Set the nth bit on.
Definition NodeMasks.h:950
NodeMask operator&(const NodeMask &other) const
Definition NodeMasks.h:940
bool isOff() const
Return true if all the bits are off.
Definition NodeMasks.h:993
static const Index32 LOG2DIM
Definition NodeMasks.h:849
NodeMask()
Default constructor sets all bits off.
Definition NodeMasks.h:861
NodeMask(const NodeMask &other)
Copy constructor.
Definition NodeMasks.h:865
void toggle()
Toggle the state of all bits in the mask.
Definition NodeMasks.h:973
void printInfo(std::ostream &os=std::cout) const
simple print method for debugging
Definition NodeMasks.h:1026
OffMaskIterator< NodeMask > OffIterator
Definition NodeMasks.h:872
Index32 findNextOn(Index32 start) const
Definition NodeMasks.h:1045
void setLastOn()
Set the last bit on.
Definition NodeMasks.h:977
~NodeMask()
Destructor.
Definition NodeMasks.h:867
OffIterator endOff() const
Definition NodeMasks.h:878
bool isOn() const
Return true if all the bits are on.
Definition NodeMasks.h:991
Index32 findFirstOn() const
Definition NodeMasks.h:1001
Bit mask for the internal and leaf nodes of VDB. This is a 64-bit implementation.
Definition NodeMasks.h:308
const NodeMask & operator^=(const NodeMask &other)
Bitwise XOR.
Definition NodeMasks.h:428
bool isOff(Index32 n) const
Return true if the nth bit is off.
Definition NodeMasks.h:508
NodeMask operator|(const NodeMask &other) const
Definition NodeMasks.h:437
const NodeMask & operator&=(const NodeMask &other)
Bitwise intersection.
Definition NodeMasks.h:404
Index32 countOn() const
Return the total number of on bits.
Definition NodeMasks.h:443
const NodeMask & operator-=(const NodeMask &other)
Bitwise difference.
Definition NodeMasks.h:420
Index64 Word
Definition NodeMasks.h:316
OnIterator beginOn() const
Definition NodeMasks.h:352
WordT & getWord(Index n)
Definition NodeMasks.h:558
NodeMask operator^(const NodeMask &other) const
Definition NodeMasks.h:438
DenseIterator endDense() const
Definition NodeMasks.h:357
DenseIterator beginDense() const
Definition NodeMasks.h:356
OffIterator beginOff() const
Definition NodeMasks.h:354
void set(Index32 n, bool On)
Set the nth bit to the specified state.
Definition NodeMasks.h:462
void setOn()
Set all bits on.
Definition NodeMasks.h:471
DenseMaskIterator< NodeMask > DenseIterator
Definition NodeMasks.h:350
bool isOn(Index32 n) const
Return true if the nth bit is on.
Definition NodeMasks.h:502
bool isConstant(bool &isOn) const
Definition NodeMasks.h:526
static const Index32 WORD_COUNT
Definition NodeMasks.h:315
Index32 countOff() const
Return the total number of on bits.
Definition NodeMasks.h:450
void toggle(Index32 n)
Toggle the state of the nth bit.
Definition NodeMasks.h:483
void setLastOff()
Set the last bit off.
Definition NodeMasks.h:500
NodeMask(bool on)
All bits are set to the specified state.
Definition NodeMasks.h:334
WordT getWord(Index n) const
Return the nth word of the bit mask, for a word of arbitrary size.
Definition NodeMasks.h:552
Index32 findNextOff(Index32 start) const
Definition NodeMasks.h:607
void seek(std::istream &is) const
Definition NodeMasks.h:570
void setFirstOff()
Set the first bit off.
Definition NodeMasks.h:498
OnMaskIterator< NodeMask > OnIterator
Definition NodeMasks.h:348
void set(bool on)
Set all bits to the specified state.
Definition NodeMasks.h:464
NodeMask operator!() const
Definition NodeMasks.h:435
static const Index32 SIZE
Definition NodeMasks.h:314
void setFirstOn()
Set the first bit on.
Definition NodeMasks.h:494
static const Index32 DIM
Definition NodeMasks.h:313
OnIterator endOn() const
Definition NodeMasks.h:353
void load(std::istream &is)
Definition NodeMasks.h:569
const NodeMask & operator|=(const NodeMask &other)
Bitwise union.
Definition NodeMasks.h:412
void save(std::ostream &os) const
Definition NodeMasks.h:565
Index32 findFirstOff() const
Definition NodeMasks.h:541
void printBits(std::ostream &os=std::cout, Index32 max_out=80u) const
Definition NodeMasks.h:577
static Index32 memUsage()
Return the byte size of this NodeMask.
Definition NodeMasks.h:441
void setOff()
Set all bits off.
Definition NodeMasks.h:477
void setOff(Index32 n)
Set the nth bit off.
Definition NodeMasks.h:457
void setOn(Index32 n)
Set the nth bit on.
Definition NodeMasks.h:452
NodeMask operator&(const NodeMask &other) const
Definition NodeMasks.h:436
bool isOff() const
Return true if all the bits are off.
Definition NodeMasks.h:517
NodeMask & operator=(const NodeMask &other)
Assignment operator.
Definition NodeMasks.h:340
static const Index32 LOG2DIM
Definition NodeMasks.h:312
NodeMask()
Default constructor sets all bits off.
Definition NodeMasks.h:332
NodeMask(const NodeMask &other)
Copy constructor.
Definition NodeMasks.h:336
void toggle()
Toggle the state of all bits in the mask.
Definition NodeMasks.h:488
void printAll(std::ostream &os=std::cout, Index32 max_out=80u) const
Definition NodeMasks.h:589
void printInfo(std::ostream &os=std::cout) const
simple print method for debugging
Definition NodeMasks.h:572
OffMaskIterator< NodeMask > OffIterator
Definition NodeMasks.h:349
Index32 findNextOn(Index32 start) const
Definition NodeMasks.h:595
void setLastOn()
Set the last bit on.
Definition NodeMasks.h:496
~NodeMask()
Destructor.
Definition NodeMasks.h:338
OffIterator endOff() const
Definition NodeMasks.h:355
bool isOn() const
Return true if all the bits are on.
Definition NodeMasks.h:510
Index32 findFirstOn() const
Definition NodeMasks.h:534
Definition NodeMasks.h:240
bool operator*() const
Definition NodeMasks.h:260
OffMaskIterator()
Definition NodeMasks.h:246
OffMaskIterator(Index32 pos, const NodeMask *parent)
Definition NodeMasks.h:247
bool next()
Definition NodeMasks.h:255
OffMaskIterator & operator++()
Definition NodeMasks.h:261
void increment(Index n)
Definition NodeMasks.h:254
void increment()
Definition NodeMasks.h:248
Definition NodeMasks.h:209
bool operator*() const
Definition NodeMasks.h:229
OnMaskIterator & operator++()
Definition NodeMasks.h:230
bool next()
Definition NodeMasks.h:224
OnMaskIterator(Index32 pos, const NodeMask *parent)
Definition NodeMasks.h:216
OnMaskIterator()
Definition NodeMasks.h:215
void increment(Index n)
Definition NodeMasks.h:223
void increment()
Definition NodeMasks.h:217
const RootNodeMask * mParent
Definition NodeMasks.h:1114
bool test() const
Definition NodeMasks.h:1134
Index32 mBitSize
Definition NodeMasks.h:1113
bool operator==(const BaseIterator &iter) const
Definition NodeMasks.h:1120
BaseIterator(Index32 pos, const RootNodeMask *parent)
Definition NodeMasks.h:1118
BaseIterator()
Definition NodeMasks.h:1116
Index32 mPos
Definition NodeMasks.h:1112
Index32 pos() const
Definition NodeMasks.h:1132
BaseIterator & operator=(const BaseIterator &iter)
Definition NodeMasks.h:1123
Index32 offset() const
Definition NodeMasks.h:1130
bool operator!=(const BaseIterator &iter) const
Definition NodeMasks.h:1121
BaseIterator(const BaseIterator &)=default
Definition NodeMasks.h:1200
DenseIterator()
Definition NodeMasks.h:1206
DenseIterator & operator++()
Definition NodeMasks.h:1221
DenseIterator(Index32 pos, const RootNodeMask *parent)
Definition NodeMasks.h:1207
bool operator*() const
Definition NodeMasks.h:1220
const RootNodeMask * mParent
Definition NodeMasks.h:1114
Index32 mBitSize
Definition NodeMasks.h:1113
bool next()
Definition NodeMasks.h:1216
Index32 mPos
Definition NodeMasks.h:1112
void increment(Index n)
Definition NodeMasks.h:1213
void increment()
Definition NodeMasks.h:1208
Definition NodeMasks.h:1172
bool operator*() const
Definition NodeMasks.h:1192
const RootNodeMask * mParent
Definition NodeMasks.h:1114
OffIterator()
Definition NodeMasks.h:1178
Index32 mBitSize
Definition NodeMasks.h:1113
OffIterator(Index32 pos, const RootNodeMask *parent)
Definition NodeMasks.h:1179
OffIterator & operator++()
Definition NodeMasks.h:1193
bool next()
Definition NodeMasks.h:1188
Index32 mPos
Definition NodeMasks.h:1112
void increment(Index n)
Definition NodeMasks.h:1185
void increment()
Definition NodeMasks.h:1180
Definition NodeMasks.h:1144
OnIterator()
Definition NodeMasks.h:1150
bool operator*() const
Definition NodeMasks.h:1164
const RootNodeMask * mParent
Definition NodeMasks.h:1114
Index32 mBitSize
Definition NodeMasks.h:1113
bool next()
Definition NodeMasks.h:1160
Index32 mPos
Definition NodeMasks.h:1112
OnIterator(Index32 pos, const RootNodeMask *parent)
Definition NodeMasks.h:1151
OnIterator & operator++()
Definition NodeMasks.h:1165
void increment(Index n)
Definition NodeMasks.h:1157
void increment()
Definition NodeMasks.h:1152
Index32 * mBits
Definition NodeMasks.h:1070
~RootNodeMask()
Definition NodeMasks.h:1084
RootNodeMask()
Definition NodeMasks.h:1073
Index32 countOn() const
Definition NodeMasks.h:1287
Index getBitSize() const
Definition NodeMasks.h:1094
OnIterator beginOn() const
Definition NodeMasks.h:1227
const RootNodeMask & operator&=(const RootNodeMask &other)
Definition NodeMasks.h:1250
RootNodeMask operator&(const RootNodeMask &other) const
Definition NodeMasks.h:1272
void set(Index32 i, bool On)
Definition NodeMasks.h:1308
DenseIterator endDense() const
Definition NodeMasks.h:1232
RootNodeMask operator|(const RootNodeMask &other) const
Definition NodeMasks.h:1275
DenseIterator beginDense() const
Definition NodeMasks.h:1231
OffIterator beginOff() const
Definition NodeMasks.h:1229
void setOn()
Definition NodeMasks.h:1310
bool isOff(Index32 i) const
Definition NodeMasks.h:1336
Index32 countOff() const
Definition NodeMasks.h:1294
void setLastOff()
Definition NodeMasks.h:1330
RootNodeMask(const RootNodeMask &B)
Definition NodeMasks.h:1079
Index32 mBitSize
Definition NodeMasks.h:1069
Index32 findNextOff(Index32 start) const
Definition NodeMasks.h:1413
void setOff(Index32 i)
Definition NodeMasks.h:1302
void seek(std::istream &is) const
Definition NodeMasks.h:1376
void setOn(Index32 i)
Definition NodeMasks.h:1296
Index32 mIntSize
Definition NodeMasks.h:1069
void setFirstOff()
Definition NodeMasks.h:1329
bool isOn(Index32 i) const
Definition NodeMasks.h:1331
Index getIntSize() const
Definition NodeMasks.h:1096
void setFirstOn()
Definition NodeMasks.h:1327
OnIterator endOn() const
Definition NodeMasks.h:1228
void load(std::istream &is)
Definition NodeMasks.h:1372
RootNodeMask operator!() const
Definition NodeMasks.h:1249
void save(std::ostream &os) const
Definition NodeMasks.h:1368
Index32 findFirstOff() const
Definition NodeMasks.h:1361
const RootNodeMask & operator^=(const RootNodeMask &other)
Definition NodeMasks.h:1265
void printBits(std::ostream &os=std::cout, Index32 max_out=80u) const
Definition NodeMasks.h:1385
void setOff()
Definition NodeMasks.h:1314
void init(Index32 bit_size)
Definition NodeMasks.h:1086
Index32 memUsage() const
Definition NodeMasks.h:1424
Index32 getMemUsage() const
Definition NodeMasks.h:1283
bool isOff() const
Definition NodeMasks.h:1348
RootNodeMask & operator=(const RootNodeMask &B)
Definition NodeMasks.h:1098
void toggle(Index32 i)
Definition NodeMasks.h:1318
RootNodeMask operator^(const RootNodeMask &other) const
Definition NodeMasks.h:1278
void toggle()
Definition NodeMasks.h:1323
RootNodeMask(Index32 bit_size)
Definition NodeMasks.h:1074
void printAll(std::ostream &os=std::cout, Index32 max_out=80u) const
Definition NodeMasks.h:1397
void printInfo(std::ostream &os=std::cout) const
simple print method for debugging
Definition NodeMasks.h:1381
const RootNodeMask & operator|=(const RootNodeMask &other)
Definition NodeMasks.h:1258
Index32 findNextOn(Index32 start) const
Definition NodeMasks.h:1402
void setLastOn()
Definition NodeMasks.h:1328
OffIterator endOff() const
Definition NodeMasks.h:1230
bool isOn() const
Definition NodeMasks.h:1342
Index32 findFirstOn() const
Definition NodeMasks.h:1354
Index32 CountOff(Byte v)
Return the number of off bits in the given 8-bit value.
Definition NodeMasks.h:49
Index32 FindHighestOn(Index32 v)
Return the most significant on bit of the given 32-bit value.
Definition NodeMasks.h:159
Index32 FindLowestOn(Byte v)
Return the least significant on bit of the given 8-bit value.
Definition NodeMasks.h:85
Index32 CountOn(Byte v)
Return the number of on bits in the given 8-bit value.
Definition NodeMasks.h:27
Index32 Index
Definition Types.h:54
unsigned char Byte
Definition Types.h:59
uint32_t Index32
Definition Types.h:52
uint64_t Index64
Definition Types.h:53
Definition Exceptions.h:13
#define OPENVDB_VERSION_NAME
The version namespace name for this library version.
Definition version.h.in:121
#define OPENVDB_USE_VERSION_NAMESPACE
Definition version.h.in:218