twizzler/ptr/resolved/
resolved.rs1use 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}