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