reifydb_codec/encoded/
u8.rs1use reifydb_value::{reifydb_assertions, value::value_type::ValueType};
5
6use crate::encoded::{row::EncodedRow, shape::RowShape};
7
8impl RowShape {
9 pub fn set_u8(&self, row: &mut EncodedRow, index: usize, value: impl Into<u8>) {
10 let field = &self.fields()[index];
11 reifydb_assertions! {
12 assert!(
13 row.len() >= self.total_static_size(),
14 "row/shape size mismatch: row.len()={} < total_static_size()={}",
15 row.len(),
16 self.total_static_size()
17 );
18 assert_eq!(*field.constraint.get_type().inner_type(), ValueType::Uint1);
19 }
20 row.set_valid(index, true);
21 unsafe {
22 row.make_mut().as_mut_ptr().add(field.offset as usize).write_unaligned(value.into());
23 }
24 }
25
26 pub fn get_u8(&self, row: &EncodedRow, index: usize) -> u8 {
27 let field = &self.fields()[index];
28 reifydb_assertions! {
29 assert!(
30 row.len() >= self.total_static_size(),
31 "row/shape size mismatch: row.len()={} < total_static_size()={}",
32 row.len(),
33 self.total_static_size()
34 );
35 assert_eq!(*field.constraint.get_type().inner_type(), ValueType::Uint1);
36 }
37 unsafe { row.as_ptr().add(field.offset as usize).read_unaligned() }
38 }
39
40 pub fn try_get_u8(&self, row: &EncodedRow, index: usize) -> Option<u8> {
41 if row.is_defined(index) && self.fields()[index].constraint.get_type() == ValueType::Uint1 {
42 Some(self.get_u8(row, index))
43 } else {
44 None
45 }
46 }
47}
48
49#[cfg(test)]
50pub mod tests {
51 use reifydb_value::value::value_type::ValueType;
52
53 use crate::encoded::shape::RowShape;
54
55 #[test]
56 fn test_set_get_u8() {
57 let shape = RowShape::testing(&[ValueType::Uint1]);
58 let mut row = shape.allocate();
59 shape.set_u8(&mut row, 0, 255u8);
60 assert_eq!(shape.get_u8(&row, 0), 255u8);
61 }
62
63 #[test]
64 fn test_try_get_u8() {
65 let shape = RowShape::testing(&[ValueType::Uint1]);
66 let mut row = shape.allocate();
67
68 assert_eq!(shape.try_get_u8(&row, 0), None);
69
70 shape.set_u8(&mut row, 0, 255u8);
71 assert_eq!(shape.try_get_u8(&row, 0), Some(255u8));
72 }
73
74 #[test]
75 fn test_extremes() {
76 let shape = RowShape::testing(&[ValueType::Uint1]);
77 let mut row = shape.allocate();
78
79 shape.set_u8(&mut row, 0, u8::MAX);
80 assert_eq!(shape.get_u8(&row, 0), u8::MAX);
81
82 let mut row2 = shape.allocate();
83 shape.set_u8(&mut row2, 0, u8::MIN);
84 assert_eq!(shape.get_u8(&row2, 0), u8::MIN);
85
86 let mut row3 = shape.allocate();
87 shape.set_u8(&mut row3, 0, 0u8);
88 assert_eq!(shape.get_u8(&row3, 0), 0u8);
89 }
90
91 #[test]
92 fn test_various_values() {
93 let shape = RowShape::testing(&[ValueType::Uint1]);
94
95 let test_values = [0u8, 1u8, 127u8, 128u8, 254u8, 255u8];
96
97 for value in test_values {
98 let mut row = shape.allocate();
99 shape.set_u8(&mut row, 0, value);
100 assert_eq!(shape.get_u8(&row, 0), value);
101 }
102 }
103
104 #[test]
105 fn test_mixed_with_other_types() {
106 let shape = RowShape::testing(&[ValueType::Uint1, ValueType::Boolean, ValueType::Uint1]);
107 let mut row = shape.allocate();
108
109 shape.set_u8(&mut row, 0, 200u8);
110 shape.set_bool(&mut row, 1, true);
111 shape.set_u8(&mut row, 2, 100u8);
112
113 assert_eq!(shape.get_u8(&row, 0), 200u8);
114 assert_eq!(shape.get_bool(&row, 1), true);
115 assert_eq!(shape.get_u8(&row, 2), 100u8);
116 }
117
118 #[test]
119 fn test_undefined_handling() {
120 let shape = RowShape::testing(&[ValueType::Uint1, ValueType::Uint1]);
121 let mut row = shape.allocate();
122
123 shape.set_u8(&mut row, 0, 42);
124
125 assert_eq!(shape.try_get_u8(&row, 0), Some(42));
126 assert_eq!(shape.try_get_u8(&row, 1), None);
127
128 shape.set_none(&mut row, 0);
129 assert_eq!(shape.try_get_u8(&row, 0), None);
130 }
131
132 #[test]
133 fn test_try_get_u8_wrong_type() {
134 let shape = RowShape::testing(&[ValueType::Boolean]);
135 let mut row = shape.allocate();
136
137 shape.set_bool(&mut row, 0, true);
138
139 assert_eq!(shape.try_get_u8(&row, 0), None);
140 }
141}