1use vortex_dtype::{NativeDecimalType, NativePType};
5
6use crate::binaryview::{BinaryViewScalar, BinaryViewType, BinaryViewVector};
7use crate::bool::{BoolScalar, BoolVector};
8use crate::decimal::{DScalar, DVector, DecimalScalar, DecimalVector};
9use crate::fixed_size_list::{FixedSizeListScalar, FixedSizeListVector};
10use crate::listview::{ListViewScalar, ListViewVector};
11use crate::null::{NullScalar, NullVector};
12use crate::primitive::{PScalar, PVector, PrimitiveScalar, PrimitiveVector};
13use crate::struct_::{StructScalar, StructVector};
14use crate::{Scalar, Vector};
15
16pub enum Datum {
18 Scalar(Scalar),
20 Vector(Vector),
22}
23
24impl Datum {
25 pub fn into_null(self) -> NullDatum {
27 match self {
28 Datum::Scalar(scalar) => NullDatum::Scalar(scalar.into_null()),
29 Datum::Vector(vector) => NullDatum::Vector(vector.into_null()),
30 }
31 }
32
33 pub fn into_bool(self) -> BoolDatum {
35 match self {
36 Datum::Scalar(scalar) => BoolDatum::Scalar(scalar.into_bool()),
37 Datum::Vector(vector) => BoolDatum::Vector(vector.into_bool()),
38 }
39 }
40
41 pub fn into_primitive(self) -> PrimitiveDatum {
43 match self {
44 Datum::Scalar(scalar) => PrimitiveDatum::Scalar(scalar.into_primitive()),
45 Datum::Vector(vector) => PrimitiveDatum::Vector(vector.into_primitive()),
46 }
47 }
48
49 pub fn into_decimal(self) -> DecimalDatum {
51 match self {
52 Datum::Scalar(scalar) => DecimalDatum::Scalar(scalar.into_decimal()),
53 Datum::Vector(vector) => DecimalDatum::Vector(vector.into_decimal()),
54 }
55 }
56
57 pub fn into_list(self) -> ListViewDatum {
59 match self {
60 Datum::Scalar(scalar) => ListViewDatum::Scalar(scalar.into_list()),
61 Datum::Vector(vector) => ListViewDatum::Vector(vector.into_list()),
62 }
63 }
64
65 pub fn into_fixed_size_list(self) -> FixedSizeListDatum {
67 match self {
68 Datum::Scalar(scalar) => FixedSizeListDatum::Scalar(scalar.into_fixed_size_list()),
69 Datum::Vector(vector) => FixedSizeListDatum::Vector(vector.into_fixed_size_list()),
70 }
71 }
72
73 pub fn into_struct(self) -> StructDatum {
75 match self {
76 Datum::Scalar(scalar) => StructDatum::Scalar(scalar.into_struct()),
77 Datum::Vector(vector) => StructDatum::Vector(vector.into_struct()),
78 }
79 }
80}
81
82macro_rules! datum {
83 ($Name:ident) => {
85 paste::paste! {
86 pub enum [<$Name Datum>] {
87 Scalar([<$Name Scalar>]),
88 Vector([<$Name Vector>]),
89 }
90
91 impl From<[<$Name Datum>]> for Datum {
92 fn from(val: [<$Name Datum>]) -> Self {
93 match val {
94 [<$Name Datum>]::Scalar(scalar) => Datum::Scalar(Scalar::from(scalar)),
95 [<$Name Datum>]::Vector(vector) => Datum::Vector(Vector::from(vector)),
96 }
97 }
98 }
99
100 impl From<[<$Name Scalar>]> for Datum {
101 fn from(val: [<$Name Scalar>]) -> Self {
102 Datum::Scalar(Scalar::from(val))
103 }
104 }
105
106 impl From<[<$Name Scalar>]> for [<$Name Datum>] {
107 fn from(val: [<$Name Scalar>]) -> Self {
108 [<$Name Datum>]::Scalar(val)
109 }
110 }
111
112 impl From<[<$Name Vector>]> for [<$Name Datum>] {
113 fn from(val: [<$Name Vector>]) -> Self {
114 [<$Name Datum>]::Vector(val)
115 }
116 }
117 }
118 };
119
120 ($Name:ident < $T:ident : $Bound:path >) => {
122 paste::paste! {
123 pub enum [<$Name Datum>]<$T: $Bound> {
124 Scalar([<$Name Scalar>]<$T>),
125 Vector([<$Name Vector>]<$T>),
126 }
127
128 impl<$T: $Bound> From<[<$Name Datum>]<$T>> for Datum {
129 fn from(val: [<$Name Datum>]<$T>) -> Self {
130 match val {
131 [<$Name Datum>]::Scalar(scalar) => Datum::Scalar(Scalar::from(scalar)),
132 [<$Name Datum>]::Vector(vector) => Datum::Vector(Vector::from(vector)),
133 }
134 }
135 }
136
137 impl<$T: $Bound> From<[<$Name Scalar>]<$T>> for Datum {
138 fn from(val: [<$Name Scalar>]<$T>) -> Self {
139 Datum::Scalar(Scalar::from(val))
140 }
141 }
142
143 impl<$T: $Bound> From<[<$Name Scalar>]<$T>> for [<$Name Datum>]<$T> {
144 fn from(val: [<$Name Scalar>]<$T>) -> Self {
145 [<$Name Datum>]::Scalar(val)
146 }
147 }
148
149 impl<$T: $Bound> From<[<$Name Vector>]<$T>> for [<$Name Datum>]<$T> {
150 fn from(val: [<$Name Vector>]<$T>) -> Self {
151 [<$Name Datum>]::Vector(val)
152 }
153 }
154 }
155 };
156}
157
158datum!(Null);
159datum!(Bool);
160datum!(Primitive);
161datum!(P<T: NativePType>);
162datum!(Decimal);
163datum!(D<D: NativeDecimalType>);
164datum!(BinaryView<T: BinaryViewType>);
165datum!(ListView);
166datum!(FixedSizeList);
167datum!(Struct);