sparrow 0.6.0
Loading...
Searching...
No Matches
arrow_array_schema_utils.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 <algorithm>
18#include <optional>
19#include <ranges>
20#include <tuple>
21#include <type_traits>
22#include <vector>
23
26
27namespace sparrow
28{
39 template <class T>
40 [[nodiscard]] constexpr int64_t ssize(const T& value);
41
54 template <typename T, typename U>
55 [[nodiscard]] constexpr T* get_raw_ptr(U& var);
56
67 template <class T, std::ranges::input_range Range, class Allocator = std::allocator<T*>>
68 requires(!std::ranges::view<Range>)
69 [[nodiscard]] constexpr std::vector<T*, Allocator> to_raw_ptr_vec(Range& range);
70
81 template <class T, class Optional, class Allocator = std::allocator<T*>>
83 [[nodiscard]] constexpr std::vector<T*, Allocator> to_raw_ptr_vec(Optional& optional);
84
97 template <class T, class Tuple, class Allocator = std::allocator<T*>>
99 [[nodiscard]] constexpr std::vector<T*, Allocator> to_raw_ptr_vec(Tuple& tuple);
100
105 template <class T>
106 requires std::same_as<T, std::nullopt_t>
109 || (std::ranges::range<T> && mpl::testable<std::ranges::range_value_t<T>>)
110 [[nodiscard]] constexpr bool all_element_are_true(const T& elements);
111
112 /******************
113 * Implementation *
114 ******************/
115
116 template <class T>
117 constexpr int64_t ssize(const T& value)
118 {
119 if constexpr (std::ranges::sized_range<T>)
120 {
121 return static_cast<int64_t>(std::ranges::size(value));
122 }
124 {
125 return std::tuple_size_v<T>;
126 }
128 {
129 if (value.has_value())
130 {
131 return ssize(*value);
132 }
133 else
134 {
135 return 0;
136 }
137 }
138 else
139 {
140 return 0;
141 }
142 }
143
144 template <typename T, typename U>
145 constexpr T* get_raw_ptr(U& var)
146 {
147 if constexpr (std::is_pointer_v<U>)
148 {
149 return var;
150 }
151 else if constexpr (requires { typename U::element_type; })
152 {
153 if constexpr (mpl::smart_ptr<U> || std::is_base_of_v<std::shared_ptr<typename U::element_type>, U>
155 {
156 if constexpr (std::ranges::contiguous_range<typename U::element_type>)
157 {
158 return std::ranges::data(*var.get());
159 }
160 else if constexpr (std::same_as<typename U::element_type, T> || std::same_as<T, void>)
161 {
162 return var.get();
163 }
164 }
165 }
166 else if constexpr (std::ranges::contiguous_range<U>)
167 {
168 return std::ranges::data(var);
169 }
170 else if constexpr (std::same_as<T, U> || std::same_as<T, void>)
171 {
172 return &var;
173 }
174 else
175 {
176 static_assert(mpl::dependent_false<T, U>::value, "get_raw_ptr: unsupported type.");
178 }
179 }
180
181 template <class T, std::ranges::input_range Range, class Allocator>
182 requires(!std::ranges::view<Range>)
183 constexpr std::vector<T*, Allocator> to_raw_ptr_vec(Range& range)
184 {
185 std::vector<T*, Allocator> raw_ptr_vec;
186 raw_ptr_vec.reserve(range.size());
187 std::ranges::transform(
188 range,
189 std::back_inserter(raw_ptr_vec),
190 [](auto& elem) -> T*
191 {
192 return get_raw_ptr<T>(elem);
193 }
194 );
195 return raw_ptr_vec;
196 }
197
198 template <class T, class Optional, class Allocator>
200 constexpr std::vector<T*, Allocator> to_raw_ptr_vec(Optional& optional)
201 {
202 if (!optional.has_value())
203 {
204 return {};
205 }
206 return to_raw_ptr_vec<T>(*optional);
207 }
208
209 template <class T, class Tuple, class Allocator>
211 constexpr std::vector<T*, Allocator> to_raw_ptr_vec(Tuple& tuple)
212 {
213 std::vector<T*, Allocator> raw_ptr_vec;
214 raw_ptr_vec.reserve(std::tuple_size_v<Tuple>);
215 std::apply(
216 [&raw_ptr_vec](auto&&... args)
217 {
218 (raw_ptr_vec.push_back(get_raw_ptr<T>(args)), ...);
219 },
220 tuple
221 );
222 return raw_ptr_vec;
223 }
224
225 template <class T>
226 requires std::same_as<T, std::nullopt_t>
228 && mpl::testable<std::ranges::range_value_t<typename T::value_type>>)
229 || (std::ranges::range<T> && mpl::testable<std::ranges::range_value_t<T>>)
230 constexpr bool all_element_are_true(const T& elements)
231 {
232 if constexpr (!std::same_as<T, std::nullopt_t>)
233 {
235 {
236 if (elements.has_value())
237 {
238 return std::ranges::all_of(
239 *elements,
240 [](const auto& child)
241 {
242 return bool(child);
243 }
244 );
245 }
246 else
247 {
248 return true;
249 }
250 }
251 else
252 {
253 return std::ranges::all_of(
254 elements,
255 [](const auto& element)
256 {
257 return bool(element);
258 }
259 );
260 }
261 }
262 else
263 {
264 return true;
265 }
266 }
267
268}
constexpr bool is_type_instance_of_v
true if T is a concrete type template instanciation of U which is a type template.
Definition mp_utils.hpp:50
void unreachable()
Invokes undefined behavior.
Definition mp_utils.hpp:425
constexpr int64_t ssize(const T &value)
Get the size of a range, a tuple or an optional.
constexpr std::vector< T *, Allocator > to_raw_ptr_vec(Range &range)
Create a vector of pointers to elements from a range.
constexpr bool all_element_are_true(const T &elements)
Check if all elements of a range or std::optional<range> are valid by caling their bool operator.
constexpr T * get_raw_ptr(U &var)
Get a raw pointer from a smart pointer, a range, an object or a pointer.
Workaround to replace static_assert(false) in template code.
Definition mp_utils.hpp:33