diff --git a/include/bitlib/bit-containers/bit_array.hpp b/include/bitlib/bit-containers/bit_array.hpp index e1eab6e9..b7c5485d 100644 --- a/include/bitlib/bit-containers/bit_array.hpp +++ b/include/bitlib/bit-containers/bit_array.hpp @@ -80,6 +80,7 @@ class bit_array : public bit_array_base, T, W, detail::bit alignas(static_cast(V)) std::array storage; + friend class bit_array; public: /* * Constructors, copies and moves... diff --git a/include/bitlib/bit-containers/bit_span.hpp b/include/bitlib/bit-containers/bit_span.hpp index 74c8ed2f..69690e13 100644 --- a/include/bitlib/bit-containers/bit_span.hpp +++ b/include/bitlib/bit-containers/bit_span.hpp @@ -13,6 +13,7 @@ #include "bitlib/bit-algorithms/bit_algorithm.hpp" #include "bitlib/bit-containers/bit_bitsof.hpp" #include "bitlib/bit-iterator/bit.hpp" +#include "bitlib/bit_concepts.hpp" namespace bit { @@ -88,6 +89,8 @@ class bit_span : private bit_span_storage { constexpr bit_span(WordType* s) requires(std::is_scalar_v); + constexpr bit_span(bit_range auto& other); + // --- Observers --- // Returns the number of bits in the span. @@ -215,6 +218,16 @@ constexpr bit_span::bit_span(WordType& word_ref) : bit_span(&word_ref) { } +template +constexpr bit_span::bit_span(bit_range auto& other) { + if constexpr (Extent == std::dynamic_extent) { + this->size_ = other.size(); + } else { + assert(other.size() == Extent); + } + this->data_ = &(*other.begin()); +} + // --- Observers --- // Returns the number of bits in the span. diff --git a/include/bitlib/bit-iterator/bit_iterator.hpp b/include/bitlib/bit-iterator/bit_iterator.hpp index 90b4828a..a60903b3 100644 --- a/include/bitlib/bit-iterator/bit_iterator.hpp +++ b/include/bitlib/bit-iterator/bit_iterator.hpp @@ -69,6 +69,7 @@ class bit_iterator public: template constexpr bit_iterator& operator=(const bit_iterator& other); + constexpr bit_iterator& operator=(const bit_iterator& other); // Access public: @@ -167,6 +168,14 @@ constexpr bit_iterator& bit_iterator::operator=( assert(_position < bitsof()); return *this; } +template +constexpr bit_iterator& bit_iterator::operator=( + const bit_iterator& other) { + _current = other._current; + _position = other._position; + assert(_position < bitsof()); + return *this; +} // -------------------------------------------------------------------------- //