// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. #ifndef VM_BIT_SET_H_ #define VM_BIT_SET_H_ #include "platform/utils.h" #include "vm/globals.h" namespace dart { // Just like its namesake in the STL, a BitSet object contains a fixed // length sequence of bits. template class BitSet { public: BitSet() { Reset(); } void Set(intptr_t i, bool value) { ASSERT(i >= 0); ASSERT(i < N); uword mask = (static_cast(1) << (i % kBitsPerWord)); if (value) { data_[i / kBitsPerWord] |= mask; } else { data_[i / kBitsPerWord] &= ~mask; } } bool Test(intptr_t i) { ASSERT(i >= 0); ASSERT(i < N); uword mask = (static_cast(1) << (i % kBitsPerWord)); return (data_[i / kBitsPerWord] & mask) != 0; } intptr_t Next(intptr_t i) { ASSERT(i >= 0); ASSERT(i < N); intptr_t w = i / kBitsPerWord; uword mask = ~static_cast(0) << i; if ((data_[w] & mask) != 0) { uword tz = Utils::CountTrailingZeros(data_[w] & mask); return kBitsPerWord*w + tz; } while (++w < (1 + ((N - 1) / kBitsPerWord))) { if (data_[w] != 0) { return kBitsPerWord*w + Utils::CountTrailingZeros(data_[w]); } } return -1; } void Reset() { memset(data_, 0, sizeof(data_)); } intptr_t Size() const { return N; } private: uword data_[1 + ((N - 1) / kBitsPerWord)]; }; } // namespace dart #endif // VM_BIT_SET_H_