38 [[nodiscard]]
constexpr std::size_t
children_size()
const noexcept;
50 using children_owner_list = std::vector<bool>;
51 children_owner_list m_children = {};
61 requires std::same_as<T, ArrowArray> || std::same_as<T, ArrowSchema>
75 [[nodiscard]]
constexpr int64_t
ssize(
const T& value);
89 template <
typename T,
typename U>
102 template <
class T, std::ranges::input_range Range,
class Allocator = std::allocator<T*>>
103 requires(!std::ranges::view<Range>)
104 [[nodiscard]]
constexpr std::vector<T*, Allocator>
to_raw_ptr_vec(Range& range);
116 template <
class T,
class Optional,
class Allocator = std::allocator<T*>>
118 [[nodiscard]]
constexpr std::vector<T*, Allocator>
to_raw_ptr_vec(Optional& optional);
132 template <
class T,
class Tuple,
class Allocator = std::allocator<T*>>
134 [[nodiscard]]
constexpr std::vector<T*, Allocator>
to_raw_ptr_vec(Tuple& tuple);
141 requires std::same_as<T, std::nullopt_t>
144 || (std::ranges::range<T> &&
mpl::testable<std::ranges::range_value_t<T>>)
152 : m_children(size, true)
158 return m_children.size();
168 return m_children[child];
173 m_children.resize(size);
177 requires std::same_as<T, ArrowArray> || std::same_as<T, ArrowSchema>
180 if (t.release ==
nullptr)
187 if (t.dictionary->release)
189 t.dictionary->release(t.dictionary);
195 for (int64_t i = 0; i < t.n_children; ++i)
197 T* child = t.children[i];
206 child->release(child);
214 t.children =
nullptr;
220 constexpr int64_t
ssize(
const T& value)
222 if constexpr (std::ranges::sized_range<T>)
224 return static_cast<int64_t
>(std::ranges::size(value));
228 return std::tuple_size_v<T>;
232 if (value.has_value())
234 return ssize(*value);
247 template <
typename T,
typename U>
250 if constexpr (std::is_pointer_v<U>)
254 else if constexpr (
requires {
typename U::element_type; })
256 if constexpr (
mpl::smart_ptr<U> || std::is_base_of_v<std::shared_ptr<typename U::element_type>, U>
259 if constexpr (std::ranges::contiguous_range<typename U::element_type>)
261 return std::ranges::data(*var.get());
263 else if constexpr (std::same_as<typename U::element_type, T> || std::same_as<T, void>)
269 else if constexpr (std::ranges::contiguous_range<U>)
271 return std::ranges::data(var);
273 else if constexpr (std::same_as<T, U> || std::same_as<T, void>)
284 template <
class T, std::ranges::input_range Range,
class Allocator>
285 requires(!std::ranges::view<Range>)
288 std::vector<T*, Allocator> raw_ptr_vec;
289 raw_ptr_vec.reserve(range.size());
290 std::ranges::transform(
292 std::back_inserter(raw_ptr_vec),
301 template <
class T,
class Optional,
class Allocator>
305 if (!optional.has_value())
312 template <
class T,
class Tuple,
class Allocator>
316 std::vector<T*, Allocator> raw_ptr_vec;
317 raw_ptr_vec.reserve(std::tuple_size_v<Tuple>);
319 [&raw_ptr_vec](
auto&&... args)
329 requires std::same_as<T, std::nullopt_t>
331 && mpl::testable<std::ranges::range_value_t<typename T::value_type>>)
332 || (std::ranges::range<T> && mpl::testable<std::ranges::range_value_t<T>>)
335 if constexpr (!std::same_as<T, std::nullopt_t>)
339 if (elements.has_value())
341 return std::ranges::all_of(
343 [](
const auto& child)
356 return std::ranges::all_of(
358 [](
const auto& element)
360 return bool(element);
constexpr children_ownership(std::size_t size=0)
constexpr std::size_t children_size() const noexcept
constexpr bool has_child_ownership(std::size_t child) const
constexpr void set_child_ownership(std::size_t child, bool ownership)
constexpr void resize_children(std::size_t size)
#define SPARROW_ASSERT_TRUE(expr__)
constexpr bool is_type_instance_of_v
true if T is a concrete type template instanciation of U which is a type template.
void unreachable()
Invokes undefined behavior.
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.
void release_common_arrow(T &t)
Release the children and dictionnary of an ArrowArray or ArrowSchema.
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.
ownership
Specifies the ownership model when passing Arrow data to another system.
Workaround to replace static_assert(false) in template code.