mp4_atom/
buf.rs

1use std::io::Cursor;
2
3/// A contiguous buffer of bytes.
4// We're not using bytes::Buf because of some strange bugs with take().
5pub trait Buf: std::fmt::Debug {
6    fn remaining(&self) -> usize;
7    fn has_remaining(&self) -> bool {
8        self.remaining() > 0
9    }
10
11    fn slice(&self, size: usize) -> &[u8];
12    fn advance(&mut self, n: usize);
13}
14
15impl Buf for &[u8] {
16    fn remaining(&self) -> usize {
17        self.len()
18    }
19
20    fn slice(&self, size: usize) -> &[u8] {
21        self[..size].as_ref()
22    }
23
24    fn advance(&mut self, n: usize) {
25        *self = &self[n..];
26    }
27}
28
29impl<T: AsRef<[u8]> + std::fmt::Debug> Buf for Cursor<T> {
30    fn remaining(&self) -> usize {
31        self.get_ref().as_ref().len() - self.position() as usize
32    }
33
34    fn slice(&self, size: usize) -> &[u8] {
35        let pos = self.position() as usize;
36        self.get_ref().as_ref()[pos..pos + size].as_ref()
37    }
38
39    fn advance(&mut self, n: usize) {
40        self.set_position(self.position() + n as u64);
41    }
42}
43
44impl<T: Buf + ?Sized> Buf for &mut T {
45    fn remaining(&self) -> usize {
46        (**self).remaining()
47    }
48
49    fn slice(&self, size: usize) -> &[u8] {
50        (**self).slice(size)
51    }
52
53    fn advance(&mut self, n: usize) {
54        (**self).advance(n);
55    }
56}
57
58#[cfg(feature = "bytes")]
59impl Buf for bytes::Bytes {
60    fn remaining(&self) -> usize {
61        self.len()
62    }
63
64    fn slice(&self, size: usize) -> &[u8] {
65        &self[..size]
66    }
67
68    fn advance(&mut self, n: usize) {
69        bytes::Buf::advance(self, n);
70    }
71}
72
73/// A mutable contiguous buffer of bytes.
74// We're not using bytes::BufMut because it doesn't allow seeking backwards (to set the size).
75pub trait BufMut: std::fmt::Debug {
76    // Returns the current length.
77    fn len(&self) -> usize;
78
79    fn is_empty(&self) -> bool {
80        self.len() == 0
81    }
82
83    // Append a slice to the buffer
84    fn append_slice(&mut self, val: &[u8]);
85
86    // Set a slice at a position in the buffer.
87    fn set_slice(&mut self, pos: usize, val: &[u8]);
88}
89
90impl BufMut for Vec<u8> {
91    fn len(&self) -> usize {
92        self.len()
93    }
94
95    fn append_slice(&mut self, v: &[u8]) {
96        self.extend_from_slice(v);
97    }
98
99    fn set_slice(&mut self, pos: usize, val: &[u8]) {
100        self[pos..pos + val.len()].copy_from_slice(val);
101    }
102}
103
104impl<T: BufMut + ?Sized> BufMut for &mut T {
105    fn len(&self) -> usize {
106        (**self).len()
107    }
108
109    fn append_slice(&mut self, v: &[u8]) {
110        (**self).append_slice(v);
111    }
112
113    fn set_slice(&mut self, pos: usize, val: &[u8]) {
114        (**self).set_slice(pos, val);
115    }
116}
117
118#[cfg(feature = "bytes")]
119impl BufMut for bytes::BytesMut {
120    fn len(&self) -> usize {
121        self.len()
122    }
123
124    fn append_slice(&mut self, v: &[u8]) {
125        self.extend_from_slice(v);
126    }
127
128    fn set_slice(&mut self, pos: usize, val: &[u8]) {
129        self[pos..pos + val.len()].copy_from_slice(val);
130    }
131}