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}