From fa3d8f677b6a30c2115e7d167d4938e293dfad81 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Sun, 19 Aug 2018 16:27:07 +0200 Subject: Add StaticBitVec type --- chilbert/Hilbert.ipp | 8 ++++ chilbert/StaticBitVec.hpp | 112 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 120 insertions(+) create mode 100644 chilbert/StaticBitVec.hpp (limited to 'chilbert') diff --git a/chilbert/Hilbert.ipp b/chilbert/Hilbert.ipp index 9d23271..726b204 100644 --- a/chilbert/Hilbert.ipp +++ b/chilbert/Hilbert.ipp @@ -27,6 +27,7 @@ #include "chilbert/Hilbert.hpp" #include "chilbert/SetBits.hpp" #include "chilbert/SetLocation.hpp" +#include "chilbert/StaticBitVec.hpp" #include @@ -72,6 +73,13 @@ num_bits(const T& vec, return vec.size(); } +template +size_t +num_bits(const StaticBitVec&, void* = nullptr) +{ + return N; +} + // 'Transforms' a point. template inline void diff --git a/chilbert/StaticBitVec.hpp b/chilbert/StaticBitVec.hpp new file mode 100644 index 0000000..1501746 --- /dev/null +++ b/chilbert/StaticBitVec.hpp @@ -0,0 +1,112 @@ +/* + 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_STATICBITVEC_HPP +#define CHILBERT_STATICBITVEC_HPP + +#include "chilbert/BitVecIndex.hpp" +#include "chilbert/BitVecIterator.hpp" +#include "chilbert/BitVecMask.hpp" +#include "chilbert/MultiBitVec.hpp" +#include "chilbert/Operations.hpp" + +#include +#include +#include +#include +#include +#include +#include + +namespace chilbert { + +template +class StaticBitVec : public MultiBitVec> +{ +public: + using Rack = typename MultiBitVec>::Rack; + + using MultiBitVec>::bits_per_rack; + + StaticBitVec() = default; + + /// Constructor for compatibility with CBigBitVec + explicit StaticBitVec(const size_t bits) + { + assert(bits == size()); + } + + /// Constructor for compatibility with CBigBitVec + StaticBitVec(const size_t bits, const Rack value) + : StaticBitVec{bits} + { + m_racks[0] = value; + } + + /// Return the size in bits + size_t size() const { return N; } + + /// Return a reference to the `index`th rack +#ifndef NDEBUG + const auto& rack(const size_t index) const { return m_racks.at(index); } + auto& rack(const size_t index) { return m_racks.at(index); } +#else + const auto& rack(const size_t index) const { return m_racks[index]; } + auto& rack(const size_t index) { return m_racks[index]; } +#endif + + /// Return a raw pointer to the racks + Rack* data() { return m_racks.data(); } + const Rack* data() const { return m_racks.data(); } + + /// Return the total size of all racks in bytes + static constexpr size_t data_size() { return num_racks() * sizeof(Rack); } + + /// Return the number of racks + static constexpr size_t num_racks() + { + return (std::max(N, size_t(1)) + bits_per_rack - 1) / bits_per_rack; + } + +private: + std::array m_racks{}; +}; + +template +struct is_bitvec> +{ + constexpr static bool value = true; +}; + +template +void +grayCode(StaticBitVec& value) +{ + grayCode(static_cast>&>(value)); +} + +template +void +grayCodeInv(StaticBitVec& value) +{ + grayCodeInv(static_cast>&>(value)); +} + +} // namespace chilbert + +#endif -- cgit v1.2.1