planus/impls/
ref_.rs

1use core::mem::MaybeUninit;
2
3use crate::{builder::Builder, traits::*, Cursor, Offset, UnionOffset, UnionVectorOffset};
4
5impl<P: Primitive, T: ?Sized + WriteAsPrimitive<P>> WriteAsPrimitive<P> for &T {
6    #[inline]
7    fn write<const N: usize>(&self, cursor: Cursor<'_, N>, buffer_position: u32) {
8        T::write(*self, cursor, buffer_position)
9    }
10}
11
12impl<T1: ?Sized, T2: ?Sized + WriteAsOffset<T1>> WriteAsOffset<T1> for &T2 {
13    #[inline]
14    fn prepare(&self, builder: &mut Builder) -> Offset<T1> {
15        T2::prepare(self, builder)
16    }
17}
18
19impl<P: Primitive, T: ?Sized + WriteAs<P>> WriteAs<P> for &T {
20    type Prepared = T::Prepared;
21    #[inline]
22    fn prepare(&self, builder: &mut Builder) -> T::Prepared {
23        T::prepare(self, builder)
24    }
25}
26
27impl<P: Primitive, D: ?Sized, T: ?Sized + WriteAsDefault<P, D>> WriteAsDefault<P, D> for &T {
28    type Prepared = T::Prepared;
29    #[inline]
30    fn prepare(&self, builder: &mut Builder, default: &D) -> Option<T::Prepared> {
31        T::prepare(self, builder, default)
32    }
33}
34
35impl<P: Primitive, T: ?Sized + WriteAsOptional<P>> WriteAsOptional<P> for &T {
36    type Prepared = T::Prepared;
37    #[inline]
38    fn prepare(&self, builder: &mut Builder) -> Option<T::Prepared> {
39        T::prepare(self, builder)
40    }
41}
42
43impl<T1: ?Sized, T2: ?Sized + WriteAsUnion<T1>> WriteAsUnion<T1> for &T2 {
44    #[inline]
45    fn prepare(&self, builder: &mut Builder) -> UnionOffset<T1> {
46        T2::prepare(self, builder)
47    }
48}
49
50impl<T1: ?Sized, T2: ?Sized + WriteAsOptionalUnion<T1>> WriteAsOptionalUnion<T1> for &T2 {
51    #[inline]
52    fn prepare(&self, builder: &mut Builder) -> Option<UnionOffset<T1>> {
53        T2::prepare(self, builder)
54    }
55}
56
57impl<P, T: ?Sized + WriteAsUnionVector<P>> WriteAsUnionVector<P> for &T {
58    #[inline]
59    fn prepare(&self, builder: &mut Builder) -> UnionVectorOffset<P> {
60        T::prepare(self, builder)
61    }
62}
63
64impl<P, T: ?Sized + WriteAsDefaultUnionVector<P>> WriteAsDefaultUnionVector<P> for &T {
65    #[inline]
66    fn prepare(&self, builder: &mut Builder) -> Option<UnionVectorOffset<P>> {
67        T::prepare(self, builder)
68    }
69}
70
71impl<P, T: ?Sized + WriteAsOptionalUnionVector<P>> WriteAsOptionalUnionVector<P> for &T {
72    #[inline]
73    fn prepare(&self, builder: &mut Builder) -> Option<UnionVectorOffset<P>> {
74        T::prepare(self, builder)
75    }
76}
77
78/// # Safety
79/// `T` must implement `VectorWrite` following the safety requirements from the trait.
80unsafe impl<P: Primitive, T: ?Sized + VectorWrite<P>> VectorWrite<P> for &T {
81    const STRIDE: usize = T::STRIDE;
82    type Value = T::Value;
83
84    #[inline]
85    fn prepare(&self, builder: &mut Builder) -> Self::Value {
86        T::prepare(self, builder)
87    }
88
89    #[inline]
90    unsafe fn write_values(
91        values: &[Self::Value],
92        bytes: *mut MaybeUninit<u8>,
93        buffer_position: u32,
94    ) {
95        T::write_values(values, bytes, buffer_position);
96    }
97}