// Copyright 2020 The Dawn Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef DAWNNATIVE_ENUMMASKITERATOR_H_ #define DAWNNATIVE_ENUMMASKITERATOR_H_ #include "common/BitSetIterator.h" #include "dawn_native/EnumClassBitmasks.h" namespace dawn_native { template class EnumMaskIterator final { static constexpr size_t N = EnumBitmaskSize::value; static_assert(N > 0, ""); using U = std::underlying_type_t; public: EnumMaskIterator(const T& mask) : mBitSetIterator(std::bitset(static_cast(mask))) { // If you hit this ASSERT it means that you forgot to update EnumBitmaskSize::value; ASSERT(U(mask) == 0 || Log2(uint64_t(U(mask))) < N); } class Iterator final { public: Iterator(const typename BitSetIterator::Iterator& iter) : mIter(iter) { } Iterator& operator++() { ++mIter; return *this; } bool operator==(const Iterator& other) const { return mIter == other.mIter; } bool operator!=(const Iterator& other) const { return mIter != other.mIter; } T operator*() const { U value = *mIter; return static_cast(U(1) << value); } private: typename BitSetIterator::Iterator mIter; }; Iterator begin() const { return Iterator(mBitSetIterator.begin()); } Iterator end() const { return Iterator(mBitSetIterator.end()); } private: BitSetIterator mBitSetIterator; }; template EnumMaskIterator IterateEnumMask(const T& mask) { return EnumMaskIterator(mask); } } // namespace dawn_native #endif // DAWNNATIVE_ENUMMASKITERATOR_H_