52template <
size_t bit_capacity = 58>
70 bitfield data{0u, 0u};
73 class reference_proxy_type
79 constexpr reference_proxy_type() noexcept = default;
80 constexpr reference_proxy_type(reference_proxy_type const &) noexcept = default;
81 constexpr reference_proxy_type(reference_proxy_type &&) noexcept = default;
84 constexpr reference_proxy_type & operator=(reference_proxy_type const rhs) noexcept
91 constexpr reference_proxy_type &
operator=(
bool const value)
noexcept
97 ~reference_proxy_type() noexcept = default;
102 constexpr reference_proxy_type(bitfield & internal_,
size_t const pos) noexcept :
103 internal{internal_}, mask{1ULL<<pos}
107 constexpr operator bool() const noexcept
109 return static_cast<bool>(
internal.bits & mask);
113 constexpr bool operator~() const noexcept
115 return !
static_cast<bool>(
internal.bits & mask);
119 constexpr reference_proxy_type &
operator|=(
bool const value)
128 constexpr reference_proxy_type &
operator&=(
bool const value)
137 constexpr reference_proxy_type &
operator^=(
bool const value)
139 operator bool() && value ?
reset() :
set();
150 constexpr void set() noexcept
152 internal.bits |= mask;
156 constexpr void reset() noexcept
158 internal.bits &= ~mask;
163 static_assert(bit_capacity <= 58,
"The capacity of the dynamic_bitset exceeds the limit of 58.");
190 using iterator = detail::random_access_iterator<dynamic_bitset>;
213 using allocator_type = void;
273 template <std::forward_iterator begin_it_type,
typename end_it_type>
275 requires std::sentinel_for<end_it_type, begin_it_type> &&
276 std::constructible_from<value_type, std::iter_reference_t<begin_it_type>>
301 template <std::ranges::input_range other_range_t>
303 requires (!std::same_as<std::remove_cvref_t<other_range_t>,
dynamic_bitset>)
306 dynamic_bitset{std::ranges::begin(range), std::ranges::end(range)}
348 assign(std::ranges::begin(ilist), std::ranges::end(ilist));
378 static_assert(N <= bit_capacity + 1,
"Length of string literal exceeds capacity of dynamic_bitset.");
404 static_assert(N <= bit_capacity + 1,
"Length of string literal exceeds capacity of dynamic_bitset.");
429 constexpr void assign(
char const (&lit)[N])
431 static_assert(N <= bit_capacity + 1,
"Length of string literal exceeds capacity of dynamic_bitset.");
432 assert(lit[N - 1] ==
'\0');
435 for (
size_t i = 0; i != N - 1; ++i)
441 else if (lit[i] ==
'1')
448 throw std::invalid_argument{
"The string to construct a dynamic_bitset from may only contain 0 and 1."};
473 assign(std::ranges::begin(ilist), std::ranges::end(ilist));
496 assign(std::ranges::begin(tmp), std::ranges::end(tmp));
516 template <std::ranges::input_range other_range_t>
518 requires std::constructible_from<value_type, std::ranges::range_reference_t<other_range_t>>
520 constexpr void assign(other_range_t && range)
noexcept
522 assign(std::ranges::begin(range), std::ranges::end(range));
544 template <std::forward_iterator begin_it_type,
typename end_it_type>
546 requires std::sentinel_for<end_it_type, begin_it_type> &&
547 std::constructible_from<value_type, std::iter_reference_t<begin_it_type>>
549 constexpr void assign(begin_it_type begin_it, end_it_type end_it)
noexcept
642 assert(
size() == rhs.size());
643 data.bits &= rhs.data.bits;
672 assert(
size() == rhs.size());
673 data.bits |= rhs.data.bits;
702 assert(
size() == rhs.size());
703 data.bits ^= rhs.data.bits;
762 data.bits &= (1ULL <<
size()) - 1ULL;
873 data.bits |= (1ULL <<
size()) - 1ULL;
981 data.bits = ~data.bits;
982 data.bits &= (1ULL <<
size()) - 1ULL;
1022 constexpr bool all() const noexcept
1032 constexpr bool any() const noexcept
1034 return count() != 0;
1042 constexpr bool none() const noexcept
1044 return count() == 0;
1129 return data.bits & 1ULL << i;
1183 return (*
this)[
size() - 1];
1190 return (*
this)[
size() - 1];
1294 return bit_capacity;
1363 return insert(pos, 1, value);
1389 return insert(pos, std::ranges::begin(tmp), std::ranges::end(tmp));
1416 template <std::forward_iterator begin_it_type,
typename end_it_type>
1418 requires std::sentinel_for<end_it_type, begin_it_type> &&
1419 std::constructible_from<value_type, std::iter_reference_t<begin_it_type>>
1423 auto const pos_as_num = std::ranges::distance(
cbegin(), pos);
1424 auto const length = std::ranges::distance(begin_it, end_it);
1430 resize(tmp_size + length);
1432 for (
size_type i = tmp_size + length - 1; i > pos_as_num + length - 1; --i)
1433 (*
this)[i] = (*this)[i - length];
1436 for (
auto i = pos_as_num; begin_it != end_it; ++i, ++begin_it)
1437 (*
this)[i] = *begin_it;
1439 return begin() + pos_as_num;
1463 return insert(pos, ilist.begin(), ilist.end());
1491 if (begin_it >= end_it)
1492 return begin() + std::ranges::distance(
cbegin(), end_it);
1494 auto const length = std::ranges::distance(begin_it, end_it);
1495 auto out_it =
begin() + std::ranges::distance(
cbegin(), begin_it);
1497 while (end_it !=
cend())
1498 *(out_it++) = *(end_it++);
1501 return begin() + std::ranges::distance(
cbegin(), begin_it);
1528 return erase(pos, pos + 1);
1550 assert(
size() < bit_capacity);
1552 (*this)[
size() - 1] = value;
1607 assert(
count <= bit_capacity);
1613 data.bits &= (1ULL <<
size()) - 1ULL;
1633 bitfield tmp = std::move(data);
1634 data = std::move(rhs.data);
1635 rhs.data = std::move(tmp);
1641 data = std::move(rhs.data);
1680 template <
size_t cap>
1682 requires (cap <= bit_capacity)
1702 template <
size_t cap>
1704 requires (cap <= bit_capacity)
1724 template <
size_t cap>
1726 requires (cap <= bit_capacity)
1744 template <
size_t cap>
1747 return lhs.data.size == rhs.
raw_data()->size && lhs.data.bits == rhs.
raw_data()->bits;
1754 template <
size_t cap>
1757 return !(lhs == rhs);
1764 template <
size_t cap>
1767 return lhs.data.bits < rhs.
raw_data()->bits;
1774 template <
size_t cap>
1777 return lhs.data.bits > rhs.
raw_data()->bits;
1784 template <
size_t cap>
1787 return !(lhs > rhs);
1794 template <
size_t cap>
1797 return !(lhs < rhs);
1826 template <
typename char_t =
char>
1831 for (
bool const bit : std::views::reverse(*
this))
1832 bit ? str.push_back(one) : str.push_back(zero);
1858 throw std::overflow_error{
"seqan3::dynamic_bitset cannot be represented as unsigned long."};
1861 return static_cast<unsigned long>(data.bits);
1885 throw std::overflow_error{
"seqan3::dynamic_bitset cannot be represented as unsigned long long."};
1888 return static_cast<unsigned long long>(data.bits);
1935 assert(num_char > 0);
1941 c == is.
widen(
'0') ? tmp.push_back(
false) : tmp.push_back(
true);
1944 arg.
assign(std::views::reverse(tmp));
1946 if (arg.
size() == 0)
1947 is.
setstate(std::ios_base::failbit);
1965 template <
typename char_t>
1985 template <cereal_archive archive_t>
1986 void CEREAL_SERIALIZE_FUNCTION_NAME(archive_t & archive)
1988 uint64_t
size = data.size;
1991 uint64_t bits = data.bits;
2009template <
size_t cap>
2021 return static_cast<size_t>(arg.to_ullong());
The <bit> header from C++20's standard library.
Adaptions of concepts from the Cereal library.
A "pretty printer" for most SeqAn data structures and related types.
Definition: debug_stream_type.hpp:78
A constexpr bitset implementation with dynamic size at compile time.
Definition: dynamic_bitset.hpp:54
constexpr dynamic_bitset operator<<(size_t const count) const noexcept
Performs binary shift left.
Definition: dynamic_bitset.hpp:843
friend class dynamic_bitset
Befriend other template instantiations of dynamic_bitset.
Definition: dynamic_bitset.hpp:58
constexpr iterator insert(const_iterator pos, value_type const value) noexcept
Inserts value before pos in the container.
Definition: dynamic_bitset.hpp:1361
constexpr size_type size() const noexcept
Returns the number of elements in the container, i.e. std::distance(begin(), end()).
Definition: dynamic_bitset.hpp:1247
constexpr iterator insert(const_iterator pos, std::initializer_list< value_type > const &ilist) noexcept
Inserts elements from initializer list before pos in the container.
Definition: dynamic_bitset.hpp:1461
constexpr dynamic_bitset & operator<<=(size_t const count) noexcept
Performs binary shift left on the current object.
Definition: dynamic_bitset.hpp:757
constexpr bool any() const noexcept
Checks if any bit is set.
Definition: dynamic_bitset.hpp:1032
constexpr void resize(size_type const count, value_type const value=false) noexcept
Resizes the container to contain count elements.
Definition: dynamic_bitset.hpp:1605
constexpr dynamic_bitset(other_range_t &&range) noexcept
Construct from a different range.
Definition: dynamic_bitset.hpp:305
constexpr const_reference test(size_t const i) const
Returns the i-th element.
Definition: dynamic_bitset.hpp:1091
constexpr iterator insert(const_iterator pos, begin_it_type begin_it, end_it_type end_it) noexcept
Inserts elements from range [begin_it, end_it) before pos in the container.
Definition: dynamic_bitset.hpp:1421
constexpr reference back() noexcept
Returns the last element.
Definition: dynamic_bitset.hpp:1180
friend std::istream & operator>>(std::istream &is, dynamic_bitset &arg)
Formatted input for the seqan3::dynamic_bitset.
Definition: dynamic_bitset.hpp:1925
constexpr void clear() noexcept
Removes all elements from the container.
Definition: dynamic_bitset.hpp:1336
constexpr size_type count() const noexcept
Returns the number of set bits.
Definition: dynamic_bitset.hpp:1051
constexpr reference front() noexcept
Returns the first element.
Definition: dynamic_bitset.hpp:1150
constexpr bool empty() const noexcept
Checks whether the container is empty.
Definition: dynamic_bitset.hpp:1227
constexpr dynamic_bitset & operator=(dynamic_bitset const &) noexcept=default
Defaulted.
constexpr friend bool operator>=(dynamic_bitset const &lhs, dynamic_bitset< cap > const &rhs) noexcept
Performs element-wise comparison.
Definition: dynamic_bitset.hpp:1795
constexpr size_type max_size() const noexcept
Returns the maximum number of elements the container is able to hold and resolves to bit_capacity.
Definition: dynamic_bitset.hpp:1272
constexpr friend bool operator<=(dynamic_bitset const &lhs, dynamic_bitset< cap > const &rhs) noexcept
Performs element-wise comparison.
Definition: dynamic_bitset.hpp:1785
constexpr void shrink_to_fit() const noexcept
Since the capacity is fixed on compile time, this is a no-op.
Definition: dynamic_bitset.hpp:1310
constexpr dynamic_bitset & operator&=(dynamic_bitset const &rhs) noexcept
Sets the bits to the result of binary AND on corresponding pairs of bits of *this and rhs.
Definition: dynamic_bitset.hpp:640
constexpr bool all() const noexcept
Checks if all bit are set.
Definition: dynamic_bitset.hpp:1022
constexpr dynamic_bitset & flip() noexcept
Flips all bits (binary NOT).
Definition: dynamic_bitset.hpp:979
reference_proxy_type reference
A proxy type that enables assignment.
Definition: dynamic_bitset.hpp:178
constexpr void assign(char const (&lit)[N])
Assign from literal.
Definition: dynamic_bitset.hpp:429
constexpr const_iterator begin() const noexcept
Returns the begin to the dynamic_bitset.
Definition: dynamic_bitset.hpp:575
constexpr unsigned long to_ulong() const
Converts the dynamic_bitset to an unsigned long integer.
Definition: dynamic_bitset.hpp:1853
constexpr void swap(dynamic_bitset &rhs) noexcept
Swap contents with another instance.
Definition: dynamic_bitset.hpp:1631
constexpr void swap(dynamic_bitset &&rhs) noexcept
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition: dynamic_bitset.hpp:1639
constexpr dynamic_bitset(char const (&lit)[N])
Construction from literal.
Definition: dynamic_bitset.hpp:376
constexpr reference at(size_t const i)
Returns the i-th element.
Definition: dynamic_bitset.hpp:1073
constexpr friend bool operator!=(dynamic_bitset const &lhs, dynamic_bitset< cap > const &rhs) noexcept
Performs element-wise comparison.
Definition: dynamic_bitset.hpp:1755
constexpr dynamic_bitset & operator=(std::initializer_list< value_type > const ilist) noexcept
Assign from std::initializer_list.
Definition: dynamic_bitset.hpp:346
constexpr dynamic_bitset & reset(size_t const i)
Sets the i'th bit to false.
Definition: dynamic_bitset.hpp:954
constexpr iterator erase(const_iterator pos) noexcept
Removes specified elements from the container.
Definition: dynamic_bitset.hpp:1526
constexpr size_type capacity() const noexcept
Returns the number of elements that the container is able to hold and resolves to bit_capacity.
Definition: dynamic_bitset.hpp:1292
constexpr bitfield const * raw_data() const noexcept
Direct access to the underlying bit field.
Definition: dynamic_bitset.hpp:1203
constexpr void push_back(value_type const value) noexcept
Appends the given element value to the end of the container.
Definition: dynamic_bitset.hpp:1548
constexpr friend bool operator<(dynamic_bitset const &lhs, dynamic_bitset< cap > const &rhs) noexcept
Performs element-wise comparison.
Definition: dynamic_bitset.hpp:1765
constexpr const_iterator cbegin() const noexcept
Returns the begin to the dynamic_bitset.
Definition: dynamic_bitset.hpp:581
constexpr dynamic_bitset operator>>(size_t const count) const noexcept
Performs binary shift right.
Definition: dynamic_bitset.hpp:814
constexpr const_reference operator[](size_t const i) const noexcept
Returns the i-th element.
Definition: dynamic_bitset.hpp:1126
constexpr unsigned long long to_ullong() const
Converts the dynamic_bitset to an unsigned long long integer.
Definition: dynamic_bitset.hpp:1880
constexpr const_reference back() const noexcept
Returns the last element.
Definition: dynamic_bitset.hpp:1187
constexpr dynamic_bitset & set() noexcept
Sets all bits to 1.
Definition: dynamic_bitset.hpp:871
constexpr bitfield * raw_data() noexcept
Direct access to the underlying bit field.
Definition: dynamic_bitset.hpp:1197
friend std::ostream & operator<<(std::ostream &os, dynamic_bitset const &arg)
Formatted output for the seqan3::dynamic_bitset.
Definition: dynamic_bitset.hpp:1906
constexpr friend void swap(dynamic_bitset &lhs, dynamic_bitset &rhs) noexcept
Swap contents with another instance.
Definition: dynamic_bitset.hpp:1662
constexpr iterator end() noexcept
Returns iterator past the end of the dynamic_bitset.
Definition: dynamic_bitset.hpp:596
constexpr void pop_back() noexcept
Removes the last element of the container.
Definition: dynamic_bitset.hpp:1573
constexpr const_reference at(size_t const i) const
Returns the i-th element.
Definition: dynamic_bitset.hpp:1082
constexpr dynamic_bitset(begin_it_type begin_it, end_it_type end_it) noexcept
Construct from two iterators.
Definition: dynamic_bitset.hpp:278
constexpr iterator begin() noexcept
Returns the begin to the dynamic_bitset.
Definition: dynamic_bitset.hpp:569
constexpr void assign(std::initializer_list< value_type > const ilist) noexcept
Assign from std::initializer_list.
Definition: dynamic_bitset.hpp:471
constexpr dynamic_bitset & set(size_t const i, bool const value=true)
Sets the i'th bit to value.
Definition: dynamic_bitset.hpp:899
constexpr dynamic_bitset & reset() noexcept
Sets all bits to 0.
Definition: dynamic_bitset.hpp:927
constexpr const_iterator cend() const noexcept
Returns iterator past the end of the dynamic_bitset.
Definition: dynamic_bitset.hpp:608
constexpr bool none() const noexcept
Checks if no bit is set.
Definition: dynamic_bitset.hpp:1042
constexpr dynamic_bitset operator~() const noexcept
Returns a temporary copy of *this with all bits flipped (binary NOT).
Definition: dynamic_bitset.hpp:730
bool const_reference
Equals the value_type.
Definition: dynamic_bitset.hpp:184
constexpr const_iterator end() const noexcept
Returns iterator past the end of the dynamic_bitset.
Definition: dynamic_bitset.hpp:602
constexpr dynamic_bitset & operator=(char const (&lit)[N])
Assign from literal.
Definition: dynamic_bitset.hpp:402
constexpr void assign(other_range_t &&range) noexcept
Assign from a different range.
Definition: dynamic_bitset.hpp:520
constexpr friend bool operator==(dynamic_bitset const &lhs, dynamic_bitset< cap > const &rhs) noexcept
Performs element-wise comparison.
Definition: dynamic_bitset.hpp:1745
constexpr void assign(size_type const count, value_type const value) noexcept
Assign with count times value.
Definition: dynamic_bitset.hpp:492
ptrdiff_t difference_type
A std::ptrdiff_t.
Definition: dynamic_bitset.hpp:202
constexpr dynamic_bitset() noexcept=default
Defaulted.
constexpr const_reference front() const noexcept
Returns the first element.
Definition: dynamic_bitset.hpp:1157
std::string to_string(char_t zero=char_t{ '0'}, char_t one=char_t{ '1'}) const
Converts the dynamic_bitset to a std::string.
Definition: dynamic_bitset.hpp:1827
constexpr dynamic_bitset & operator^=(dynamic_bitset const &rhs) noexcept
Sets the bits to the result of binary XOR on corresponding pairs of bits of *this and rhs.
Definition: dynamic_bitset.hpp:700
constexpr iterator erase(const_iterator begin_it, const_iterator end_it) noexcept
Removes specified elements from the container.
Definition: dynamic_bitset.hpp:1489
constexpr void assign(begin_it_type begin_it, end_it_type end_it) noexcept
Assign from pair of iterators.
Definition: dynamic_bitset.hpp:549
friend debug_stream_type< char_t > & operator<<(debug_stream_type< char_t > &s, dynamic_bitset arg)
Formatted debug output for the seqan3::dynamic_bitset.
Definition: dynamic_bitset.hpp:1966
constexpr void reserve(size_t) const noexcept
Since the capacity is fixed on compile time, this is a no-op.
Definition: dynamic_bitset.hpp:1301
constexpr dynamic_bitset & operator>>=(size_t const count) noexcept
Performs binary shift right on the current object.
Definition: dynamic_bitset.hpp:786
constexpr dynamic_bitset & operator|=(dynamic_bitset const &rhs) noexcept
Sets the bits to the result of binary OR on corresponding pairs of bits of *this and rhs.
Definition: dynamic_bitset.hpp:670
detail::random_access_iterator< dynamic_bitset > iterator
The iterator type of this container (a random access iterator).
Definition: dynamic_bitset.hpp:190
constexpr dynamic_bitset(size_type const n, value_type const value) noexcept
Construct with n times value.
Definition: dynamic_bitset.hpp:325
constexpr iterator insert(const_iterator pos, size_type const count, value_type const value) noexcept
Inserts count copies of value before position in the container.
Definition: dynamic_bitset.hpp:1386
bool value_type
Equals bool.
Definition: dynamic_bitset.hpp:172
detail::random_access_iterator< dynamic_bitset const > const_iterator
The const_iterator type of this container (a random access iterator).
Definition: dynamic_bitset.hpp:196
constexpr reference operator[](size_t const i) noexcept
Returns the i-th element.
Definition: dynamic_bitset.hpp:1119
constexpr dynamic_bitset & flip(size_t const i)
Flips the i'th bit (binary NOT).
Definition: dynamic_bitset.hpp:1007
constexpr friend bool operator>(dynamic_bitset const &lhs, dynamic_bitset< cap > const &rhs) noexcept
Performs element-wise comparison.
Definition: dynamic_bitset.hpp:1775
Provides seqan3::debug_stream and related types.
constexpr int popcount(T x) noexcept
Returns the number of 1 bits in the value of x.
Definition: bit:245
constexpr T bit_width(T x) noexcept
If x is not zero, calculates the number of bits needed to store the value x, that is,...
Definition: bit:183
constexpr auto repeat_n
A view factory that repeats a given value n times.
Definition: repeat_n.hpp:91
constexpr auto interleave
A view that interleaves a given range into another range at regular intervals.
Definition: interleave.hpp:380
Provides metaprogramming utilities for integer types.
Provides seqan3::views::interleave.
The main SeqAn3 namespace.
Definition: cigar_operation_table.hpp:2
SeqAn specific customisations in the standard namespace.
Provides seqan3::views::repeat_n.
size_t operator()(seqan3::dynamic_bitset< cap > const arg) const noexcept
Compute the hash for a seqan3::dynamic_bitset.
Definition: dynamic_bitset.hpp:2019
Provides seqan3::views::to.