Skip to main content

buffer_core/
lease.rs

1use std::ops::Range;
2
3use core_types::BufferId;
4
5use crate::buffer::Buffer;
6
7#[derive(Clone, Debug)]
8pub struct BufferLease {
9    buffer: Buffer,
10    range: Range<usize>,
11}
12
13impl BufferLease {
14    pub fn full(buffer: Buffer) -> Self {
15        let len = buffer.len();
16        Self {
17            buffer,
18            range: 0..len,
19        }
20    }
21
22    pub fn buffer_id(&self) -> BufferId {
23        self.buffer.id
24    }
25
26    pub fn len(&self) -> usize {
27        self.range.end.saturating_sub(self.range.start)
28    }
29
30    pub fn is_empty(&self) -> bool {
31        self.len() == 0
32    }
33
34    pub fn as_slice(&self) -> &[u8] {
35        &self.buffer.as_slice()[self.range.clone()]
36    }
37
38    pub fn slice(&self, start: usize, end: usize) -> Option<Self> {
39        if start > end || self.range.start + end > self.range.end {
40            return None;
41        }
42        Some(Self {
43            buffer: self.buffer.clone(),
44            range: (self.range.start + start)..(self.range.start + end),
45        })
46    }
47
48    pub fn view(&self) -> PacketView<'_> {
49        PacketView {
50            buffer_id: self.buffer.id,
51            bytes: self.as_slice(),
52        }
53    }
54}
55
56#[derive(Clone, Copy, Debug)]
57pub struct PacketView<'a> {
58    pub buffer_id: BufferId,
59    pub bytes: &'a [u8],
60}