diff options
Diffstat (limited to 'chilbert/detail/BitVecIterator.hpp')
-rw-r--r-- | chilbert/detail/BitVecIterator.hpp | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/chilbert/detail/BitVecIterator.hpp b/chilbert/detail/BitVecIterator.hpp new file mode 100644 index 0000000..8902747 --- /dev/null +++ b/chilbert/detail/BitVecIterator.hpp @@ -0,0 +1,100 @@ +/* + Copyright (C) 2018 David Robillard <d@drobilla.net> + Copyright (C) 2006-2007 Chris Hamilton <chamilton@cs.dal.ca> + + This program is free software: you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free Software + Foundation, either version 2 of the License, or (at your option) any later + version. + + This program is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + details. + + You should have received a copy of the GNU General Public License along with + this program. If not, see <https://www.gnu.org/licenses/>. +*/ + +#ifndef CHILBERT_BITVECITERATOR_HPP +#define CHILBERT_BITVECITERATOR_HPP + +#include "chilbert/detail/BitVecMask.hpp" + +#include <cstddef> + +namespace chilbert { +namespace detail { + +template <class BitVec> +class BitVecIteratorBase : public BitVecMask<typename BitVec::Rack> +{ +public: + using Mask = typename BitVec::Mask; + + BitVecIteratorBase& operator++() + { + Mask::operator++(); + return *this; + } + + BitVecIteratorBase& operator--() + { + Mask::operator--(); + return *this; + } + + bool operator==(const BitVecIteratorBase& rhs) const + { + return m_vec == rhs.m_vec && Mask::operator==(rhs); + } + + bool operator!=(const BitVecIteratorBase& rhs) const + { + return !operator==(rhs); + } + + bool operator*() const { return m_vec->test(*this); } + +protected: + BitVecIteratorBase(BitVec& vec, const size_t index) + : Mask{index} + , m_vec{&vec} + { + } + + BitVec* m_vec; +}; + +template <class BitVec> +class BitVecIterator : public BitVecIteratorBase<BitVec> +{ +public: + void set() { this->m_vec->set(*this); } + void reset() { this->m_vec->reset(*this); } + +private: + friend BitVec; + + BitVecIterator(BitVec& vec, const size_t index) + : BitVecIteratorBase<BitVec>{vec, index} + { + } +}; + +template <class BitVec> +class ConstBitVecIterator : public BitVecIteratorBase<const BitVec> +{ +private: + friend BitVec; + + ConstBitVecIterator(const BitVec& vec, const size_t index) + : BitVecIteratorBase<const BitVec>{vec, index} + { + } +}; + +} // namespace detail +} // namespace chilbert + +#endif |