Add an internal ASSERT macro
This macro has some advantages over the standard library one:
- It prints the place where the macro was triggered
- It "references" the condition even in Release to avoid warnings
- In release, if possible, it gives compiler hints
It is basically is stripped down version of the ASSERT macros I wrote
for the Daemon engine in src/common/Assert.h
This commit also removes the stray "backend" namespaces for common/
code.
diff --git a/src/common/BitSetIterator.h b/src/common/BitSetIterator.h
index df0702c..94e3abf 100644
--- a/src/common/BitSetIterator.h
+++ b/src/common/BitSetIterator.h
@@ -15,123 +15,118 @@
#ifndef COMMON_BITSETITERATOR_H_
#define COMMON_BITSETITERATOR_H_
+#include "common/Assert.h"
#include "common/Math.h"
-#include <cassert>
#include <bitset>
#include <limits>
-#define ASSERT assert
// This is ANGLE's BitSetIterator class with a customizable return type
// TODO(cwallez@chromium.org): it could be optimized, in particular when N <= 64
-namespace backend {
+template <typename T>
+T roundUp(const T value, const T alignment) {
+ auto temp = value + alignment - static_cast<T>(1);
+ return temp - temp % alignment;
+}
- template <typename T>
- T roundUp(const T value, const T alignment) {
- auto temp = value + alignment - static_cast<T>(1);
- return temp - temp % alignment;
- }
+template <size_t N, typename T>
+class BitSetIterator final {
+ public:
+ BitSetIterator(const std::bitset<N>& bitset);
+ BitSetIterator(const BitSetIterator& other);
+ BitSetIterator &operator=(const BitSetIterator& other);
- template <size_t N, typename T>
- class BitSetIterator final {
- public:
- BitSetIterator(const std::bitset<N>& bitset);
- BitSetIterator(const BitSetIterator& other);
- BitSetIterator &operator=(const BitSetIterator& other);
+ class Iterator final {
+ public:
+ Iterator(const std::bitset<N>& bits);
+ Iterator& operator++();
- class Iterator final {
- public:
- Iterator(const std::bitset<N>& bits);
- Iterator& operator++();
+ bool operator==(const Iterator& other) const;
+ bool operator!=(const Iterator& other) const;
+ T operator*() const { return static_cast<T>(mCurrentBit); }
- bool operator==(const Iterator& other) const;
- bool operator!=(const Iterator& other) const;
- T operator*() const { return static_cast<T>(mCurrentBit); }
+ private:
+ unsigned long getNextBit();
- private:
- unsigned long getNextBit();
+ static const size_t BitsPerWord = sizeof(uint32_t) * 8;
+ std::bitset<N> mBits;
+ unsigned long mCurrentBit;
+ unsigned long mOffset;
+ };
- static const size_t BitsPerWord = sizeof(uint32_t) * 8;
- std::bitset<N> mBits;
- unsigned long mCurrentBit;
- unsigned long mOffset;
- };
+ Iterator begin() const { return Iterator(mBits); }
+ Iterator end() const { return Iterator(std::bitset<N>(0)); }
- Iterator begin() const { return Iterator(mBits); }
- Iterator end() const { return Iterator(std::bitset<N>(0)); }
+ private:
+ const std::bitset<N> mBits;
+};
- private:
- const std::bitset<N> mBits;
- };
+template <size_t N, typename T>
+BitSetIterator<N, T>::BitSetIterator(const std::bitset<N>& bitset)
+ : mBits(bitset) {
+}
- template <size_t N, typename T>
- BitSetIterator<N, T>::BitSetIterator(const std::bitset<N>& bitset)
- : mBits(bitset) {
- }
+template <size_t N, typename T>
+BitSetIterator<N, T>::BitSetIterator(const BitSetIterator& other)
+ : mBits(other.mBits) {
+}
- template <size_t N, typename T>
- BitSetIterator<N, T>::BitSetIterator(const BitSetIterator& other)
- : mBits(other.mBits) {
- }
+template <size_t N, typename T>
+BitSetIterator<N, T>& BitSetIterator<N, T>::operator=(const BitSetIterator& other) {
+ mBits = other.mBits;
+ return *this;
+}
- template <size_t N, typename T>
- BitSetIterator<N, T>& BitSetIterator<N, T>::operator=(const BitSetIterator& other) {
- mBits = other.mBits;
- return *this;
- }
-
- template <size_t N, typename T>
- BitSetIterator<N, T>::Iterator::Iterator(const std::bitset<N>& bits)
- : mBits(bits), mCurrentBit(0), mOffset(0) {
- if (bits.any()) {
- mCurrentBit = getNextBit();
- } else {
- mOffset = static_cast<unsigned long>(roundUp(N, BitsPerWord));
- }
- }
-
- template <size_t N, typename T>
- typename BitSetIterator<N, T>::Iterator& BitSetIterator<N, T>::Iterator::operator++() {
- ASSERT(mBits.any());
- mBits.set(mCurrentBit - mOffset, 0);
+template <size_t N, typename T>
+BitSetIterator<N, T>::Iterator::Iterator(const std::bitset<N>& bits)
+ : mBits(bits), mCurrentBit(0), mOffset(0) {
+ if (bits.any()) {
mCurrentBit = getNextBit();
- return *this;
+ } else {
+ mOffset = static_cast<unsigned long>(roundUp(N, BitsPerWord));
}
+}
- template <size_t N, typename T>
- bool BitSetIterator<N, T>::Iterator::operator==(const Iterator& other) const {
- return mOffset == other.mOffset && mBits == other.mBits;
- }
+template <size_t N, typename T>
+typename BitSetIterator<N, T>::Iterator& BitSetIterator<N, T>::Iterator::operator++() {
+ NXT_ASSERT(mBits.any());
+ mBits.set(mCurrentBit - mOffset, 0);
+ mCurrentBit = getNextBit();
+ return *this;
+}
- template <size_t N, typename T>
- bool BitSetIterator<N, T>::Iterator::operator!=(const Iterator& other) const {
- return !(*this == other);
- }
+template <size_t N, typename T>
+bool BitSetIterator<N, T>::Iterator::operator==(const Iterator& other) const {
+ return mOffset == other.mOffset && mBits == other.mBits;
+}
- template <size_t N, typename T>
- unsigned long BitSetIterator<N, T>::Iterator::getNextBit() {
- static std::bitset<N> wordMask(std::numeric_limits<uint32_t>::max());
+template <size_t N, typename T>
+bool BitSetIterator<N, T>::Iterator::operator!=(const Iterator& other) const {
+ return !(*this == other);
+}
- while (mOffset < N) {
- uint32_t wordBits = (mBits & wordMask).to_ulong();
- if (wordBits != 0ul) {
- return ScanForward(wordBits) + mOffset;
- }
+template <size_t N, typename T>
+unsigned long BitSetIterator<N, T>::Iterator::getNextBit() {
+ static std::bitset<N> wordMask(std::numeric_limits<uint32_t>::max());
- mBits >>= BitsPerWord;
- mOffset += BitsPerWord;
+ while (mOffset < N) {
+ uint32_t wordBits = (mBits & wordMask).to_ulong();
+ if (wordBits != 0ul) {
+ return ScanForward(wordBits) + mOffset;
}
- return 0;
- }
- // Helper to avoid needing to specify the template parameter size
- template <size_t N>
- BitSetIterator<N, uint32_t> IterateBitSet(const std::bitset<N>& bitset) {
- return BitSetIterator<N, uint32_t>(bitset);
+ mBits >>= BitsPerWord;
+ mOffset += BitsPerWord;
}
+ return 0;
+}
+// Helper to avoid needing to specify the template parameter size
+template <size_t N>
+BitSetIterator<N, uint32_t> IterateBitSet(const std::bitset<N>& bitset) {
+ return BitSetIterator<N, uint32_t>(bitset);
}
#endif // COMMON_BITSETITERATOR_H_