43 template <std::ranges::sized_range T,
class CR>
49 fixed_width_binary_traits::value_type,
50 fixed_width_binary_traits::const_reference>;
52 template <std::ranges::sized_range T,
class CR>
83 struct get_data_type_from_array;
95 template <std::ranges::sized_range T,
class CR>
102 sizeof(std::ranges::range_value_t<T>) ==
sizeof(
byte_t),
103 "Only sequences of types with the same size as byte_t are supported"
145 template <
class... ARGS>
148 :
base_type(create_proxy(std::forward<ARGS>(args)...))
153 using base_type::get_arrow_proxy;
154 using base_type::size;
177 size_t element_count,
180 std::optional<std::string_view> name = std::nullopt,
181 std::optional<METADATA_RANGE> metadata = std::nullopt
184 template <input_metadata_container METADATA_RANGE = std::vector<metadata_pair>>
188 std::optional<std::string_view> name = std::nullopt,
189 std::optional<METADATA_RANGE> metadata = std::nullopt
203 std::ranges::input_range VALUES,
207 std::ranges::input_range<std::ranges::range_value_t<VALUES>> &&
216 std::optional<std::string_view> name = std::nullopt,
217 std::optional<METADATA_RANGE> metadata = std::nullopt
231 std::ranges::input_range VALUES,
234 std::ranges::input_range<std::ranges::range_value_t<VALUES>> &&
243 std::optional<std::string_view> name = std::nullopt,
244 std::optional<METADATA_RANGE> metadata = std::nullopt
256 template <std::ranges::input_range NULLABLE_VALUES, input_metadata_container METADATA_RANGE = std::vector<metadata_pair>>
258 && std::ranges::input_range<typename std::ranges::range_value_t<NULLABLE_VALUES>::value_type>
260 std::ranges::range_value_t<typename std::ranges::range_value_t<NULLABLE_VALUES>::value_type>,
264 std::optional<std::string_view> name = std::nullopt,
265 std::optional<METADATA_RANGE> metadata = std::nullopt
268 template <mpl::
char_like C, input_metadata_container METADATA_RANGE = std::vector<metadata_pair>>
269 [[nodiscard]]
static arrow_proxy create_proxy_impl(
271 size_t element_count,
273 std::optional<validity_bitmap>&& validity_input,
274 std::optional<std::string_view> name = std::nullopt,
275 std::optional<METADATA_RANGE> metadata = std::nullopt
278 static constexpr size_t DATA_BUFFER_INDEX = 1;
282 [[nodiscard]] value_iterator value_begin();
283 [[nodiscard]] value_iterator value_end();
292 template <std::ranges::sized_range U>
294 void resize_values(size_type new_length, U
value);
296 template <std::ranges::sized_range U>
300 template <
typename InputIt>
301 requires std::input_iterator<InputIt>
307 template <std::ranges::sized_range U>
309 void assign(U&& rhs, size_type index);
311 size_t m_element_size = 0;
324 template <std::ranges::sized_range T,
class CR>
332 template <std::ranges::sized_range T,
class CR>
333 template <mpl::
char_like C, val
idity_bitmap_input VB, input_metadata_container METADATA_RANGE>
334 arrow_proxy fixed_width_binary_array_impl<T, CR>::create_proxy(
336 size_t element_count,
339 std::optional<std::string_view> name,
340 std::optional<METADATA_RANGE> metadata
344 return create_proxy_impl(
345 std::move(data_buffer),
354 template <std::ranges::sized_range T,
class CR>
355 template <input_metadata_container METADATA_RANGE>
356 arrow_proxy fixed_width_binary_array_impl<T, CR>::create_proxy(
359 std::optional<std::string_view> name,
360 std::optional<METADATA_RANGE> metadata
363 u8_buffer<char> data_buffer{};
364 std::optional<validity_bitmap> bitmap =
nullable ? std::make_optional<validity_bitmap>(
nullptr, 0)
366 return create_proxy_impl(
367 std::move(data_buffer),
376 template <std::ranges::sized_range T,
class CR>
377 template <std::ranges::input_range R, val
idity_bitmap_input VB, input_metadata_container METADATA_RANGE>
379 std::ranges::input_range<std::ranges::range_value_t<R>> &&
386 std::optional<std::string_view> name,
387 std::optional<METADATA_RANGE> metadata
390 using values_type = std::ranges::range_value_t<R>;
391 using values_inner_value_type = std::ranges::range_value_t<values_type>;
394 const size_t element_size = std::ranges::empty(values) ? 0 : std::ranges::size(*values.begin());
398 std::move(data_buffer),
401 std::forward<VB>(validity_input),
402 std::forward<std::optional<std::string_view>>(name),
403 std::forward<std::optional<METADATA_RANGE>>(metadata)
407 template <std::ranges::sized_range T,
class CR>
408 template <std::ranges::input_range R, input_metadata_container METADATA_RANGE>
410 std::ranges::input_range<std::ranges::range_value_t<R>> &&
417 std::optional<std::string_view> name,
418 std::optional<METADATA_RANGE> metadata
423 return create_proxy(std::forward<R>(values),
validity_bitmap{}, std::move(name), std::move(metadata));
427 using values_type = std::ranges::range_value_t<R>;
428 using values_inner_value_type = std::ranges::range_value_t<values_type>;
431 const size_t element_size = std::ranges::empty(values) ? 0 : std::ranges::size(*values.begin());
433 return create_proxy_impl(
434 std::move(data_buffer),
444 template <std::ranges::sized_range T,
class CR>
445 template <std::ranges::input_range NULLABLE_RANGE, input_metadata_container METADATA_RANGE>
447 && std::ranges::input_range<typename std::ranges::range_value_t<NULLABLE_RANGE>::value_type>
449 std::ranges::range_value_t<typename std::ranges::range_value_t<NULLABLE_RANGE>::value_type>,
452 NULLABLE_RANGE&& range,
453 std::optional<std::string_view> name,
454 std::optional<METADATA_RANGE> metadata
458 const auto values = range
459 | std::views::transform(
465 const auto is_non_null = range
466 | std::views::transform(
469 return v.has_value();
472 return self_type::create_proxy(values, is_non_null, std::move(name), std::move(metadata));
475 template <std::ranges::sized_range T,
class CR>
476 template <mpl::
char_like C, input_metadata_container METADATA_RANGE>
477 arrow_proxy fixed_width_binary_array_impl<T, CR>::create_proxy_impl(
479 size_t element_count,
481 std::optional<validity_bitmap>&& bitmap,
482 std::optional<std::string_view> name,
483 std::optional<METADATA_RANGE> metadata
487 element_size == 0 ? (data_buffer.size() == 0) : (data_buffer.size() % element_size == 0)
490 const auto null_count = bitmap.has_value() ? bitmap->null_count() : 0;
491 std::string format_str =
"w:" + std::to_string(element_size);
492 const std::optional<std::unordered_set<ArrowFlag>>
493 flags = bitmap.has_value()
498 std::move(format_str),
503 repeat_view<bool>(
true, 0),
508 std::vector<buffer<std::uint8_t>> arr_buffs = {
509 bitmap.has_value() ? std::move(*bitmap).extract_storage() : buffer<std::uint8_t>{
nullptr, 0},
510 std::move(data_buffer).extract_storage()
514 static_cast<std::int64_t
>(element_count),
515 static_cast<int64_t
>(null_count),
517 std::move(arr_buffs),
523 return arrow_proxy{std::move(arr), std::move(schema)};
526 template <std::ranges::sized_range T,
class CR>
527 auto fixed_width_binary_array_impl<T, CR>::data(size_type i) -> data_iterator
529 const arrow_proxy& proxy = this->get_arrow_proxy();
530 auto data_buffer = proxy.buffers()[DATA_BUFFER_INDEX];
531 const size_t data_buffer_size = data_buffer.size();
532 const size_type index_offset = (
static_cast<size_type
>(proxy.offset()) * m_element_size) + i;
534 return data_buffer.template data<data_value_type>() + index_offset;
537 template <std::ranges::sized_range T,
class CR>
538 auto fixed_width_binary_array_impl<T, CR>::data(size_type i)
const -> const_data_iterator
540 const arrow_proxy& proxy = this->get_arrow_proxy();
541 const auto data_buffer = proxy.buffers()[DATA_BUFFER_INDEX];
542 const size_t data_buffer_size = data_buffer.size();
543 const size_type index_offset = (
static_cast<size_type
>(proxy.offset()) * m_element_size) + i;
545 return data_buffer.template data<const data_value_type>() + index_offset;
548 template <std::ranges::sized_range T,
class CR>
549 template <std::ranges::sized_range U>
551 void fixed_width_binary_array_impl<T, CR>::assign(U&& rhs, size_type index)
555 std::copy(std::ranges::begin(rhs), std::ranges::end(rhs), data(index * m_element_size));
558 template <std::ranges::sized_range T,
class CR>
565 template <std::ranges::sized_range T,
class CR>
569 const auto offset_begin = i * m_element_size;
570 const auto offset_end = offset_begin + m_element_size;
576 template <std::ranges::sized_range T,
class CR>
577 auto fixed_width_binary_array_impl<T, CR>::value_begin() -> value_iterator
579 return value_iterator{functor_type{&(this->derived_cast())}, 0};
582 template <std::ranges::sized_range T,
class CR>
583 auto fixed_width_binary_array_impl<T, CR>::value_end() -> value_iterator
588 template <std::ranges::sized_range T,
class CR>
589 auto fixed_width_binary_array_impl<T, CR>::value_cbegin() const -> const_value_iterator
591 return const_value_iterator{const_functor_type{&(this->derived_cast())}, 0};
594 template <std::ranges::sized_range T,
class CR>
595 auto fixed_width_binary_array_impl<T, CR>::value_cend() const -> const_value_iterator
600 template <std::ranges::sized_range T,
class CR>
601 template <std::ranges::sized_range U>
603 void fixed_width_binary_array_impl<T, CR>::resize_values(size_type new_length, U value)
606 if (new_length <
size())
609 const size_t new_size = new_length +
static_cast<size_t>(proxy.offset());
610 const auto offset = new_size * m_element_size;
611 auto& data_buffer = proxy.get_array_private_data()->buffers()[DATA_BUFFER_INDEX];
612 data_buffer.resize(offset);
614 else if (new_length >
size())
616 insert_value(value_cend(), value, new_length -
size());
620 template <std::ranges::sized_range T,
class CR>
621 template <std::ranges::sized_range U>
627 const auto idx =
static_cast<size_t>(std::distance(value_cbegin(), pos));
629 const uint8_t* uint8_ptr =
reinterpret_cast<const uint8_t*
>(
value.data());
630 const std::vector<uint8_t> casted_value(uint8_ptr, uint8_ptr +
value.size());
632 const auto joined_repeated_value_range = std::ranges::views::join(my_repeat_view);
635 const auto offset_begin = (idx + proxy.
offset()) * m_element_size;
636 const auto pos_to_insert =
sparrow::next(data_buffer.cbegin(), offset_begin);
637 data_buffer.insert(pos_to_insert, joined_repeated_value_range.begin(), joined_repeated_value_range.end());
641 template <std::ranges::sized_range T,
class CR>
642 template <
typename InputIt>
643 requires std::input_iterator<InputIt>
655 auto values = std::ranges::subrange(first, last);
656 const size_t cumulative_sizes = values.size() * m_element_size;
657 auto& data_buffer = get_arrow_proxy().get_array_private_data()->buffers()[DATA_BUFFER_INDEX];
658 data_buffer.resize(data_buffer.size() + cumulative_sizes);
659 const auto idx =
static_cast<size_t>(std::distance(value_cbegin(), pos));
660 std::span<byte_t> casted_values{
reinterpret_cast<byte_t*
>(data_buffer.data()), data_buffer.size()};
661 const auto offset_begin = m_element_size * (idx + get_arrow_proxy().offset());
662 auto insert_pos =
sparrow::next(casted_values.begin(), offset_begin);
671 for (
const auto& val : values)
673 std::copy(val.begin(), val.end(), insert_pos);
674 std::advance(insert_pos, m_element_size);
679 template <std::ranges::sized_range T,
class CR>
680 auto fixed_width_binary_array_impl<T, CR>::erase_values(const_value_iterator pos, size_type count)
685 const size_t index =
static_cast<size_t>(std::distance(value_cbegin(), pos));
690 auto& data_buffer = get_arrow_proxy().get_array_private_data()->buffers()[DATA_BUFFER_INDEX];
691 const size_type byte_count = m_element_size * count;
692 const auto offset_begin = m_element_size * (index +
static_cast<size_type
>(get_arrow_proxy().offset()));
693 const auto offset_end = offset_begin + byte_count;
696 data_buffer.begin() +
static_cast<difference_type
>(offset_end),
698 data_buffer.begin() +
static_cast<difference_type
>(offset_begin)
700 data_buffer.resize(data_buffer.size() - byte_count);
typename base_type::const_bitmap_range const_bitmap_range
typename base_type::iterator_tag iterator_tag
std::conditional_t< is_mutable, mutable_array_base< D >, array_crtp_base< D > > base_type
typename base_type::bitmap_const_reference bitmap_const_reference
typename base_type::bitmap_type bitmap_type
typename base_type::difference_type difference_type
constexpr BufferType & buffers() noexcept
Proxy class over ArrowArray and ArrowSchema.
SPARROW_API size_t offset() const
SPARROW_API arrow_array_private_data * get_array_private_data()
bitset_iterator< self_type, true > const_iterator
typename inner_types::data_value_type data_value_type
fixed_width_binary_array_impl< T, fixed_width_binary_traits::const_reference > self_type
typename inner_types::const_functor_type const_functor_type
array_inner_types< self_type > inner_types
inner_reference value(size_type i)
nullable< inner_reference, bitmap_reference > reference
typename inner_types::value_iterator value_iterator
typename base_type::size_type size_type
typename base_type::difference_type difference_type
typename inner_types::inner_value_type inner_value_type
typename base_type::const_bitmap_range const_bitmap_range
mutable_array_bitmap_base< self_type > base_type
fixed_width_binary_array_impl(arrow_proxy)
nullable< inner_value_type > value_type
fixed_width_binary_array_impl(ARGS &&... args)
Constructs a fixed-width binary array.
inner_const_reference value(size_type i) const
nullable< inner_const_reference, bitmap_const_reference > const_reference
typename inner_types::data_iterator data_iterator
typename inner_types::inner_const_reference inner_const_reference
typename inner_types::const_value_iterator const_value_iterator
typename base_type::iterator_tag iterator_tag
typename inner_types::inner_reference inner_reference
typename base_type::bitmap_const_reference bitmap_const_reference
typename base_type::bitmap_type bitmap_type
typename inner_types::functor_type functor_type
typename inner_types::const_data_iterator const_data_iterator
typename base_type::bitmap_reference bitmap_reference
Implementation of reference to inner type used for layout L.
The nullable class models a value or a reference that can be "null", or missing, like values traditio...
A view that repeats a value a given number of times.
This buffer class is use as storage buffer for all sparrow arrays.
Matches range types From whose elements are convertible to elements of range type To.
#define SPARROW_ASSERT_TRUE(expr__)
constexpr std::size_t size(typelist< T... >={})
constexpr bool excludes_copy_and_move_ctor_v
constexpr bool is_type_instance_of_v
true if T is a concrete type template instanciation of U which is a type template.
array_bitmap_base_impl< D, true > mutable_array_bitmap_base
Convenient typedef to be used as a crtp base class for arrays using a mutable validity buffer.
ArrowSchema make_arrow_schema(F format, N name, std::optional< M > metadata, std::optional< std::unordered_set< ArrowFlag > > flags, ArrowSchema **children, const CHILDREN_OWNERSHIP &children_ownership, ArrowSchema *dictionary, bool dictionary_ownership)
Creates an ArrowSchema owned by a unique_ptr and holding the provided data.
constexpr bool all_same_size(const Range &range)
arrow_traits< std::vector< byte_t > > fixed_width_binary_traits
constexpr InputIt next(InputIt it, Distance n)
fixed_width_binary_array_impl< fixed_width_binary_traits::value_type, fixed_width_binary_traits::const_reference > fixed_width_binary_array
ArrowArray make_arrow_array(int64_t length, int64_t null_count, int64_t offset, B buffers, ArrowArray **children, const CHILDREN_OWNERSHIP &children_ownership, ArrowArray *dictionary, bool dictionary_ownership)
Creates an ArrowArray.
dynamic_bitset< std::uint8_t > validity_bitmap
SPARROW_API std::size_t num_bytes_for_fixed_sized_binary(std::string_view format)
Get the number of bytes for a fixed width binary layout from the ArrowArray format string.
validity_bitmap ensure_validity_bitmap(std::size_t size, R &&validity_input)
data_type
Runtime identifier of arrow data types, usually associated with raw bytes with the associated value.
fixed_width_binary_array_impl< T, CR > array_type
functor_index_iterator< const_functor_type > const_iterator
detail::layout_value_functor< array_type, inner_reference > functor_type
detail::layout_value_functor< const array_type, inner_const_reference > const_functor_type
functor_index_iterator< functor_type > iterator
const_iterator const_value_iterator
data_value_type * data_iterator
std::reverse_iterator< const_iterator > const_reverse_iterator
bitmap_type::const_iterator const_bitmap_iterator
std::random_access_iterator_tag iterator_tag
const data_value_type * const_data_iterator
fixed_width_binary_reference< array_type > inner_reference
typename T::value_type data_value_type
Base class for array_inner_types specialization.
Traits class that must be specialized by array classes inheriting from array_crtp_base.
Provides compile-time information about Arrow data types.
static constexpr sparrow::data_type get()