reifydb_core/value/column/data/
slice.rs1use reifydb_type::value::{
5 Value, date::Date, datetime::DateTime, decimal::Decimal, duration::Duration, int::Int, time::Time, uint::Uint,
6};
7
8use crate::value::column::ColumnData;
9
10pub trait AsSlice<T> {
11 fn as_slice(&self) -> &[T];
12}
13
14impl ColumnData {
15 pub fn as_slice<T>(&self) -> &[T]
16 where
17 Self: AsSlice<T>,
18 {
19 <Self as AsSlice<T>>::as_slice(self)
20 }
21}
22
23impl AsSlice<bool> for ColumnData {
24 fn as_slice(&self) -> &[bool] {
25 match self {
26 ColumnData::Bool(_) => {
27 panic!("as_slice() is not supported for BitVec. Use to_vec() instead.")
28 }
29 other => {
30 panic!("called `as_slice::<bool>()` on ColumnData::{:?}", other.get_type())
31 }
32 }
33 }
34}
35
36macro_rules! impl_as_slice {
37 ($t:ty, $variant:ident) => {
38 impl AsSlice<$t> for ColumnData {
39 fn as_slice(&self) -> &[$t] {
40 match self {
41 ColumnData::$variant(container) => container.data().as_slice(),
42 ColumnData::Option {
43 inner,
44 ..
45 } => inner.as_slice(),
46 other => {
47 panic!(
48 "called `as_slice::<{}>()` on ColumnData::{:?}",
49 stringify!($t),
50 other.get_type()
51 )
52 }
53 }
54 }
55 }
56 };
57 ($t:ty, $variant:ident { container }) => {
58 impl AsSlice<$t> for ColumnData {
59 fn as_slice(&self) -> &[$t] {
60 match self {
61 ColumnData::$variant {
62 container,
63 ..
64 } => container.data().as_slice(),
65 ColumnData::Option {
66 inner,
67 ..
68 } => inner.as_slice(),
69 other => {
70 panic!(
71 "called `as_slice::<{}>()` on ColumnData::{:?}",
72 stringify!($t),
73 other.get_type()
74 )
75 }
76 }
77 }
78 }
79 };
80}
81
82impl_as_slice!(f32, Float4);
83impl_as_slice!(f64, Float8);
84impl_as_slice!(i8, Int1);
85impl_as_slice!(i16, Int2);
86impl_as_slice!(i32, Int4);
87impl_as_slice!(i64, Int8);
88impl_as_slice!(i128, Int16);
89impl_as_slice!(u8, Uint1);
90impl_as_slice!(u16, Uint2);
91impl_as_slice!(u32, Uint4);
92impl_as_slice!(u64, Uint8);
93impl_as_slice!(u128, Uint16);
94impl_as_slice!(
95 String,
96 Utf8 {
97 container
98 }
99);
100impl_as_slice!(Date, Date);
101impl_as_slice!(DateTime, DateTime);
102impl_as_slice!(Time, Time);
103impl_as_slice!(Duration, Duration);
104impl_as_slice!(
105 Int,
106 Int {
107 container
108 }
109);
110impl_as_slice!(
111 Uint,
112 Uint {
113 container
114 }
115);
116impl_as_slice!(
117 Decimal,
118 Decimal {
119 container
120 }
121);
122
123impl AsSlice<Box<Value>> for ColumnData {
124 fn as_slice(&self) -> &[Box<Value>] {
125 match self {
126 ColumnData::Any(container) => container.data().as_slice(),
127 ColumnData::Option {
128 inner,
129 ..
130 } => inner.as_slice(),
131 other => {
132 panic!("called `as_slice::<Box<Value>>()` on ColumnData::{:?}", other.get_type())
133 }
134 }
135 }
136}