twizzler/ptr/resolved/
resolved.rs

1use std::{borrow::Borrow, marker::PhantomData, ops::Deref};
2
3use twizzler_rt_abi::object::ObjectHandle;
4
5use super::{LazyHandle, RefMut};
6use crate::{
7    object::{MutObject, RawObject, TxObject},
8    ptr::{GlobalPtr, TxRef},
9    util::maybe_remap,
10};
11
12pub struct Ref<'obj, T> {
13    ptr: *const T,
14    pub(super) lazy_handle: LazyHandle<'obj>,
15    _pd: PhantomData<&'obj T>,
16}
17
18impl<'obj, T> Ref<'obj, T> {
19    pub(super) fn new(ptr: *const T, lazy_handle: LazyHandle<'obj>) -> Self {
20        Self {
21            ptr,
22            lazy_handle,
23            _pd: PhantomData,
24        }
25    }
26
27    #[inline]
28    pub fn raw(&self) -> *const T {
29        self.ptr
30    }
31
32    #[inline]
33    pub fn offset(&self) -> u64 {
34        self.handle().ptr_local(self.ptr.cast()).unwrap() as u64
35    }
36
37    pub fn handle(&self) -> &ObjectHandle {
38        self.lazy_handle.handle(self.ptr.cast())
39    }
40
41    #[inline]
42    pub unsafe fn from_raw_parts(ptr: *const T, handle: &'obj ObjectHandle) -> Self {
43        Self::new(ptr, LazyHandle::new_borrowed(handle))
44    }
45
46    #[inline]
47    pub unsafe fn from_ptr(ptr: *const T) -> Self {
48        Self::new(ptr, LazyHandle::default())
49    }
50
51    #[inline]
52    pub unsafe fn cast<U>(self) -> Ref<'obj, U> {
53        Ref::new(self.ptr.cast(), self.lazy_handle)
54    }
55
56    #[inline]
57    unsafe fn mutable_to(self, ptr: *mut T) -> RefMut<'obj, T> {
58        RefMut::from_handle(self.handle().clone(), ptr)
59    }
60
61    #[inline]
62    pub unsafe fn into_mut(self) -> RefMut<'obj, T> {
63        let ptr = self.ptr as *mut T;
64        self.mutable_to(ptr)
65    }
66
67    #[inline]
68    pub unsafe fn as_mut(&self) -> RefMut<'obj, T> {
69        let ptr = self.ptr as *mut T;
70        RefMut::from_handle(self.handle().clone(), ptr)
71    }
72
73    pub fn global(&self) -> GlobalPtr<T> {
74        GlobalPtr::new(self.handle().id(), self.offset())
75    }
76
77    pub fn owned<'b>(&self) -> Ref<'b, T> {
78        Ref::from_handle(self.handle().clone(), self.ptr)
79    }
80
81    pub fn from_handle(handle: ObjectHandle, ptr: *const T) -> Self {
82        Self::new(ptr, LazyHandle::new_owned(handle))
83    }
84
85    pub fn into_tx(self) -> crate::Result<TxRef<T>> {
86        self.as_tx()
87    }
88
89    pub fn as_tx(&self) -> crate::Result<TxRef<T>> {
90        let (handle, ptr) = maybe_remap(self.handle().clone(), self.ptr as *mut T);
91        let mo = unsafe { MutObject::<()>::from_handle_unchecked(handle) };
92        let tx = unsafe { TxObject::from_mut_object(mo) };
93        Ok(unsafe { TxRef::from_raw_parts(tx, ptr) })
94    }
95
96    pub unsafe fn add(self, offset: usize) -> Self {
97        Self::new(self.ptr.add(offset), self.lazy_handle)
98    }
99
100    pub unsafe fn byte_add(self, offset: usize) -> Self {
101        Self::new(self.ptr.byte_add(offset), self.lazy_handle)
102    }
103}
104
105impl<'obj, T: core::fmt::Debug> core::fmt::Debug for Ref<'obj, T> {
106    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
107        write!(f, "{:?}", self.deref())
108    }
109}
110
111impl<'a, T> From<Ref<'a, T>> for GlobalPtr<T> {
112    fn from(value: Ref<'a, T>) -> Self {
113        GlobalPtr::new(value.handle().id(), value.offset())
114    }
115}
116
117impl<'obj, T> Deref for Ref<'obj, T> {
118    type Target = T;
119
120    #[inline]
121    fn deref(&self) -> &Self::Target {
122        unsafe { self.ptr.as_ref().unwrap_unchecked() }
123    }
124}
125
126impl<'a, T> Into<ObjectHandle> for Ref<'a, T> {
127    fn into(self) -> ObjectHandle {
128        self.handle().clone()
129    }
130}
131
132impl<'a, T> Into<ObjectHandle> for &Ref<'a, T> {
133    fn into(self) -> ObjectHandle {
134        self.handle().clone()
135    }
136}
137
138impl<'a, T> AsRef<ObjectHandle> for Ref<'a, T> {
139    fn as_ref(&self) -> &ObjectHandle {
140        self.handle()
141    }
142}
143
144impl<'a, T> Borrow<T> for Ref<'a, T> {
145    fn borrow(&self) -> &T {
146        &*self
147    }
148}