reifydb_core/value/encoded/
boolean.rs

1// Copyright (c) reifydb.com 2025
2// This file is licensed under the AGPL-3.0-or-later, see license.md file
3
4use std::ptr;
5
6use reifydb_type::Type;
7
8use crate::value::encoded::{EncodedValues, EncodedValuesLayout};
9
10impl EncodedValuesLayout {
11	pub fn set_bool(&self, row: &mut EncodedValues, index: usize, value: impl Into<bool>) {
12		let field = &self.fields[index];
13		debug_assert!(row.len() >= self.total_static_size());
14		debug_assert_eq!(field.r#type, Type::Boolean);
15		row.set_valid(index, true);
16		unsafe {
17			ptr::write_unaligned(row.make_mut().as_mut_ptr().add(field.offset) as *mut bool, value.into())
18		}
19	}
20
21	pub fn get_bool(&self, row: &EncodedValues, index: usize) -> bool {
22		let field = &self.fields[index];
23		debug_assert!(row.len() >= self.total_static_size());
24		debug_assert_eq!(field.r#type, Type::Boolean);
25		unsafe { (row.as_ptr().add(field.offset) as *const bool).read_unaligned() }
26	}
27
28	pub fn try_get_bool(&self, row: &EncodedValues, index: usize) -> Option<bool> {
29		if row.is_defined(index) && self.fields[index].r#type == Type::Boolean {
30			Some(self.get_bool(row, index))
31		} else {
32			None
33		}
34	}
35}
36
37#[cfg(test)]
38mod tests {
39	use reifydb_type::Type;
40
41	use crate::value::encoded::EncodedValuesLayout;
42
43	#[test]
44	fn test_set_get_bool() {
45		let layout = EncodedValuesLayout::new(&[Type::Boolean]);
46		let mut row = layout.allocate();
47		layout.set_bool(&mut row, 0, true);
48		assert!(layout.get_bool(&row, 0));
49	}
50
51	#[test]
52	fn test_try_get_bool() {
53		let layout = EncodedValuesLayout::new(&[Type::Boolean]);
54		let mut row = layout.allocate();
55
56		assert_eq!(layout.try_get_bool(&row, 0), None);
57
58		layout.set_bool(&mut row, 0, true);
59		assert_eq!(layout.try_get_bool(&row, 0), Some(true));
60	}
61
62	#[test]
63	fn test_false() {
64		let layout = EncodedValuesLayout::new(&[Type::Boolean]);
65		let mut row = layout.allocate();
66		layout.set_bool(&mut row, 0, false);
67		assert!(!layout.get_bool(&row, 0));
68		assert_eq!(layout.try_get_bool(&row, 0), Some(false));
69	}
70
71	#[test]
72	fn test_mixed_with_other_types() {
73		let layout = EncodedValuesLayout::new(&[Type::Boolean, Type::Int4, Type::Boolean]);
74		let mut row = layout.allocate();
75
76		layout.set_bool(&mut row, 0, true);
77		layout.set_i32(&mut row, 1, 42);
78		layout.set_bool(&mut row, 2, false);
79
80		assert_eq!(layout.get_bool(&row, 0), true);
81		assert_eq!(layout.get_i32(&row, 1), 42);
82		assert_eq!(layout.get_bool(&row, 2), false);
83	}
84
85	#[test]
86	fn test_undefined_handling() {
87		let layout = EncodedValuesLayout::new(&[Type::Boolean, Type::Boolean]);
88		let mut row = layout.allocate();
89
90		layout.set_bool(&mut row, 0, true);
91
92		assert_eq!(layout.try_get_bool(&row, 0), Some(true));
93		assert_eq!(layout.try_get_bool(&row, 1), None);
94
95		layout.set_undefined(&mut row, 0);
96		assert_eq!(layout.try_get_bool(&row, 0), None);
97	}
98
99	#[test]
100	fn test_try_get_bool_wrong_type() {
101		let layout = EncodedValuesLayout::new(&[Type::Int1]);
102		let mut row = layout.allocate();
103
104		layout.set_i8(&mut row, 0, 42);
105
106		assert_eq!(layout.try_get_bool(&row, 0), None);
107	}
108}