From 131fc7924fe5d30c4605aa158ef5564352a0f626 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Sun, 19 Aug 2018 09:50:54 +0200 Subject: Factor out bit vector iterators --- chilbert/BitVecIterator.hpp | 98 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 chilbert/BitVecIterator.hpp (limited to 'chilbert/BitVecIterator.hpp') diff --git a/chilbert/BitVecIterator.hpp b/chilbert/BitVecIterator.hpp new file mode 100644 index 0000000..bbafd42 --- /dev/null +++ b/chilbert/BitVecIterator.hpp @@ -0,0 +1,98 @@ +/* + Copyright (C) 2018 David Robillard + Copyright (C) 2006-2007 Chris Hamilton + + 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 . +*/ + +#ifndef CHILBERT_BITVECITERATOR_HPP +#define CHILBERT_BITVECITERATOR_HPP + +#include "chilbert/BitVecMask.hpp" + +#include + +namespace chilbert { + +template +class BitVecIteratorBase : public BitVecMask +{ +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 BitVecIterator : public BitVecIteratorBase +{ +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{vec, index} + { + } +}; + +template +class ConstBitVecIterator : public BitVecIteratorBase +{ +private: + friend BitVec; + + ConstBitVecIterator(const BitVec& vec, const size_t index) + : BitVecIteratorBase{vec, index} + { + } +}; + +} // namespace chilbert + +#endif -- cgit v1.2.1