fidl_next_codec/wire/
ptr.rs1use core::marker::PhantomData;
6use core::mem::MaybeUninit;
7
8use munge::munge;
9
10use crate::{Chunk, DecodeError, Slot, WireU64};
11use fidl_constants::{ALLOC_ABSENT_U64, ALLOC_PRESENT_U64};
12
13#[repr(C, align(8))]
15pub union WirePointer<'de, T> {
16 encoded: WireU64,
17 decoded: *mut T,
18 _phantom: PhantomData<&'de mut [Chunk]>,
19}
20
21unsafe impl<T: Send> Send for WirePointer<'_, T> {}
22unsafe impl<T: Sync> Sync for WirePointer<'_, T> {}
23
24impl<T> WirePointer<'_, T> {
25 pub fn is_encoded_present(slot: Slot<'_, Self>) -> Result<bool, DecodeError> {
27 munge!(let Self { encoded } = slot);
28 match **encoded {
29 ALLOC_ABSENT_U64 => Ok(false),
30 ALLOC_PRESENT_U64 => Ok(true),
31 x => Err(DecodeError::InvalidPointerPresence(x)),
32 }
33 }
34
35 pub fn encode_present(out: &mut MaybeUninit<Self>) {
37 munge!(let Self { encoded } = out);
38 encoded.write(WireU64(ALLOC_PRESENT_U64));
39 }
40
41 pub fn encode_absent(out: &mut MaybeUninit<Self>) {
43 munge!(let Self { encoded } = out);
44 encoded.write(WireU64(ALLOC_ABSENT_U64));
45 }
46
47 pub fn set_decoded(slot: Slot<'_, Self>, ptr: *mut T) {
49 munge!(let Self { mut decoded } = slot);
50 unsafe {
53 *decoded.as_mut_ptr() = ptr;
54 }
55 }
56
57 pub fn as_ptr(&self) -> *mut T {
59 unsafe { self.decoded }
60 }
61}