1use core::mem::MaybeUninit;
2
3use crate::{
4 builder::Builder, errors::ErrorKind, slice_helpers::SliceWithStartOffset, Cursor, Offset,
5 Result, UnionOffset, UnionVectorOffset,
6};
7
8#[doc(hidden)]
9pub unsafe trait Primitive {
13 const ALIGNMENT: usize;
14 const ALIGNMENT_MASK: usize = Self::ALIGNMENT - 1;
15 const SIZE: usize;
16}
17
18pub trait ReadAsRoot<'a>: Sized {
39 fn read_as_root(slice: &'a [u8]) -> Result<Self>;
44}
45
46pub trait WriteAs<P: Primitive> {
48 #[doc(hidden)]
49 type Prepared: WriteAsPrimitive<P>;
50 #[doc(hidden)]
51 fn prepare(&self, builder: &mut Builder) -> Self::Prepared;
52}
53
54pub trait WriteAsDefault<P: Primitive, D: ?Sized> {
56 #[doc(hidden)]
57 type Prepared: WriteAsPrimitive<P>;
58 #[doc(hidden)]
59 fn prepare(&self, builder: &mut Builder, default: &D) -> Option<Self::Prepared>;
60}
61
62pub trait WriteAsOptional<P: Primitive> {
64 #[doc(hidden)]
65 type Prepared: WriteAsPrimitive<P>;
66 #[doc(hidden)]
67 fn prepare(&self, builder: &mut Builder) -> Option<Self::Prepared>;
68}
69
70pub trait WriteAsOffset<T: ?Sized> {
72 #[doc(hidden)]
73 fn prepare(&self, builder: &mut Builder) -> Offset<T>;
74}
75
76pub trait WriteAsUnion<T: ?Sized> {
78 #[doc(hidden)]
79 fn prepare(&self, builder: &mut Builder) -> UnionOffset<T>;
80}
81
82pub trait WriteAsOptionalUnion<T: ?Sized> {
84 #[doc(hidden)]
85 fn prepare(&self, builder: &mut Builder) -> Option<UnionOffset<T>>;
86}
87
88pub trait WriteAsUnionVector<T: ?Sized> {
90 #[doc(hidden)]
91 fn prepare(&self, builder: &mut Builder) -> UnionVectorOffset<T>;
92}
93
94pub trait WriteAsDefaultUnionVector<T: ?Sized> {
96 #[doc(hidden)]
97 fn prepare(&self, builder: &mut Builder) -> Option<UnionVectorOffset<T>>;
98}
99
100pub trait WriteAsOptionalUnionVector<T: ?Sized> {
102 #[doc(hidden)]
103 fn prepare(&self, builder: &mut Builder) -> Option<UnionVectorOffset<T>>;
104}
105
106#[doc(hidden)]
107pub trait WriteAsPrimitive<P> {
108 fn write<const N: usize>(&self, cursor: Cursor<'_, N>, buffer_position: u32);
109}
110
111#[doc(hidden)]
112pub trait TableRead<'buf>: Sized {
113 fn from_buffer(
114 buffer: SliceWithStartOffset<'buf>,
115 offset: usize,
116 ) -> core::result::Result<Self, ErrorKind>;
117}
118
119#[doc(hidden)]
120pub trait TableReadUnion<'buf>: 'buf + Sized {
121 fn from_buffer(
122 buffer: SliceWithStartOffset<'buf>,
123 tag: u8,
124 offset: usize,
125 ) -> core::result::Result<Self, ErrorKind>;
126}
127
128#[doc(hidden)]
129pub trait TableReadUnionVector<'buf>: Sized {
130 fn from_buffer(
131 buffer: SliceWithStartOffset<'buf>,
132 tags_offset: usize,
133 values_offset: usize,
134 ) -> core::result::Result<Self, ErrorKind>;
135}
136
137pub trait VectorRead<'buf>: 'buf {
139 #[doc(hidden)]
140 const STRIDE: usize;
141 #[doc(hidden)]
142 unsafe fn from_buffer(buffer: SliceWithStartOffset<'buf>, offset: usize) -> Self;
143}
144
145#[doc(hidden)]
146pub trait VectorReadUnion<'buf>: 'buf + Sized + TableReadUnion<'buf> {
147 const VECTOR_NAME: &'static str;
148 fn from_buffer(
149 buffer: SliceWithStartOffset<'buf>,
150 tag: u8,
151 offset: usize,
152 ) -> crate::Result<Self> {
153 <Self as TableReadUnion>::from_buffer(buffer, tag, offset)
154 .map_err(|e| e.with_error_location(Self::VECTOR_NAME, "get", buffer.offset_from_start))
155 }
156}
157
158#[doc(hidden)]
163pub trait VectorReadInner<'buf>: 'buf + Sized {
164 #[doc(hidden)]
165 type Error: Sized;
166 #[doc(hidden)]
167 const STRIDE: usize;
168 #[doc(hidden)]
169 unsafe fn from_buffer(
170 buffer: SliceWithStartOffset<'buf>,
171 offset: usize,
172 ) -> core::result::Result<Self, Self::Error>;
173}
174
175pub unsafe trait VectorWrite<P> {
181 #[doc(hidden)]
182 const STRIDE: usize;
183 #[doc(hidden)]
184 type Value: WriteAsPrimitive<P> + Sized;
185 #[doc(hidden)]
186 fn prepare(&self, builder: &mut Builder) -> Self::Value;
187 #[doc(hidden)]
188 unsafe fn write_values(
189 values: &[Self::Value],
190 bytes: *mut MaybeUninit<u8>,
191 buffer_position: u32,
192 );
193}