reifydb_core/value/column/buffer/
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::ColumnBuffer;
9
10pub trait AsSlice<T> {
11 fn as_slice(&self) -> &[T];
12}
13
14impl ColumnBuffer {
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 ColumnBuffer {
24 fn as_slice(&self) -> &[bool] {
25 match self {
26 ColumnBuffer::Bool(_) => {
27 panic!("as_slice() is not supported for BitVec. Use to_vec() instead.")
28 }
29 other => {
30 panic!("called `as_slice::<bool>()` on ColumnBuffer::{:?}", other.get_type())
31 }
32 }
33 }
34}
35
36macro_rules! impl_as_slice {
37 ($t:ty, $variant:ident) => {
38 impl AsSlice<$t> for ColumnBuffer {
39 fn as_slice(&self) -> &[$t] {
40 match self {
41 ColumnBuffer::$variant(container) => container.data().as_slice(),
42 ColumnBuffer::Option {
43 inner,
44 ..
45 } => inner.as_slice(),
46 other => {
47 panic!(
48 "called `as_slice::<{}>()` on ColumnBuffer::{:?}",
49 stringify!($t),
50 other.get_type()
51 )
52 }
53 }
54 }
55 }
56 };
57 ($t:ty, $variant:ident { container }) => {
58 impl AsSlice<$t> for ColumnBuffer {
59 fn as_slice(&self) -> &[$t] {
60 match self {
61 ColumnBuffer::$variant {
62 container,
63 ..
64 } => container.data().as_slice(),
65 ColumnBuffer::Option {
66 inner,
67 ..
68 } => inner.as_slice(),
69 other => {
70 panic!(
71 "called `as_slice::<{}>()` on ColumnBuffer::{:?}",
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);
94
95impl_as_slice!(Date, Date);
96impl_as_slice!(DateTime, DateTime);
97impl_as_slice!(Time, Time);
98impl_as_slice!(Duration, Duration);
99impl_as_slice!(
100 Int,
101 Int {
102 container
103 }
104);
105impl_as_slice!(
106 Uint,
107 Uint {
108 container
109 }
110);
111impl_as_slice!(
112 Decimal,
113 Decimal {
114 container
115 }
116);
117
118impl AsSlice<Box<Value>> for ColumnBuffer {
119 fn as_slice(&self) -> &[Box<Value>] {
120 match self {
121 ColumnBuffer::Any(container) => container.data().as_slice(),
122 ColumnBuffer::Option {
123 inner,
124 ..
125 } => inner.as_slice(),
126 other => {
127 panic!("called `as_slice::<Box<Value>>()` on ColumnBuffer::{:?}", other.get_type())
128 }
129 }
130 }
131}