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