sparrow 1.0.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{
55 template <std::integral T>
56 class dynamic_bitset : public dynamic_bitset_base<buffer<T>>
57 {
58 public:
59
65
85 template <std::ranges::input_range R>
86 requires std::convertible_to<std::ranges::range_value_t<R>, value_type>
87 constexpr explicit dynamic_bitset(const R& r)
88 : dynamic_bitset(std::ranges::size(r), true)
89 {
90 std::size_t i = 0;
91 for (auto value : r)
92 {
93 if (!value)
94 {
95 this->set(i, false);
96 }
97 i++;
98 }
99 }
100
107 constexpr dynamic_bitset();
108
117 constexpr explicit dynamic_bitset(size_type n);
118
129
146
163
164 constexpr ~dynamic_bitset() = default;
165 constexpr dynamic_bitset(const dynamic_bitset&) = default;
166 constexpr dynamic_bitset(dynamic_bitset&&) noexcept = default;
167
168 constexpr dynamic_bitset& operator=(const dynamic_bitset&) = default;
169 constexpr dynamic_bitset& operator=(dynamic_bitset&&) noexcept = default;
170
171 // Inherit container-like operations from base class
172 using base_type::clear;
173 using base_type::emplace;
174 using base_type::erase;
175 using base_type::insert;
176 using base_type::pop_back;
177 using base_type::push_back;
178 using base_type::resize;
179 };
180
181 template <std::integral T>
183 : base_type(storage_type(), 0u)
184 {
186 }
187
188 template <std::integral T>
194
195 template <std::integral T>
197 : base_type(
199 n,
200 value ? 0u : n
201 )
202 {
204 }
205
206 template <std::integral T>
208 : base_type(storage_type(p, p != nullptr ? this->compute_block_count(n) : 0), n)
209 {
211 }
212
213 template <std::integral T>
220
235
236 namespace detail
237 {
239
240 inline validity_bitmap ensure_validity_bitmap_impl(std::size_t size, const validity_bitmap& bitmap)
241 {
242 if (bitmap.size() == 0)
243 {
244 return {size, true};
245 }
246 return bitmap; // copy
247 }
248
250 {
251 if (bitmap.size() == 0)
252 {
253 bitmap.resize(size, true);
254 }
255 return std::move(bitmap);
256 }
257
258 // range of booleans
259 template <std::ranges::input_range R>
260 requires(std::same_as<std::ranges::range_value_t<R>, bool>)
261 validity_bitmap ensure_validity_bitmap_impl(std::size_t size, R&& range)
262 {
263 SPARROW_ASSERT_TRUE(size == range_size(range) || range_size(range) == 0);
264 validity_bitmap bitmap(size, true);
265 std::size_t i = 0;
266 for (auto value : range)
267 {
268 if (!value)
269 {
270 bitmap.set(i, false);
271 }
272 i++;
273 }
274 return bitmap;
275 }
276
277 // range of indices / integers (but not booleans)
278 template <std::ranges::input_range R>
279 requires(
280 std::unsigned_integral<std::ranges::range_value_t<R>>
281 && !std::same_as<std::ranges::range_value_t<R>, bool>
282 && !std::same_as<std::decay_t<R>, validity_bitmap>
283 )
284 validity_bitmap ensure_validity_bitmap_impl(std::size_t size, R&& range_of_indices)
285 {
286 validity_bitmap bitmap(size, true);
287 for (auto index : range_of_indices)
288 {
289 bitmap.set(index, false);
290 }
291 return bitmap;
292 }
293 } // namespace detail
294
308 template <class T>
309 concept validity_bitmap_input = (std::same_as<T, validity_bitmap> || std::same_as<T, const validity_bitmap&>
310 || (std::ranges::input_range<T>
311 && std::same_as<std::ranges::range_value_t<T>, bool>)
312 || (std::ranges::input_range<T>
313 && std::unsigned_integral<std::ranges::range_value_t<T>>) )
314 && (!std::same_as<std::remove_cvref_t<T>, std::string>
315 && !std::same_as<std::remove_cvref_t<T>, std::string_view>
316 && !std::same_as<std::decay_t<T>, const char*>);
317
348 template <validity_bitmap_input R>
349 validity_bitmap ensure_validity_bitmap(std::size_t size, R&& validity_input)
350 {
351 return detail::ensure_validity_bitmap_impl(size, std::forward<R>(validity_input));
352 }
353
354} // namespace sparrow
typename storage_type_without_cvrefpointer::value_type block_type
size_type count_non_null() const noexcept
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)
A dynamic size sequence of bits with efficient storage and manipulation operations.
constexpr dynamic_bitset(const R &r)
Constructs a dynamic_bitset from an input range of convertible values.
constexpr dynamic_bitset(dynamic_bitset &&) noexcept=default
constexpr void clear() noexcept
constexpr dynamic_bitset(size_type n)
Constructs a bitset with n bits, all initialized to false.
constexpr dynamic_bitset(size_type n, value_type v)
Constructs a bitset with n bits, all initialized to the specified value.
constexpr void resize(size_type n, value_type b=false)
typename base_type::block_type block_type
Type of each storage block (same as T)
constexpr dynamic_bitset(const dynamic_bitset &)=default
constexpr dynamic_bitset()
Default constructor.
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)
Constructs a bitset using existing memory with null count tracking.
dynamic_bitset_base< buffer< T > > base_type
Base class type.
typename base_type::storage_type storage_type
Underlying storage container type.
constexpr dynamic_bitset(block_type *p, size_type n)
Constructs a bitset using existing memory.
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
Type of individual bit values (bool)
typename base_type::size_type size_type
Type used for sizes and indices.
constexpr ~dynamic_bitset()=default
Concept defining valid input types for validity bitmap creation.
#define SPARROW_ASSERT_TRUE(expr__)
sparrow::validity_bitmap validity_bitmap
validity_bitmap ensure_validity_bitmap_impl(std::size_t size, const validity_bitmap &bitmap)
constexpr std::size_t range_size(R &&r)
Definition ranges.hpp:32
dynamic_bitset< std::uint8_t > validity_bitmap
Type alias for a validity bitmap using 8-bit storage blocks.
validity_bitmap ensure_validity_bitmap(std::size_t size, R &&validity_input)
Ensures a validity bitmap of the specified size from various input types.