34 template <trivial_copyable_type T>
85 template <mpl::iterator_of_type<T> InputIt>
88 template <mpl::iterator_of_type<T> InputIt>
96 template <std::ranges::input_range RANGE>
106 [[nodiscard]]
const arrow_proxy& get_proxy()
const;
109 size_t m_data_buffer_index;
149 template <mpl::iterator_of_type<
bool> InputIt>
152 template <mpl::iterator_of_type<
bool> InputIt>
160 template <std::ranges::input_range RANGE>
175 [[nodiscard]]
size_t get_offset(
size_t i)
const;
177 [[nodiscard]] adaptor_iterator adaptor_begin();
178 [[nodiscard]] adaptor_iterator adaptor_end();
180 [[nodiscard]] const_adaptor_iterator adaptor_cbegin()
const;
181 [[nodiscard]] const_adaptor_iterator adaptor_cend()
const;
184 [[nodiscard]]
const arrow_proxy& get_proxy()
const;
187 [[nodiscard]] bitset_adaptor get_data_adaptor();
189 void update_data_view();
192 size_t m_data_buffer_index;
195 bitset_adaptor m_adaptor;
202 template <trivial_copyable_type T>
205 , m_data_buffer_index(data_buffer_index)
209 template <trivial_copyable_type T>
212 return get_proxy().buffers()[m_data_buffer_index].template
data<T>()
213 +
static_cast<size_t>(get_proxy().offset());
216 template <trivial_copyable_type T>
219 return get_proxy().buffers()[m_data_buffer_index].template
data<T>()
220 +
static_cast<size_t>(get_proxy().offset());
223 template <trivial_copyable_type T>
230 template <trivial_copyable_type T>
237 template <trivial_copyable_type T>
243 template <trivial_copyable_type T>
249 template <trivial_copyable_type T>
255 template <trivial_copyable_type T>
261 template <trivial_copyable_type T>
264 const size_t new_size = new_length +
static_cast<size_t>(get_proxy().offset());
265 get_data_buffer().resize(new_size,
value);
268 template <trivial_copyable_type T>
277 get_data_buffer().insert(pos, count,
value);
282 template <trivial_copyable_type T>
293 template <trivial_copyable_type T>
294 template <mpl::iterator_of_type<T> InputIt>
304 get_data_buffer().insert(pos, first, last);
309 template <trivial_copyable_type T>
310 template <mpl::iterator_of_type<T> InputIt>
320 template <trivial_copyable_type T>
328 const auto distance =
static_cast<size_t>(
331 auto data_buffer = get_data_buffer();
332 const auto first =
sparrow::next(data_buffer.cbegin(), distance);
334 data_buffer.erase(first, last);
339 template <trivial_copyable_type T>
349 template <trivial_copyable_type T>
355 template <trivial_copyable_type T>
356 template <std::ranges::input_range RANGE>
362 template <trivial_copyable_type T>
369 template <trivial_copyable_type T>
372 auto& buffers = get_proxy().get_array_private_data()->buffers();
376 template <trivial_copyable_type T>
377 [[nodiscard]]
arrow_proxy& primitive_data_access<T>::get_proxy()
382 template <trivial_copyable_type T>
383 [[nodiscard]]
const arrow_proxy& primitive_data_access<T>::get_proxy()
const
394 , m_data_buffer_index(data_buffer_index)
395 , m_view(get_data_view())
397 , m_adaptor(get_data_adaptor())
403 return m_view[get_offset(i)];
408 return m_view[get_offset(i)];
428 return m_view.cend();
433 m_adaptor.resize(get_offset(new_length),
value);
442 auto res = m_adaptor.insert(ins_iter, count,
value);
450 auto iter =
sparrow::next(adaptor_cbegin(),
static_cast<difference_type
>(idx));
451 auto res = m_adaptor.insert(iter, count,
value);
457 template <mpl::iterator_of_type<
bool> InputIt>
463 auto res = m_adaptor.insert(ins_iter, first, last);
468 template <mpl::iterator_of_type<
bool> InputIt>
472 auto iter =
sparrow::next(adaptor_cbegin(),
static_cast<difference_type
>(idx));
473 auto res = m_adaptor.insert(iter, first, last);
483 auto res = m_adaptor.erase(iter, iter_end);
492 auto res = m_adaptor.erase(iter, iter_end);
500 m_view = get_data_view();
501 m_adaptor = get_data_adaptor();
504 template <std::ranges::input_range RANGE>
507 auto size =
static_cast<size_t>(std::ranges::distance(r));
510 std::copy(r.begin(), r.end(), v.begin());
520 std::fill(v.begin(), v.end(),
value);
529 std::size_t block_nb = size / 8;
530 if (block_nb * 8 < size)
535 std::uint8_t*
buffer =
reinterpret_cast<std::uint8_t*
>(res.data());
536 bitset_view v(
buffer, size);
541 [[nodiscard]]
inline size_t primitive_data_access<bool>::get_offset(
size_t i)
const
543 return i + get_proxy().offset();
553 return m_adaptor.end();
563 return m_adaptor.cend();
566 [[nodiscard]]
inline arrow_proxy& primitive_data_access<bool>::get_proxy()
571 [[nodiscard]]
inline const arrow_proxy& primitive_data_access<bool>::get_proxy()
const
578 auto& proxy = get_proxy();
579 size_t size = proxy.length() + proxy.offset();
580 return bitset_view(proxy.buffers()[m_data_buffer_index].data(), size);
585 auto& proxy = get_proxy();
586 if (proxy.is_created_with_sparrow())
588 size_t size = proxy.length() + proxy.offset();
589 return bitset_adaptor(&(proxy.get_array_private_data()->buffers()[m_data_buffer_index]), size);
593 return bitset_adaptor(&m_dummy_buffer, 0u);
599 m_view = bitset_view(get_proxy().buffers()[m_data_buffer_index].data(), m_adaptor.size());
Class which has internally a reference to a contiguous container of a certain type and provides an AP...
Object that owns a piece of contiguous memory.
static u8_buffer< bool > make_data_buffer(RANGE &&r)
typename bitset_view::iterator value_iterator
value_iterator value_begin()
inner_value_type * inner_pointer
const_value_iterator value_cend() const
primitive_data_access(arrow_proxy &proxy, size_t data_buffer_index)
constexpr value_iterator insert_values(const_value_iterator pos, InputIt first, InputIt last)
const inner_value_type * inner_const_pointer
primitive_data_access & operator=(primitive_data_access &&)=delete
const_value_iterator value_cbegin() const
inner_reference value(size_t i)
typename bitset_view::const_reference inner_const_reference
typename bitset_view::value_type inner_value_type
typename bitset_view::const_iterator const_value_iterator
dynamic_bitset_view< std::uint8_t > bitset_view
typename bitset_view::reference inner_reference
primitive_data_access(const primitive_data_access &)=delete
primitive_data_access(primitive_data_access &&)=delete
primitive_data_access & operator=(const primitive_data_access &)=delete
constexpr value_iterator insert_values(size_t idx, InputIt first, InputIt last)
Data access class for trivial copyable types.
constexpr void resize_values(size_t new_length, const T &value)
constexpr value_iterator insert_values(size_t idx, InputIt first, InputIt last)
primitive_data_access & operator=(const primitive_data_access &)=delete
constexpr value_iterator erase_values(const_value_iterator pos, size_t count)
constexpr value_iterator erase_values(size_t idx, size_t count)
inner_value_type * inner_pointer
primitive_data_access(primitive_data_access &&)=delete
constexpr inner_const_reference value(size_t i) const
constexpr inner_reference value(size_t i)
const T & inner_const_reference
constexpr value_iterator insert_values(const_value_iterator pos, InputIt first, InputIt last)
constexpr value_iterator value_begin()
static constexpr u8_buffer< T > make_data_buffer(size_t n, const T &value)
constexpr value_iterator value_end()
constexpr const_value_iterator value_cend() const
constexpr void reset_proxy(arrow_proxy &proxy)
constexpr value_iterator insert_value(size_t idx, T value, size_t count)
pointer_iterator< inner_const_pointer > const_value_iterator
primitive_data_access(arrow_proxy &proxy, size_t data_buffer_index)
Constructor for primitive_data_access.
const inner_value_type * inner_const_pointer
static constexpr u8_buffer< T > make_data_buffer(RANGE &&r)
constexpr inner_pointer data()
primitive_data_access & operator=(primitive_data_access &&)=delete
constexpr value_iterator insert_value(const_value_iterator pos, T value, size_t count)
constexpr inner_const_pointer data() const
primitive_data_access(const primitive_data_access &)=delete
pointer_iterator< inner_pointer > value_iterator
constexpr const_value_iterator value_cbegin() const
bitset_reference< self_type > reference
bitset_iterator< self_type, false > iterator
bitset_iterator< self_type, true > const_iterator
typename storage_type_without_cvrefpointer::difference_type difference_type
A non-owning view to a dynamic size sequence of bits stored in external memory.
This buffer class is used as storage buffer for all sparrow arrays.
#define SPARROW_ASSERT_TRUE(expr__)
constexpr std::size_t size(typelist< T... >={})
Gets the count of types contained in a typelist.
constexpr InputIt next(InputIt it, Distance n)
auto make_buffer_adaptor(FromBufferRef &buf)