Skip to main content

reifydb_core/value/column/data/
slice.rs

1// SPDX-License-Identifier: AGPL-3.0-or-later
2// Copyright (c) 2025 ReifyDB
3
4use 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}