1use core::mem::MaybeUninit;
2
3use crate::{
4 builder::Builder, errors::ErrorKind, slice_helpers::SliceWithStartOffset, traits::*, Cursor,
5};
6
7unsafe impl Primitive for bool {
10 const ALIGNMENT: usize = 1;
11 const SIZE: usize = 1;
12}
13
14impl WriteAsPrimitive<bool> for bool {
15 #[inline]
16 fn write<const N: usize>(&self, cursor: Cursor<'_, N>, _buffer_position: u32) {
17 cursor.assert_size().finish([u8::from(*self)]);
18 }
19}
20
21impl WriteAs<bool> for bool {
22 type Prepared = Self;
23 #[inline]
24 fn prepare(&self, _builder: &mut Builder) -> Self {
25 *self
26 }
27}
28
29impl WriteAsDefault<bool, bool> for bool {
30 type Prepared = Self;
31 #[inline]
32 fn prepare(&self, _builder: &mut Builder, default: &bool) -> Option<bool> {
33 if self == default {
34 None
35 } else {
36 Some(*self)
37 }
38 }
39}
40
41impl WriteAsOptional<bool> for bool {
42 type Prepared = Self;
43 #[inline]
44 fn prepare(&self, _builder: &mut Builder) -> Option<Self> {
45 Some(*self)
46 }
47}
48
49impl<'buf> TableRead<'buf> for bool {
50 #[inline]
51 fn from_buffer(
52 buffer: SliceWithStartOffset<'buf>,
53 offset: usize,
54 ) -> core::result::Result<bool, ErrorKind> {
55 Ok(buffer.advance_as_array::<1>(offset)?.as_array()[0] != 0)
56 }
57}
58
59impl<'buf> VectorRead<'buf> for bool {
60 const STRIDE: usize = 1;
61
62 #[inline]
63 unsafe fn from_buffer(buffer: SliceWithStartOffset<'buf>, offset: usize) -> bool {
64 *buffer.as_slice().get_unchecked(offset) != 0
65 }
66}
67
68unsafe impl VectorWrite<bool> for bool {
71 const STRIDE: usize = 1;
72
73 type Value = bool;
74
75 #[inline]
76 fn prepare(&self, _builder: &mut Builder) -> Self::Value {
77 *self
78 }
79
80 #[inline]
81 unsafe fn write_values(
82 values: &[Self::Value],
83 bytes: *mut MaybeUninit<u8>,
84 buffer_position: u32,
85 ) {
86 let bytes = bytes as *mut [MaybeUninit<u8>; 1];
87 for (i, v) in values.iter().enumerate() {
88 v.write(Cursor::new(&mut *bytes.add(i)), buffer_position - i as u32);
89 }
90 }
91}