1use reifydb_value::{encoding::RowField, reifydb_assertions};
5
6use crate::row::{bytes::RowBuilder, shape::RowShape};
7
8impl RowShape {
9 #[inline]
10 pub fn set<T: RowField>(&self, row: &mut impl RowBuilder, index: usize, value: T) {
11 let field = &self.fields()[index];
12 reifydb_assertions! {
13 assert!(
14 row.len() >= self.total_static_size(),
15 "row/shape size mismatch: row.len()={} < total_static_size()={}",
16 row.len(),
17 self.total_static_size()
18 );
19 assert_eq!(*field.constraint.get_type().inner_type(), T::VALUE_TYPE);
20 }
21 let offset = field.offset as usize;
22 self.set_valid(row, index, true);
23 value.write_le(&mut row.as_mut_slice()[offset..offset + T::ENCODED_SIZE]);
24 }
25
26 #[inline]
27 pub fn get<T: RowField>(&self, row: &[u8], index: usize) -> T {
28 let field = &self.fields()[index];
29 reifydb_assertions! {
30 assert!(
31 row.len() >= self.total_static_size(),
32 "row/shape size mismatch: row.len()={} < total_static_size()={}",
33 row.len(),
34 self.total_static_size()
35 );
36 assert_eq!(*field.constraint.get_type().inner_type(), T::VALUE_TYPE);
37 }
38 let offset = field.offset as usize;
39 T::read_le(&row[offset..offset + T::ENCODED_SIZE])
40 }
41
42 #[inline]
43 pub fn try_get<T: RowField>(&self, row: &[u8], index: usize) -> Option<T> {
44 if self.is_defined(row, index) && self.fields()[index].constraint.get_type() == T::VALUE_TYPE {
45 Some(self.get(row, index))
46 } else {
47 None
48 }
49 }
50}