Skip to main content

reifydb_codec/row/
le.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) 2026 ReifyDB
3
4use 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}