// Copyright 2018-2022 David Robillard // Copyright 2006-2007 Chris Hamilton // SPDX-License-Identifier: GPL-2.0-or-later #ifndef CHILBERT_DETAIL_BITVECITERATOR_HPP #define CHILBERT_DETAIL_BITVECITERATOR_HPP #include "chilbert/detail/BitVecMask.hpp" #include namespace chilbert { namespace detail { template class BitVecIteratorBase { public: using Mask = typename BitVec::Mask; BitVecIteratorBase& operator++() { ++m_mask; return *this; } BitVecIteratorBase& operator--() { --m_mask; return *this; } bool operator==(const BitVecIteratorBase& rhs) const { return m_vec == rhs.m_vec && m_mask == rhs.m_mask; } bool operator!=(const BitVecIteratorBase& rhs) const { return !operator==(rhs); } bool operator*() const { return m_vec->test(m_mask); } protected: BitVecIteratorBase(BitVec& vec, const size_t index) : m_vec{&vec} , m_mask{index} {} BitVec* m_vec; BitVecMask m_mask; }; template class BitVecIterator : public BitVecIteratorBase { public: void set() { this->m_vec->set(this->m_mask); } void reset() { this->m_vec->reset(this->m_mask); } private: friend BitVec; BitVecIterator(BitVec& vec, const size_t index) : BitVecIteratorBase{vec, index} {} }; template class ConstBitVecIterator : public BitVecIteratorBase { private: friend BitVec; ConstBitVecIterator(const BitVec& vec, const size_t index) : BitVecIteratorBase{vec, index} {} }; } // namespace detail } // namespace chilbert #endif