twizzler/ptr/resolved/
resolved_tx_slice.rs

1use std::{
2    borrow::{Borrow, BorrowMut},
3    ops::{Deref, DerefMut, Index, IndexMut, RangeBounds},
4};
5
6use twizzler_rt_abi::object::ObjectHandle;
7
8use super::{Ref, RefMut, TxRef};
9use crate::{ptr::GlobalPtr, util::range_bounds_to_start_and_end};
10
11pub struct TxRefSlice<T> {
12    ptr: TxRef<T>,
13    len: usize,
14}
15
16impl<T> TxRefSlice<T> {
17    pub unsafe fn from_ref(ptr: TxRef<T>, len: usize) -> Self {
18        Self { ptr, len }
19    }
20
21    #[inline]
22    pub fn offset(&self) -> u64 {
23        self.ptr.offset()
24    }
25
26    pub fn as_slice(&self) -> &[T] {
27        unsafe { core::slice::from_raw_parts(self.ptr.raw(), self.len) }
28    }
29
30    pub fn as_slice_mut(&mut self) -> &mut [T] {
31        unsafe { core::slice::from_raw_parts_mut(self.ptr.raw(), self.len) }
32    }
33
34    #[inline]
35    pub fn get_ref(&self, idx: usize) -> Option<Ref<'_, T>> {
36        let ptr = self.as_slice().get(idx)?;
37        Some(unsafe { Ref::from_ptr(ptr) })
38    }
39
40    #[inline]
41    pub fn get(&self, idx: usize) -> Option<&T> {
42        let ptr = self.as_slice().get(idx)?;
43        Some(ptr)
44    }
45
46    pub fn get_mut(&mut self, idx: usize) -> Option<RefMut<'_, T>> {
47        let ptr = self.as_slice_mut().get_mut(idx)?;
48        Some(unsafe { RefMut::from_ptr(ptr) })
49    }
50
51    #[inline]
52    pub fn get_into(mut self, idx: usize) -> Option<TxRef<T>> {
53        let ptr = self.as_slice_mut().get_mut(idx)? as *mut T;
54        let r = unsafe { TxRef::from_raw_parts(self.ptr.into_tx(), ptr) };
55
56        Some(r)
57    }
58
59    pub fn len(&self) -> usize {
60        self.len
61    }
62
63    pub fn handle(&self) -> &ObjectHandle {
64        self.ptr.handle()
65    }
66
67    #[inline]
68    pub fn slice(self, range: impl RangeBounds<usize>) -> Self {
69        let (start, end) = range_bounds_to_start_and_end(self.len, range);
70        let len = end - start;
71        if let Some(_) = self.get(start) {
72            unsafe { Self::from_ref(self.get_into(start).unwrap(), len) }
73        } else {
74            unsafe { Self::from_ref(self.ptr, 0) }
75        }
76    }
77}
78
79impl<T> From<TxRefSlice<T>> for GlobalPtr<T> {
80    fn from(value: TxRefSlice<T>) -> Self {
81        GlobalPtr::new(value.handle().id(), value.offset())
82    }
83}
84
85impl<T> Index<usize> for TxRefSlice<T> {
86    type Output = T;
87
88    fn index(&self, index: usize) -> &Self::Output {
89        let slice = self.as_slice();
90        &slice[index]
91    }
92}
93
94impl<T> IndexMut<usize> for TxRefSlice<T> {
95    fn index_mut(&mut self, index: usize) -> &mut Self::Output {
96        let slice = self.as_slice_mut();
97        &mut slice[index]
98    }
99}
100
101impl<T> Into<ObjectHandle> for TxRefSlice<T> {
102    fn into(self) -> ObjectHandle {
103        self.handle().clone()
104    }
105}
106
107impl<T> Into<ObjectHandle> for &TxRefSlice<T> {
108    fn into(self) -> ObjectHandle {
109        self.handle().clone()
110    }
111}
112
113impl<T> AsRef<ObjectHandle> for TxRefSlice<T> {
114    fn as_ref(&self) -> &ObjectHandle {
115        self.handle()
116    }
117}
118
119impl<T> Deref for TxRefSlice<T> {
120    type Target = [T];
121
122    fn deref(&self) -> &Self::Target {
123        self.as_slice()
124    }
125}
126
127impl<T> DerefMut for TxRefSlice<T> {
128    fn deref_mut(&mut self) -> &mut Self::Target {
129        self.as_slice_mut()
130    }
131}
132
133impl<T> AsRef<[T]> for TxRefSlice<T> {
134    fn as_ref(&self) -> &[T] {
135        &*self
136    }
137}
138
139impl<T> AsMut<[T]> for TxRefSlice<T> {
140    fn as_mut(&mut self) -> &mut [T] {
141        &mut *self
142    }
143}
144
145impl<T> Borrow<[T]> for TxRefSlice<T> {
146    fn borrow(&self) -> &[T] {
147        &*self
148    }
149}
150
151impl<T> BorrowMut<[T]> for TxRefSlice<T> {
152    fn borrow_mut(&mut self) -> &mut [T] {
153        &mut *self
154    }
155}