planus/impls/
bool_.rs

1use core::mem::MaybeUninit;
2
3use crate::{
4    builder::Builder, errors::ErrorKind, slice_helpers::SliceWithStartOffset, traits::*, Cursor,
5};
6
7/// # Safety
8/// `ALIGNMENT` and `SIZE` should are 1 for bool.
9unsafe 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
68/// # Safety
69/// The implementation of `write_values` initializes all the bytes.
70unsafe 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}