sparrow 0.3.0
Loading...
Searching...
No Matches
dynamic_bitset.hpp
Go to the documentation of this file.
1// Copyright 2024 Man Group Operations Limited
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15#pragma once
16
17#include <type_traits>
18
22
23namespace sparrow
24{
32 template <std::integral T>
33 class dynamic_bitset : public dynamic_bitset_base<buffer<T>>
34 {
35 public:
36
42
43 template <std::ranges::input_range R>
44 requires std::convertible_to<std::ranges::range_value_t<R>, value_type>
45 explicit dynamic_bitset(const R& r)
46 : dynamic_bitset(std::ranges::size(r), true)
47 {
48 std::size_t i = 0;
49 for (auto value : r)
50 {
51 if (!value)
52 {
53 this->set(i, false);
54 }
55 i++;
56 }
57 }
58
59 constexpr dynamic_bitset();
60 constexpr explicit dynamic_bitset(size_type n);
64
65 constexpr ~dynamic_bitset() = default;
66 constexpr dynamic_bitset(const dynamic_bitset&) = default;
67 constexpr dynamic_bitset(dynamic_bitset&&) noexcept = default;
68
69 constexpr dynamic_bitset& operator=(const dynamic_bitset&) = default;
70 constexpr dynamic_bitset& operator=(dynamic_bitset&&) noexcept = default;
71
72 using base_type::clear;
73 using base_type::emplace;
74 using base_type::erase;
75 using base_type::insert;
76 using base_type::pop_back;
77 using base_type::push_back;
78 using base_type::resize;
79 };
80
81 template <std::integral T>
83 : base_type(storage_type(), 0u)
84 {
85 }
86
87 template <std::integral T>
89 : dynamic_bitset(n, false)
90 {
91 }
92
93 template <std::integral T>
95 : base_type(
97 n,
98 value ? 0u : n
99 )
100 {
101 }
102
103 template <std::integral T>
108
109 template <std::integral T>
114
116
117 namespace detail
118 {
120
121 inline validity_bitmap ensure_validity_bitmap_impl(std::size_t size, const validity_bitmap& bitmap)
122 {
123 if (bitmap.size() == 0)
124 {
125 return validity_bitmap(size, true);
126 }
127 return bitmap; // copy
128 }
129
131 {
132 if (bitmap.size() == 0)
133 {
134 bitmap.resize(size, true);
135 }
136 return std::move(bitmap);
137 }
138
139 // range of booleans
140 template <std::ranges::input_range R>
141 requires(std::same_as<std::ranges::range_value_t<R>, bool>)
142 validity_bitmap ensure_validity_bitmap_impl(std::size_t size, R&& range)
143 {
144 SPARROW_ASSERT_TRUE(size == range_size(range) || range_size(range) == 0);
145 validity_bitmap bitmap(size, true);
146 std::size_t i = 0;
147 for (auto value : range)
148 {
149 if (!value)
150 {
151 bitmap.set(i, false);
152 }
153 i++;
154 }
155 return bitmap;
156 }
157
158 // range of indices / integers (but not booleans)
159 template <std::ranges::input_range R>
160 requires(std::unsigned_integral<std::ranges::range_value_t<R>> && !std::same_as<std::ranges::range_value_t<R>, bool> && !std::same_as<std::decay_t<R>, validity_bitmap>)
161 validity_bitmap ensure_validity_bitmap_impl(std::size_t size, R&& range_of_indices)
162 {
163 validity_bitmap bitmap(size, true);
164 for (auto index : range_of_indices)
165 {
166 bitmap.set(index, false);
167 }
168 return bitmap;
169 }
170 } // namespace detail
171
172 template <class T>
173 concept validity_bitmap_input = (std::same_as<T, validity_bitmap> || std::same_as<T, const validity_bitmap&>
174 || (std::ranges::input_range<T>
175 && std::same_as<std::ranges::range_value_t<T>, bool>)
176 || (std::ranges::input_range<T>
177 && std::unsigned_integral<std::ranges::range_value_t<T>>) )
178 && (!std::same_as<std::remove_cvref_t<T>, std::string>
179 && !std::same_as<std::remove_cvref_t<T>, std::string_view>
180 && !std::same_as<std::decay_t<T>, const char*>);
181
182 template <validity_bitmap_input R>
183 validity_bitmap ensure_validity_bitmap(std::size_t size, R&& validity_input)
184 {
185 return detail::ensure_validity_bitmap_impl(size, std::forward<R>(validity_input));
186 }
187
188} // namespace sparrow
typename storage_type_without_cvrefpointer::value_type block_type
typename storage_type_without_cvrefpointer::size_type size_type
constexpr size_type null_count() const noexcept
static constexpr size_type compute_block_count(size_type bits_count) noexcept
constexpr size_type size() const noexcept
constexpr void set(size_type pos, value_type value)
constexpr dynamic_bitset_base(storage_type buffer, size_type size)
This class represents a dynamic size sequence of bits.
constexpr dynamic_bitset(dynamic_bitset &&) noexcept=default
constexpr void clear() noexcept
constexpr dynamic_bitset(size_type n)
constexpr dynamic_bitset(size_type n, value_type v)
constexpr void resize(size_type n, value_type b=false)
typename base_type::block_type block_type
constexpr dynamic_bitset(const dynamic_bitset &)=default
constexpr void push_back(value_type value)
constexpr iterator erase(const_iterator pos)
constexpr dynamic_bitset(block_type *p, size_type n, size_type null_count)
dynamic_bitset_base< buffer< T > > base_type
typename base_type::storage_type storage_type
constexpr dynamic_bitset(block_type *p, size_type n)
constexpr iterator insert(const_iterator pos, value_type value)
constexpr iterator emplace(const_iterator pos, value_type value)
typename base_type::value_type value_type
typename base_type::size_type size_type
constexpr ~dynamic_bitset()=default
#define SPARROW_ASSERT_TRUE(expr__)
sparrow::validity_bitmap validity_bitmap
validity_bitmap ensure_validity_bitmap_impl(std::size_t size, const validity_bitmap &bitmap)
dynamic_bitset< std::uint8_t > validity_bitmap
validity_bitmap ensure_validity_bitmap(std::size_t size, R &&validity_input)
std::size_t range_size(R &&r)
Definition ranges.hpp:31