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// Utf8 is intentionally not implemented: storage is bytes+offsets, not [String].
95// Use `Utf8Container::iter()` / `.get(idx)` for `&str` access, or
96// `data_bytes()` + `offsets()` for the raw layout.
97impl_as_slice!(Date, Date);
98impl_as_slice!(DateTime, DateTime);
99impl_as_slice!(Time, Time);
100impl_as_slice!(Duration, Duration);
101impl_as_slice!(
102	Int,
103	Int {
104		container
105	}
106);
107impl_as_slice!(
108	Uint,
109	Uint {
110		container
111	}
112);
113impl_as_slice!(
114	Decimal,
115	Decimal {
116		container
117	}
118);
119
120impl AsSlice<Box<Value>> for ColumnBuffer {
121	fn as_slice(&self) -> &[Box<Value>] {
122		match self {
123			ColumnBuffer::Any(container) => container.data().as_slice(),
124			ColumnBuffer::Option {
125				inner,
126				..
127			} => inner.as_slice(),
128			other => {
129				panic!("called `as_slice::<Box<Value>>()` on ColumnBuffer::{:?}", other.get_type())
130			}
131		}
132	}
133}