sparrow 2.3.0
C++20 idiomatic APIs for the Apache Arrow Columnar Format
Loading...
Searching...
No Matches
timestamp_array.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
28#include "sparrow/u8_buffer.hpp"
34
35// tts : timestamp<std::chrono::seconds>
36// tsm : timestamp<std::chrono::milliseconds>
37// tsu : timestamp<std::chrono::microseconds>
38// tsn : timestamp<std::chrono::nanoseconds>
39
40namespace sparrow
41{
42 template <timestamp_type T>
43 class timestamp_array;
44
45 namespace copy_tracker
46 {
47 template <typename T>
49 std::string key()
50 {
51 return "timestamp_array";
52 }
53 }
54
55 template <timestamp_type T>
71
77 template <typename T>
78 struct is_timestamp_array : std::false_type
79 {
80 };
81
87 template <typename T>
88 struct is_timestamp_array<timestamp_array<T>> : std::true_type
89 {
90 };
91
97 template <typename T>
99
107
115
116 namespace detail
117 {
118 template <>
120 {
121 [[nodiscard]] static constexpr sparrow::data_type get()
122 {
124 }
125 };
126
127 template <>
129 {
130 [[nodiscard]] static constexpr sparrow::data_type get()
131 {
133 }
134 };
135
136 template <>
138 {
139 [[nodiscard]] static constexpr sparrow::data_type get()
140 {
142 }
143 };
144
145 template <>
147 {
148 [[nodiscard]] static constexpr sparrow::data_type get()
149 {
151 }
152 };
153 }
154
207 template <timestamp_type T>
208 class timestamp_array final : public mutable_array_bitmap_base<timestamp_array<T>>
209 {
210 public:
211
214
216 using inner_value_type = typename inner_types::inner_value_type;
217 using inner_reference = typename inner_types::inner_reference;
218 using inner_const_reference = typename inner_types::inner_const_reference;
219
221 using bitmap_reference = typename base_type::bitmap_reference;
225 using bitmap_range = typename base_type::bitmap_range;
227
231
235
236 using value_iterator = typename base_type::value_iterator;
237 using const_value_iterator = typename base_type::const_value_iterator;
238
239 using iterator = typename base_type::iterator;
240 using const_iterator = typename base_type::const_iterator;
241
242 using functor_type = typename inner_types::functor_type;
243 using const_functor_type = typename inner_types::const_functor_type;
244
245 using inner_value_type_duration = inner_value_type::duration;
246 using buffer_inner_value_type = inner_value_type_duration::rep;
249
263
303 template <class... Args>
305 constexpr explicit timestamp_array(Args&&... args)
306 : base_type(create_proxy(std::forward<Args>(args)...))
307 , m_timezone(get_timezone(this->get_arrow_proxy()))
308 , m_data_access(this->get_arrow_proxy(), DATA_BUFFER_INDEX)
309 {
310 }
311
326 template <input_metadata_container METADATA_RANGE = std::vector<metadata_pair>>
328 const date::time_zone* timezone,
329 std::initializer_list<inner_value_type> init,
330 std::optional<std::string_view> name = std::nullopt,
331 std::optional<METADATA_RANGE> metadata = std::nullopt
332 )
333 : base_type(create_proxy(timezone, init, std::move(name), std::move(metadata)))
334 , m_timezone(timezone)
335 , m_data_access(this->get_arrow_proxy(), DATA_BUFFER_INDEX)
336 {
337 }
338
349 constexpr timestamp_array(const timestamp_array& rhs);
350
363
373 constexpr timestamp_array(timestamp_array&& rhs) noexcept;
374
385 constexpr timestamp_array& operator=(timestamp_array&& rhs) noexcept;
386
387 private:
388
400 [[nodiscard]] constexpr inner_reference value(size_type i);
401
414 [[nodiscard]] constexpr inner_const_reference value(size_type i) const;
415
423 [[nodiscard]] constexpr value_iterator value_begin();
424
432 [[nodiscard]] constexpr value_iterator value_end();
433
441 [[nodiscard]] constexpr const_value_iterator value_cbegin() const;
442
450 [[nodiscard]] constexpr const_value_iterator value_cend() const;
451
453
490 template <input_metadata_container METADATA_RANGE>
491 [[nodiscard]] static arrow_proxy create_proxy(
492 const date::time_zone* timezone,
493 size_type n,
494 std::optional<std::string_view> name = std::nullopt,
495 std::optional<METADATA_RANGE> metadata = std::nullopt
496 );
497
498 //
526 template <
528 input_metadata_container METADATA_RANGE = std::vector<metadata_pair>>
529 [[nodiscard]] static auto create_proxy(
530 const date::time_zone* timezone,
533 std::optional<std::string_view> name = std::nullopt,
534 std::optional<METADATA_RANGE> metadata = std::nullopt
535 ) -> arrow_proxy;
536
565 template <std::ranges::input_range R, input_metadata_container METADATA_RANGE = std::vector<metadata_pair>>
566 requires std::convertible_to<std::ranges::range_value_t<R>, T>
567 [[nodiscard]] static auto create_proxy(
568 const date::time_zone* timezone,
569 R&& range,
570 bool nullable = true,
571 std::optional<std::string_view> name = std::nullopt,
572 std::optional<METADATA_RANGE> metadata = std::nullopt
573 ) -> arrow_proxy;
574
575
601 template <typename U, input_metadata_container METADATA_RANGE = std::vector<metadata_pair>>
602 requires std::convertible_to<U, T>
603 [[nodiscard]] static arrow_proxy create_proxy(
604 const date::time_zone* timezone,
605 size_type n,
606 const U& value = U{},
607 std::optional<std::string_view> name = std::nullopt,
608 std::optional<METADATA_RANGE> metadata = std::nullopt
609 );
610
641 template <
642 std::ranges::input_range VALUE_RANGE,
643 validity_bitmap_input VALIDITY_RANGE,
644 input_metadata_container METADATA_RANGE = std::vector<metadata_pair>>
645 requires(std::convertible_to<std::ranges::range_value_t<VALUE_RANGE>, T>)
646 [[nodiscard]] static arrow_proxy create_proxy(
647 const date::time_zone* timezone,
648 VALUE_RANGE&&,
649 VALIDITY_RANGE&&,
650 std::optional<std::string_view> name = std::nullopt,
651 std::optional<METADATA_RANGE> metadata = std::nullopt
652 );
653
682 template <std::ranges::input_range R, input_metadata_container METADATA_RANGE = std::vector<metadata_pair>>
683 requires std::is_same_v<std::ranges::range_value_t<R>, nullable<T>>
684 [[nodiscard]] static arrow_proxy create_proxy(
685 const date::time_zone* timezone,
686 R&&,
687 std::optional<std::string_view> name = std::nullopt,
688 std::optional<METADATA_RANGE> metadata = std::nullopt
689 );
690
732 template <input_metadata_container METADATA_RANGE = std::vector<metadata_pair>>
733 [[nodiscard]] static arrow_proxy create_proxy_impl(
734 const date::time_zone* timezone,
735 u8_buffer<buffer_inner_value_type>&& data_buffer,
736 std::optional<validity_bitmap>&& bitmap,
737 std::optional<std::string_view> name = std::nullopt,
738 std::optional<METADATA_RANGE> metadata = std::nullopt
739 );
740
742
743 // Modifiers
744
756 constexpr void resize_values(size_type new_length, inner_value_type value);
757
772 constexpr value_iterator
773 insert_value(const_value_iterator pos, inner_value_type value, size_type count);
774
792 template <mpl::iterator_of_type<typename timestamp_array<T>::inner_value_type> InputIt>
793 constexpr auto insert_values(const_value_iterator pos, InputIt first, InputIt last) -> value_iterator
794 {
795 const auto input_range = std::ranges::subrange(first, last);
796 const auto values = input_range | std::views::transform(extract_duration);
797 const size_t idx = static_cast<size_t>(std::distance(value_cbegin(), pos));
798 m_data_access.insert_values(idx, values.begin(), values.end());
799 return sparrow::next(value_begin(), idx);
800 }
801
817 constexpr value_iterator erase_values(const_value_iterator pos, size_type count);
818
832 constexpr void assign(const T& rhs, size_type index);
833
847 constexpr void assign(T&& rhs, size_type index);
848
855 [[nodiscard]] static constexpr auto extract_duration(const inner_value_type& timestamp)
857 {
858 return timestamp.get_sys_time().time_since_epoch();
859 }
860
861 const date::time_zone* m_timezone;
862 details::primitive_data_access<inner_value_type_duration> m_data_access;
863
864 static constexpr size_type DATA_BUFFER_INDEX = 1;
865 friend class timestamp_reference<self_type>;
866 friend base_type;
869 friend functor_type;
870 friend const_functor_type;
871 };
872
873 template <timestamp_type T>
875 : base_type(rhs)
876 , m_timezone(rhs.m_timezone)
877 , m_data_access(this->get_arrow_proxy(), DATA_BUFFER_INDEX)
878 {
880 }
881
882 template <timestamp_type T>
884 {
887 m_timezone = rhs.m_timezone;
888 m_data_access.reset_proxy(this->get_arrow_proxy());
889 return *this;
890 }
891
892 template <timestamp_type T>
894 : base_type(std::move(rhs))
895 , m_timezone(rhs.m_timezone)
896 , m_data_access(this->get_arrow_proxy(), DATA_BUFFER_INDEX)
897 {
898 }
899
900 template <timestamp_type T>
902 {
903 base_type::operator=(std::move(rhs));
904 m_timezone = rhs.m_timezone;
905 m_data_access.reset_proxy(this->get_arrow_proxy());
906 return *this;
907 }
908
909 template <timestamp_type T>
911 : base_type(std::move(proxy))
912 , m_timezone(get_timezone(this->get_arrow_proxy()))
913 , m_data_access(this->get_arrow_proxy(), DATA_BUFFER_INDEX)
914 {
915 }
916
917 template <timestamp_type T>
918 template <validity_bitmap_input R, input_metadata_container METADATA_RANGE>
919 auto timestamp_array<T>::create_proxy(
920 const date::time_zone* timezone,
922 R&& bitmap_input,
923 std::optional<std::string_view> name,
924 std::optional<METADATA_RANGE> metadata
925 ) -> arrow_proxy
926 {
927 const auto size = data_buffer.size();
928 validity_bitmap bitmap = ensure_validity_bitmap(size, std::forward<R>(bitmap_input));
929 return create_proxy_impl(
930 timezone,
931 std::forward<u8_buffer<buffer_inner_value_type>>(data_buffer),
932 std::move(bitmap),
933 std::move(name),
934 std::move(metadata)
935 );
936 }
937
938 template <timestamp_type T>
939 template <std::ranges::input_range VALUE_RANGE, validity_bitmap_input VALIDITY_RANGE, input_metadata_container METADATA_RANGE>
940 requires(std::convertible_to<std::ranges::range_value_t<VALUE_RANGE>, T>)
941 arrow_proxy timestamp_array<T>::create_proxy(
942 const date::time_zone* timezone,
943 VALUE_RANGE&& values,
944 VALIDITY_RANGE&& validity_input,
945 std::optional<std::string_view> name,
946 std::optional<METADATA_RANGE> metadata
947 )
948 {
949 constexpr auto extract_duration_count = [](const auto& v)
950 {
951 return v.get_sys_time().time_since_epoch().count();
952 };
953
954 const auto range = values | std::views::transform(extract_duration_count);
955
956 u8_buffer<buffer_inner_value_type> data_buffer(range);
957 return create_proxy(
958 timezone,
959 std::move(data_buffer),
960 std::forward<VALIDITY_RANGE>(validity_input),
961 std::move(name),
962 std::move(metadata)
963 );
964 }
965
966 template <timestamp_type T>
967 template <typename U, input_metadata_container METADATA_RANGE>
968 requires std::convertible_to<U, T>
969 arrow_proxy timestamp_array<T>::create_proxy(
970 const date::time_zone* timezone,
971 size_type n,
972 const U& value,
973 std::optional<std::string_view> name,
974 std::optional<METADATA_RANGE> metadata
975 )
976 {
977 // Extract duration count from the timestamp value
978 const auto duration_count = value.get_sys_time().time_since_epoch().count();
979 u8_buffer<buffer_inner_value_type> data_buffer(n, duration_count);
980 return create_proxy(timezone, std::move(data_buffer), std::move(name), std::move(metadata));
981 }
982
983 template <timestamp_type T>
984 template <std::ranges::input_range R, input_metadata_container METADATA_RANGE>
985 requires std::convertible_to<std::ranges::range_value_t<R>, T>
986 arrow_proxy timestamp_array<T>::create_proxy(
987 const date::time_zone* timezone,
988 R&& range,
989 bool nullable,
990 std::optional<std::string_view> name,
991 std::optional<METADATA_RANGE> metadata
992 )
993 {
994 constexpr auto extract_duration_count = [](const auto& v)
995 {
996 return v.get_sys_time().time_since_epoch().count();
997 };
998
999 std::optional<validity_bitmap> bitmap = nullable ? std::make_optional<validity_bitmap>(
1000 nullptr,
1001 0,
1003 )
1004 : std::nullopt;
1005 const auto values = range | std::views::transform(extract_duration_count);
1006 u8_buffer<buffer_inner_value_type> data_buffer(values);
1007 return self_type::create_proxy_impl(
1008 timezone,
1009 std::move(data_buffer),
1010 std::move(bitmap),
1011 std::move(name),
1012 std::move(metadata)
1013 );
1014 }
1015
1016 // range of nullable values
1017 template <timestamp_type T>
1018 template <std::ranges::input_range R, input_metadata_container METADATA_RANGE>
1019 requires std::is_same_v<std::ranges::range_value_t<R>, nullable<T>>
1020 arrow_proxy timestamp_array<T>::create_proxy(
1021 const date::time_zone* timezone,
1022 R&& range,
1023 std::optional<std::string_view> name,
1024 std::optional<METADATA_RANGE> metadata
1025 )
1026 { // split into values and is_non_null ranges
1027 auto values = range
1028 | std::views::transform(
1029 [](const auto& v)
1030 {
1031 return v.get();
1032 }
1033 );
1034 auto is_non_null = range
1035 | std::views::transform(
1036 [](const auto& v)
1037 {
1038 return v.has_value();
1039 }
1040 );
1041 return self_type::create_proxy(timezone, values, is_non_null, std::move(name), std::move(metadata));
1042 }
1043
1044 template <timestamp_type T>
1045 template <input_metadata_container METADATA_RANGE>
1046 arrow_proxy timestamp_array<T>::create_proxy_impl(
1047 const date::time_zone* timezone,
1049 std::optional<validity_bitmap>&& bitmap,
1050 std::optional<std::string_view> name,
1051 std::optional<METADATA_RANGE> metadata
1052 )
1053 {
1054 const auto size = data_buffer.size();
1055 const auto null_count = bitmap.has_value() ? bitmap->null_count() : 0;
1056
1058 format += timezone->name();
1059
1061
1062 const std::optional<std::unordered_set<sparrow::ArrowFlag>>
1063 flags = bitmap.has_value()
1064 ? std::make_optional<std::unordered_set<sparrow::ArrowFlag>>({ArrowFlag::NULLABLE})
1065 : std::nullopt;
1066
1067 // create arrow schema and array
1068 ArrowSchema schema = make_arrow_schema(
1069 std::move(format), // format
1070 std::move(name), // name
1071 std::move(metadata), // metadata
1072 flags, // flags
1073 nullptr, // children
1074 children_ownership, // children ownership
1075 nullptr, // dictionary,
1076 true // dictionary ownership
1077 );
1078
1079 std::vector<buffer<uint8_t>> buffers;
1080 buffers.reserve(2);
1081 buffers.emplace_back(
1082 bitmap.has_value() ? std::move(bitmap.value()).extract_storage()
1083 : buffer<uint8_t>{nullptr, 0, buffer<uint8_t>::default_allocator()}
1084 );
1085 buffers.emplace_back(std::move(data_buffer).extract_storage());
1086
1087 // create arrow array
1088 ArrowArray arr = make_arrow_array(
1089 static_cast<std::int64_t>(size), // length
1090 static_cast<int64_t>(null_count),
1091 0, // offset
1092 std::move(buffers),
1093 nullptr, // children
1094 children_ownership, // children ownership
1095 nullptr, // dictionary
1096 true // dicitonary ownership
1097 );
1098 return arrow_proxy(std::move(arr), std::move(schema));
1099 }
1100
1101 template <timestamp_type T>
1102 constexpr void timestamp_array<T>::assign(const T& rhs, size_type index)
1103 {
1104 SPARROW_ASSERT_TRUE(index < this->size());
1105 m_data_access.value(index) = extract_duration(rhs);
1106 }
1107
1108 template <timestamp_type T>
1109 constexpr void timestamp_array<T>::assign(T&& rhs, size_type index)
1110 {
1111 SPARROW_ASSERT_TRUE(index < this->size());
1112 m_data_access.value(index) = extract_duration(rhs);
1113 }
1114
1115 template <timestamp_type T>
1116 constexpr auto timestamp_array<T>::value(size_type i) -> inner_reference
1117 {
1118 SPARROW_ASSERT_TRUE(i < this->size());
1119 return inner_reference(this, i);
1120 }
1121
1122 template <timestamp_type T>
1123 constexpr auto timestamp_array<T>::value(size_type i) const -> inner_const_reference
1124 {
1125 SPARROW_ASSERT_TRUE(i < this->size());
1126 const auto& val = m_data_access.value(i);
1127 using time_duration = typename T::duration;
1128 const auto sys_time = std::chrono::sys_time<time_duration>{val};
1129 return T{m_timezone, sys_time};
1130 }
1131
1132 template <timestamp_type T>
1133 constexpr auto timestamp_array<T>::value_begin() -> value_iterator
1134 {
1135 return value_iterator(functor_type(this), 0);
1136 }
1137
1138 template <timestamp_type T>
1139 constexpr auto timestamp_array<T>::value_end() -> value_iterator
1140 {
1141 return value_iterator(functor_type(this), this->size());
1142 }
1143
1144 template <timestamp_type T>
1145 constexpr auto timestamp_array<T>::value_cbegin() const -> const_value_iterator
1146 {
1147 return const_value_iterator(const_functor_type(this), 0);
1148 }
1149
1150 template <timestamp_type T>
1151 constexpr auto timestamp_array<T>::value_cend() const -> const_value_iterator
1152 {
1153 return const_value_iterator(const_functor_type(this), this->size());
1154 }
1155
1156 template <timestamp_type T>
1157 constexpr void timestamp_array<T>::resize_values(size_type new_length, inner_value_type value)
1158 {
1159 m_data_access.resize_values(new_length, extract_duration(value));
1160 }
1161
1162 template <timestamp_type T>
1163 constexpr auto
1164 timestamp_array<T>::insert_value(const_value_iterator pos, inner_value_type value, size_type count)
1165 -> value_iterator
1166 {
1167 SPARROW_ASSERT_TRUE(pos <= value_cend());
1168 const size_t idx = static_cast<size_t>(std::distance(value_cbegin(), pos));
1169 m_data_access.insert_value(idx, extract_duration(value), count);
1170 return value_iterator(functor_type(this), idx);
1171 }
1172
1173 template <timestamp_type T>
1174 constexpr auto timestamp_array<T>::erase_values(const_value_iterator pos, size_type count) -> value_iterator
1175 {
1176 SPARROW_ASSERT_TRUE(pos < value_cend());
1177 const size_t idx = static_cast<size_t>(std::distance(value_cbegin(), pos));
1178 m_data_access.erase_values(idx, count);
1179 return value_iterator(functor_type(this), idx);
1180 }
1181}
typename base_type::const_bitmap_range const_bitmap_range
typename base_type::bitmap_iterator bitmap_iterator
typename base_type::iterator_tag iterator_tag
typename base_type::const_bitmap_iterator const_bitmap_iterator
constexpr array_bitmap_base_impl & operator=(const array_bitmap_base_impl &)
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
Object that owns a piece of contiguous memory.
Definition buffer.hpp:131
constexpr auto insert_values(const_value_iterator pos, InputIt first, InputIt last) -> value_iterator
storage_type extract_storage() noexcept
Extracts the underlying storage (move operation).
constexpr size_type null_count() const noexcept
Returns the number of bits set to false (null/invalid).
typename storage_type::default_allocator default_allocator
A view that repeats a value a given number of times.
Array implementation for storing timestamp values with timezone information.
mutable_array_bitmap_base< self_type > base_type
typename inner_types::inner_reference inner_reference
constexpr timestamp_array(const timestamp_array &rhs)
Copy constructor.
timestamp_array(arrow_proxy)
Constructs timestamp array from Arrow proxy.
typename base_type::const_bitmap_iterator const_bitmap_iterator
constexpr timestamp_array(timestamp_array &&rhs) noexcept
Move constructor.
typename base_type::const_value_iterator const_value_iterator
pointer_iterator< const buffer_inner_value_type * > buffer_inner_const_value_iterator
typename base_type::bitmap_const_reference bitmap_const_reference
constexpr timestamp_array & operator=(const timestamp_array &rhs)
Copy assignment operator.
constexpr timestamp_array & operator=(timestamp_array &&rhs) noexcept
Move assignment operator.
pointer_iterator< buffer_inner_value_type * > buffer_inner_value_iterator
typename base_type::const_bitmap_range const_bitmap_range
constexpr timestamp_array(Args &&... args)
Generic constructor for creating timestamp arrays from various inputs.
nullable< inner_const_reference, bitmap_const_reference > const_reference
typename inner_types::inner_const_reference inner_const_reference
nullable< inner_reference, bitmap_reference > reference
typename base_type::bitmap_reference bitmap_reference
constexpr timestamp_array(const date::time_zone *timezone, std::initializer_list< inner_value_type > init, std::optional< std::string_view > name=std::nullopt, std::optional< METADATA_RANGE > metadata=std::nullopt)
Constructs timestamp array from initializer list.
typename inner_types::const_functor_type const_functor_type
typename inner_types::inner_value_type inner_value_type
Implementation of reference to inner type used for layout L.
This buffer class is used as storage buffer for all sparrow arrays.
Concept for input containers that can provide metadata pairs.
Definition metadata.hpp:332
Concept defining valid input types for validity bitmap creation.
#define SPARROW_ASSERT_TRUE(expr__)
SPARROW_API void increase(const std::string &key)
std::string key()
Definition buffer.hpp:49
constexpr std::size_t size(typelist< T... >={})
Gets the count of types contained in a typelist.
Definition mp_utils.hpp:216
constexpr bool excludes_copy_and_move_ctor_v
Convenience variable template for excludes_copy_and_move_ctor.
constexpr bool is_type_instance_of_v
Variable template for convenient access to is_type_instance_of.
Definition mp_utils.hpp:102
array_bitmap_base_impl< D, true > mutable_array_bitmap_base
Convenient alias for arrays with mutable validity bitmaps.
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.
timestamp< std::chrono::microseconds > timestamp_microsecond
constexpr std::string_view data_type_to_format(data_type type)
timestamp< std::chrono::nanoseconds > timestamp_nanosecond
constexpr InputIt next(InputIt it, Distance n)
Definition iterator.hpp:503
SPARROW_API const date::time_zone * get_timezone(const arrow_proxy &proxy)
timestamp_array< timestamp_second > timestamp_seconds_array
Type aliases for timestamp arrays with common durations.
date::zoned_time< Duration, TimeZonePtr > timestamp
constexpr bool is_timestamp_array_v
Variable template for convenient access to is_timestamp_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
Type alias for a validity bitmap using 8-bit storage blocks.
timestamp_array< timestamp_nanosecond > timestamp_nanoseconds_array
timestamp< std::chrono::seconds > timestamp_second
Type aliases for common timestamp durations.
validity_bitmap ensure_validity_bitmap(std::size_t size, R &&validity_input)
Ensures a validity bitmap of the specified size from various input types.
timestamp< std::chrono::milliseconds > timestamp_millisecond
data_type
Runtime identifier of arrow data types, usually associated with raw bytes with the associated value.
timestamp_array< timestamp_microsecond > timestamp_microseconds_array
timestamp_array< timestamp_millisecond > timestamp_milliseconds_array
Extensions to the C++ standard library.
functor_index_iterator< functor_type > value_iterator
functor_index_iterator< const_functor_type > const_value_iterator
detail::layout_value_functor< self_type, inner_reference > functor_type
detail::layout_value_functor< const self_type, inner_const_reference > const_functor_type
Base class for array_inner_types specializations.
Traits class that must be specialized by array implementations.
Metafunction for retrieving the data_type of a typed array.
Type trait to check if a type is a timestamp_array.