arc_slice/
bytes.rs

1use crate::{
2    buffer::{Extendable, Slice, Subsliceable},
3    layout::{Layout, LayoutMut},
4    ArcSlice, ArcSliceMut,
5};
6
7impl<S: Slice<Item = u8> + Subsliceable + ?Sized, L: Layout> bytes::Buf for ArcSlice<S, L> {
8    fn remaining(&self) -> usize {
9        self.len()
10    }
11
12    fn chunk(&self) -> &[u8] {
13        self.to_slice()
14    }
15
16    fn advance(&mut self, cnt: usize) {
17        self.advance(cnt);
18    }
19}
20
21impl<S: Slice<Item = u8> + Subsliceable + ?Sized, L: LayoutMut, const UNIQUE: bool> bytes::Buf
22    for ArcSliceMut<S, L, UNIQUE>
23{
24    fn remaining(&self) -> usize {
25        self.len()
26    }
27
28    fn chunk(&self) -> &[u8] {
29        self.to_slice()
30    }
31
32    fn advance(&mut self, cnt: usize) {
33        self.advance(cnt);
34    }
35}
36
37unsafe impl<S: Slice<Item = u8> + Extendable + ?Sized, L: LayoutMut, const UNIQUE: bool>
38    bytes::BufMut for ArcSliceMut<S, L, UNIQUE>
39{
40    fn remaining_mut(&self) -> usize {
41        self.capacity() - self.len()
42    }
43
44    unsafe fn advance_mut(&mut self, cnt: usize) {
45        // SAFETY: same function contract
46        unsafe { self.set_len(self.len() + cnt) }
47    }
48
49    fn chunk_mut(&mut self) -> &mut bytes::buf::UninitSlice {
50        // SAFETY: `UninitSlice` prevent writing uninitialized memory
51        unsafe { self.spare_capacity_mut() }.into()
52    }
53}
54
55#[cfg(feature = "inlined")]
56impl<S: Slice<Item = u8> + Subsliceable + ?Sized, L: Layout> bytes::Buf
57    for crate::inlined::SmallSlice<S, L>
58{
59    fn remaining(&self) -> usize {
60        self.len()
61    }
62
63    fn chunk(&self) -> &[u8] {
64        self.to_slice()
65    }
66
67    fn advance(&mut self, cnt: usize) {
68        self.advance(cnt);
69    }
70}
71
72#[cfg(feature = "inlined")]
73impl<S: Slice<Item = u8> + Subsliceable + ?Sized, L: Layout> bytes::Buf
74    for crate::inlined::SmallArcSlice<S, L>
75{
76    fn remaining(&self) -> usize {
77        self.len()
78    }
79
80    fn chunk(&self) -> &[u8] {
81        self.to_slice()
82    }
83
84    fn advance(&mut self, cnt: usize) {
85        self._advance(cnt);
86    }
87}