1use std::ops::{Deref, DerefMut};
2
3use crate::*;
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
26pub struct Slice<T> {
27 buffer: T,
28 begin: usize,
29 end: usize,
30}
31
32impl<T> Slice<T> {
33 pub(crate) fn new(buffer: T, begin: usize, end: usize) -> Self {
34 Self { buffer, begin, end }
35 }
36
37 pub fn begin(&self) -> usize {
39 self.begin
40 }
41
42 pub fn end(&self) -> usize {
44 self.end
45 }
46
47 pub(crate) fn set_range(&mut self, begin: usize, end: usize) {
48 self.begin = begin;
49 self.end = end;
50 }
51
52 pub fn as_inner(&self) -> &T {
56 &self.buffer
57 }
58
59 pub fn as_inner_mut(&mut self) -> &mut T {
63 &mut self.buffer
64 }
65}
66
67fn slice_mut<T: IoBufMut>(buffer: &mut T) -> &mut [u8] {
68 unsafe { std::slice::from_raw_parts_mut(buffer.as_buf_mut_ptr(), (*buffer).buf_len()) }
69}
70
71impl<T: IoBuf> Deref for Slice<T> {
72 type Target = [u8];
73
74 fn deref(&self) -> &Self::Target {
75 let bytes = self.buffer.as_slice();
76 let end = self.end.min(bytes.len());
77 &bytes[self.begin..end]
78 }
79}
80
81impl<T: IoBufMut> DerefMut for Slice<T> {
82 fn deref_mut(&mut self) -> &mut Self::Target {
83 let bytes = slice_mut(&mut self.buffer);
84 let end = self.end.min(bytes.len());
85 &mut bytes[self.begin..end]
86 }
87}
88
89unsafe impl<T: IoBuf> IoBuf for Slice<T> {
90 fn as_buf_ptr(&self) -> *const u8 {
91 self.buffer.as_slice()[self.begin..].as_ptr()
92 }
93
94 fn buf_len(&self) -> usize {
95 self.deref().len()
96 }
97
98 fn buf_capacity(&self) -> usize {
99 self.end - self.begin
100 }
101}
102
103unsafe impl<T: IoBufMut> IoBufMut for Slice<T> {
104 fn as_buf_mut_ptr(&mut self) -> *mut u8 {
105 slice_mut(&mut self.buffer)[self.begin..].as_mut_ptr()
106 }
107}
108
109impl<T: SetBufInit> SetBufInit for Slice<T> {
110 unsafe fn set_buf_init(&mut self, len: usize) {
111 unsafe { self.buffer.set_buf_init(self.begin + len) }
112 }
113}
114
115impl<T> IntoInner for Slice<T> {
116 type Inner = T;
117
118 fn into_inner(self) -> Self::Inner {
119 self.buffer
120 }
121}
122
123pub struct VectoredSlice<T> {
125 buf: T,
126 begin: usize,
127}
128
129impl<T> VectoredSlice<T> {
130 pub(crate) fn new(buf: T, begin: usize) -> Self {
131 Self { buf, begin }
132 }
133
134 pub fn begin(&self) -> usize {
136 self.begin
137 }
138
139 pub fn as_inner(&self) -> &T {
143 &self.buf
144 }
145
146 pub fn as_inner_mut(&mut self) -> &mut T {
150 &mut self.buf
151 }
152}
153
154impl<T: IoVectoredBuf> IoVectoredBuf for VectoredSlice<T> {
155 unsafe fn iter_io_buffer(&self) -> impl Iterator<Item = IoBuffer> {
156 let mut offset = self.begin;
157 unsafe { self.buf.iter_io_buffer() }.filter_map(move |buf| {
158 let len = buf.len();
159 let sub = len.min(offset);
160 offset -= sub;
161 if len - sub > 0 {
162 Some(unsafe {
164 IoBuffer::new(buf.as_ptr().add(sub), len - sub, buf.capacity() - sub)
165 })
166 } else {
167 None
168 }
169 })
170 }
171}
172
173impl<T> IntoInner for VectoredSlice<T> {
174 type Inner = T;
175
176 fn into_inner(self) -> Self::Inner {
177 self.buf
178 }
179}
180
181pub struct VectoredSliceMut<T> {
183 buf: T,
184 begin: usize,
185}
186
187impl<T> VectoredSliceMut<T> {
188 pub(crate) fn new(buf: T, begin: usize) -> Self {
189 Self { buf, begin }
190 }
191
192 pub fn begin(&self) -> usize {
194 self.begin
195 }
196
197 pub fn as_inner(&self) -> &T {
201 &self.buf
202 }
203
204 pub fn as_inner_mut(&mut self) -> &mut T {
208 &mut self.buf
209 }
210}
211
212impl<T: IoVectoredBuf> IoVectoredBuf for VectoredSliceMut<T> {
213 unsafe fn iter_io_buffer(&self) -> impl Iterator<Item = IoBuffer> {
214 let mut offset = self.begin;
215 unsafe { self.buf.iter_io_buffer() }.filter_map(move |buf| {
216 let capacity = buf.capacity();
217 let sub = capacity.min(offset);
218 offset -= sub;
219 if capacity - sub > 0 {
220 let len = buf.len().saturating_sub(sub);
221 Some(unsafe { IoBuffer::new(buf.as_ptr().add(sub), len, capacity - sub) })
223 } else {
224 None
225 }
226 })
227 }
228}
229
230impl<T> IntoInner for VectoredSliceMut<T> {
231 type Inner = T;
232
233 fn into_inner(self) -> Self::Inner {
234 self.buf
235 }
236}
237
238impl<T: SetBufInit> SetBufInit for VectoredSliceMut<T> {
239 unsafe fn set_buf_init(&mut self, len: usize) {
240 unsafe { self.buf.set_buf_init(self.begin + len) }
241 }
242}
243
244impl<T: IoVectoredBufMut> IoVectoredBufMut for VectoredSliceMut<T> {}