assembly_data/fdb/ro/
mod.rs1use std::{ops::Deref, sync::Arc};
4
5use assembly_core::buffer::{CastError, MinimallyAligned, Repr};
6
7use self::buffer::Buffer;
8
9use super::file::ArrayHeader;
10
11pub mod buffer;
12pub mod handle;
13pub mod slice;
14
15pub type ArcHandle<B, T> = BaseHandle<Arc<B>, T>;
17
18impl<B: AsRef<[u8]>> ArcHandle<B, ()> {
19 pub fn new_arc(inner: B) -> Self {
21 Self::new(Arc::new(inner))
22 }
23}
24
25impl<B: AsRef<[u8]>, T: Copy> ArcHandle<B, T> {
26 pub fn as_bytes_handle(&self) -> Handle<T> {
30 BaseHandle {
31 mem: Buffer::new(self.mem.as_ref().as_ref()),
32 raw: self.raw,
33 }
34 }
35}
36
37#[derive(Clone, Debug)]
44pub struct BaseHandle<P: Deref, T>
45where
46 <P as Deref>::Target: AsRef<[u8]>,
47{
48 pub(super) mem: P,
50 pub(super) raw: T,
52}
53
54impl<P, T> Copy for BaseHandle<P, T>
55where
56 P: Deref + Copy,
57 T: Copy,
58 <P as Deref>::Target: AsRef<[u8]>,
59{
60}
61
62impl<P: Deref> BaseHandle<P, ()>
63where
64 <P as Deref>::Target: AsRef<[u8]>,
65{
66 pub fn new(mem: P) -> Self {
68 Self { mem, raw: () }
69 }
70}
71
72impl<T, P: Deref> BaseHandle<P, Option<T>>
73where
74 <P as Deref>::Target: AsRef<[u8]>,
75{
76 pub fn transpose(self) -> Option<BaseHandle<P, T>> {
78 if let Some(raw) = self.raw {
79 Some(BaseHandle { mem: self.mem, raw })
80 } else {
81 None
82 }
83 }
84}
85
86impl<P: Deref, T> BaseHandle<P, T>
87where
88 <P as Deref>::Target: AsRef<[u8]>,
89{
90 pub fn raw(&self) -> &T {
92 &self.raw
93 }
94
95 pub fn raw_mut(&mut self) -> &mut T {
97 &mut self.raw
98 }
99
100 pub fn as_bytes(&self) -> &[u8] {
102 self.mem.deref().as_ref()
103 }
104
105 pub fn replace<O>(self, raw: O) -> BaseHandle<P, O> {
107 BaseHandle { mem: self.mem, raw }
108 }
109}
110
111pub type Handle<'a, T> = BaseHandle<Buffer<'a>, T>;
113
114impl<'a, T> Handle<'a, T> {
115 pub fn buf(self) -> Buffer<'a> {
117 self.mem
118 }
119
120 pub fn into_raw(self) -> T {
122 self.raw
123 }
124
125 pub(crate) fn wrap<R>(&self, raw: R) -> Handle<'a, R> {
127 Handle { mem: self.mem, raw }
128 }
129
130 pub(crate) fn try_map_cast<R: MinimallyAligned>(
132 &self,
133 offset: u32,
134 ) -> Result<RefHandle<'a, R>, CastError> {
135 let raw: &'a R = self.mem.try_cast(offset)?;
136 Ok(self.wrap(raw))
137 }
138
139 pub(crate) fn try_map_cast_slice<R: MinimallyAligned>(
141 &self,
142 offset: u32,
143 count: u32,
144 ) -> Result<RefHandle<'a, [R]>, CastError> {
145 let raw: &'a [R] = self.mem.try_cast_slice(offset, count)?;
146 Ok(self.wrap(raw))
147 }
148
149 pub(crate) fn try_map_cast_array<R: MinimallyAligned>(
151 &self,
152 array: ArrayHeader,
153 ) -> Result<RefHandle<'a, [R]>, CastError> {
154 let raw: &'a [R] = self.mem.try_cast_slice(array.base_offset, array.count)?;
155 Ok(self.wrap(raw))
156 }
157
158 pub fn map<X>(self, mapper: impl Fn(Buffer<'a>, T) -> X) -> Handle<'a, X> {
160 let raw = mapper(self.mem, self.raw);
161 Handle { mem: self.mem, raw }
162 }
163
164 pub fn map_val<X>(self, mapper: impl Fn(T) -> X) -> Handle<'a, X> {
166 let raw = mapper(self.raw);
167 Handle { mem: self.mem, raw }
168 }
169
170 pub fn try_map<X, E>(
172 self,
173 mapper: impl Fn(Buffer<'a>, T) -> Result<X, E>,
174 ) -> Result<Handle<'a, X>, E> {
175 let raw = mapper(self.mem, self.raw)?;
176 Ok(Handle { mem: self.mem, raw })
177 }
178}
179
180impl<'a, T> RefHandle<'a, [T]> {
181 pub fn get(self, index: usize) -> Option<RefHandle<'a, T>> {
183 self.raw.get(index).map(|raw| self.wrap(raw))
184 }
185}
186
187pub type RefHandle<'a, T> = Handle<'a, &'a T>;
189
190impl<'a, T: Repr> RefHandle<'a, T> {
191 pub fn map_extract(self) -> Handle<'a, T::Value> {
193 self.wrap(self.raw.extract())
194 }
195}