base_scheduler/
buffer_slice.rs1use crate::{IoBuf, IoBufMut};
5use std::ops::{Bound, Range, RangeBounds};
6
7#[derive(Debug, Clone)]
9pub struct BufferSlice<B> {
10 buffer: B,
11 range: Range<usize>,
12}
13
14impl<B: IoBuf> BufferSlice<B> {
15 pub(crate) fn new(buffer: B, range: impl RangeBounds<usize>) -> Self {
16 let start = match range.start_bound() {
17 Bound::Included(&start) => start,
18 Bound::Excluded(&start) => start.checked_add(1).expect("buffer range start overflow"),
19 Bound::Unbounded => 0,
20 };
21 let end = match range.end_bound() {
22 Bound::Included(&end) => end.checked_add(1).expect("buffer range end overflow"),
23 Bound::Excluded(&end) => end,
24 Bound::Unbounded => buffer.as_ref().len(),
25 };
26 assert!(
27 start <= end && end <= buffer.as_ref().len(),
28 "buffer range out of bounds"
29 );
30 Self {
31 buffer,
32 range: start..end,
33 }
34 }
35
36 pub fn into_inner(self) -> B {
37 self.buffer
38 }
39}
40
41impl<B: IoBuf> AsRef<[u8]> for BufferSlice<B> {
42 fn as_ref(&self) -> &[u8] {
43 &self.buffer.as_ref()[self.range.clone()]
44 }
45}
46
47impl<B: IoBufMut> AsMut<[u8]> for BufferSlice<B> {
48 fn as_mut(&mut self) -> &mut [u8] {
49 &mut self.buffer.as_mut()[self.range.clone()]
50 }
51}
52
53unsafe impl<B: IoBuf> IoBuf for BufferSlice<B> {}
55unsafe impl<B: IoBufMut> IoBufMut for BufferSlice<B> {}