1use twizzler_abi::object::{MAX_SIZE, NULLPAGE_SIZE};
4
5use crate::{marker::BaseType, ptr::Ref};
6
7mod builder;
8mod fot;
9mod meta;
10mod mutable;
11mod object;
12mod tx;
13
14pub use builder::*;
15pub use fot::*;
16pub use meta::*;
17pub use mutable::MutObject;
18pub use object::Object;
19pub use twizzler_rt_abi::object::{MapFlags, ObjID, ObjectHandle};
20pub use tx::TxObject;
21
22pub trait TypedObject {
24 type Base: BaseType;
26
27 fn base_ref(&self) -> Ref<'_, Self::Base>;
29
30 fn base(&self) -> &Self::Base;
31}
32
33pub trait RawObject {
35 fn handle(&self) -> &ObjectHandle;
37
38 fn id(&self) -> ObjID {
40 self.handle().id()
41 }
42
43 fn base_ptr<T>(&self) -> *const T {
45 self.lea(NULLPAGE_SIZE, size_of::<T>()).unwrap().cast()
46 }
47
48 fn base_mut_ptr<T>(&self) -> *mut T {
50 self.lea_mut(NULLPAGE_SIZE, size_of::<T>()).unwrap().cast()
51 }
52
53 fn meta_ptr(&self) -> *const MetaInfo {
55 self.handle().meta().cast()
56 }
57
58 fn meta_mut_ptr(&self) -> *mut MetaInfo {
60 self.handle().meta().cast()
61 }
62
63 fn fote_ptr(&self, idx: usize) -> Option<*const FotEntry> {
65 let offset: isize = (1 + idx).try_into().ok()?;
66 unsafe { Some((self.meta_ptr() as *const FotEntry).offset(-offset)) }
67 }
68
69 fn fote_ptr_mut(&self, idx: usize) -> Option<*mut FotEntry> {
71 let offset: isize = (1 + idx).try_into().ok()?;
72 unsafe { Some((self.meta_mut_ptr() as *mut FotEntry).offset(-offset)) }
73 }
74
75 fn lea(&self, offset: usize, _len: usize) -> Option<*const u8> {
77 Some(unsafe { self.handle().start().add(offset) as *const u8 })
78 }
79
80 fn lea_mut(&self, offset: usize, _len: usize) -> Option<*mut u8> {
82 Some(unsafe { self.handle().start().add(offset) as *mut u8 })
83 }
84
85 fn ptr_local(&self, ptr: *const u8) -> Option<usize> {
88 if ptr.addr() >= self.handle().start().addr()
89 && ptr.addr() < self.handle().start().addr() + MAX_SIZE
90 {
91 Some(ptr.addr() - self.handle().start().addr())
92 } else {
93 None
94 }
95 }
96}
97
98impl RawObject for ObjectHandle {
99 fn handle(&self) -> &ObjectHandle {
100 self
101 }
102}