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