Skip to main content

reifydb_core/value/column/buffer/
slice.rs

1// SPDX-License-Identifier: Apache-2.0
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::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}