Project
Loading...
Searching...
No Matches
ArrowTypes.h
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
12#ifndef O2_FRAMEWORK_ARROWTYPES_H
13#define O2_FRAMEWORK_ARROWTYPES_H
14#include <arrow/table.h>
15#include "Framework/Traits.h"
16#include "arrow/type_fwd.h"
17#include <span>
18
19namespace o2::soa
20{
21struct ArrowRange {
22 uint64_t offset;
24
25 bool operator!=(ArrowRange const& other) const
26 {
27 return (offset != other.offset) && (size != other.size);
28 }
29};
30
32 std::shared_ptr<arrow::Table> tablePtr = nullptr;
34
35 ArrowTableRef() = default;
36 ArrowTableRef(std::shared_ptr<arrow::Table> table)
37 : tablePtr{table},
38 range{0, table->num_rows()}
39 {
40 }
41 ArrowTableRef(std::shared_ptr<arrow::Table> table, ArrowRange range_)
42 : tablePtr{table},
43 range{range_}
44 {
45 }
46
48 {
49 return {tablePtr, {0, 0}};
50 }
51
53 {
54 return {tablePtr, newRange};
55 }
56
57 std::shared_ptr<arrow::Table> const& operator->() const
58 {
59 return tablePtr;
60 }
61};
62
63template <typename T>
65};
66template <>
67struct arrow_array_for<bool> {
68 using type = arrow::BooleanArray;
69};
70template <>
71struct arrow_array_for<int8_t> {
72 using type = arrow::Int8Array;
73};
74template <>
75struct arrow_array_for<uint8_t> {
76 using type = arrow::UInt8Array;
77};
78template <>
79struct arrow_array_for<int16_t> {
80 using type = arrow::Int16Array;
81};
82template <>
83struct arrow_array_for<uint16_t> {
84 using type = arrow::UInt16Array;
85};
86template <>
87struct arrow_array_for<int32_t> {
88 using type = arrow::Int32Array;
89};
90template <>
92 using type = arrow::Int64Array;
93};
94template <>
95struct arrow_array_for<uint32_t> {
96 using type = arrow::UInt32Array;
97};
98template <>
99struct arrow_array_for<uint64_t> {
100 using type = arrow::UInt64Array;
101};
102template <>
103struct arrow_array_for<float> {
104 using type = arrow::FloatArray;
105};
106template <>
107struct arrow_array_for<double> {
108 using type = arrow::DoubleArray;
109};
110template <>
111struct arrow_array_for<std::span<std::byte>> {
112 using type = arrow::BinaryViewArray;
113};
114template <int N>
115struct arrow_array_for<float[N]> {
116 using type = arrow::FixedSizeListArray;
117 using value_type = float;
118};
119template <int N>
121 using type = arrow::FixedSizeListArray;
123};
124template <int N>
125struct arrow_array_for<short[N]> {
126 using type = arrow::FixedSizeListArray;
127 using value_type = short;
128};
129template <int N>
130struct arrow_array_for<double[N]> {
131 using type = arrow::FixedSizeListArray;
132 using value_type = double;
133};
134template <int N>
135struct arrow_array_for<int8_t[N]> {
136 using type = arrow::FixedSizeListArray;
137 using value_type = int8_t;
138};
139template <int N>
141 using type = arrow::FixedSizeListArray;
143};
144
145#define ARROW_VECTOR_FOR(_type_) \
146 template <> \
147 struct arrow_array_for<std::vector<_type_>> { \
148 using type = arrow::ListArray; \
149 using value_type = _type_; \
150 };
151
156
161
164
165template <typename T>
167template <typename T>
169
170template <class Array>
171using array_element_t = std::decay_t<decltype(std::declval<Array>()[0])>;
172
173template <typename T>
174std::shared_ptr<arrow::DataType> asArrowDataType(int list_size = 1)
175{
176 auto typeGenerator = [](std::shared_ptr<arrow::DataType> const& type, int list_size) -> std::shared_ptr<arrow::DataType> {
177 switch (list_size) {
178 case -1:
179 return arrow::list(type);
180 case 1:
181 return std::move(type);
182 default:
183 return arrow::fixed_size_list(type, list_size);
184 }
185 };
186
187 if constexpr (std::is_arithmetic_v<T>) {
188 if constexpr (std::same_as<T, bool>) {
189 return typeGenerator(arrow::boolean(), list_size);
190 } else if constexpr (std::same_as<T, uint8_t>) {
191 return typeGenerator(arrow::uint8(), list_size);
192 } else if constexpr (std::same_as<T, uint16_t>) {
193 return typeGenerator(arrow::uint16(), list_size);
194 } else if constexpr (std::same_as<T, uint32_t>) {
195 return typeGenerator(arrow::uint32(), list_size);
196 } else if constexpr (std::same_as<T, uint64_t>) {
197 return typeGenerator(arrow::uint64(), list_size);
198 } else if constexpr (std::same_as<T, int8_t>) {
199 return typeGenerator(arrow::int8(), list_size);
200 } else if constexpr (std::same_as<T, int16_t>) {
201 return typeGenerator(arrow::int16(), list_size);
202 } else if constexpr (std::same_as<T, int32_t>) {
203 return typeGenerator(arrow::int32(), list_size);
204 } else if constexpr (std::same_as<T, int64_t>) {
205 return typeGenerator(arrow::int64(), list_size);
206 } else if constexpr (std::same_as<T, float>) {
207 return typeGenerator(arrow::float32(), list_size);
208 } else if constexpr (std::same_as<T, double>) {
209 return typeGenerator(arrow::float64(), list_size);
210 }
211 } else if constexpr (std::is_bounded_array_v<T>) {
212 return asArrowDataType<array_element_t<T>>(std::extent_v<T>);
213 } else if constexpr (o2::framework::is_specialization_v<T, std::vector>) {
214 return asArrowDataType<typename T::value_type>(-1);
215 }
216 return nullptr;
217}
218} // namespace o2::soa
219#endif // O2_FRAMEWORK_ARROWTYPES_H
#define ARROW_VECTOR_FOR(_type_)
Definition ArrowTypes.h:145
GLsizeiptr size
Definition glcorearb.h:659
GLenum GLint * range
Definition glcorearb.h:1899
GLint GLint GLsizei GLint GLenum GLenum type
Definition glcorearb.h:275
GLintptr offset
Definition glcorearb.h:660
std::decay_t< decltype(std::declval< Array >()[0])> array_element_t
Definition ArrowTypes.h:171
std::shared_ptr< arrow::DataType > asArrowDataType(int list_size=1)
Definition ArrowTypes.h:174
typename arrow_array_for< T >::value_type value_for_t
Definition ArrowTypes.h:168
typename arrow_array_for< T >::type arrow_array_for_t
Definition ArrowTypes.h:166
bool operator!=(ArrowRange const &other) const
Definition ArrowTypes.h:25
std::shared_ptr< arrow::Table > const & operator->() const
Definition ArrowTypes.h:57
ArrowTableRef makeEmpty() const
Definition ArrowTypes.h:47
std::shared_ptr< arrow::Table > tablePtr
Definition ArrowTypes.h:32
ArrowTableRef slice(ArrowRange newRange) const
Definition ArrowTypes.h:52
ArrowTableRef(std::shared_ptr< arrow::Table > table, ArrowRange range_)
Definition ArrowTypes.h:41
ArrowTableRef(std::shared_ptr< arrow::Table > table)
Definition ArrowTypes.h:36
arrow::FixedSizeListArray type
Definition ArrowTypes.h:131
arrow::FixedSizeListArray type
Definition ArrowTypes.h:116
arrow::FixedSizeListArray type
Definition ArrowTypes.h:141
arrow::FixedSizeListArray type
Definition ArrowTypes.h:136
arrow::FixedSizeListArray type
Definition ArrowTypes.h:121
arrow::FixedSizeListArray type
Definition ArrowTypes.h:126
VectorOfTObjectPtrs other