product_os_cursor/
cursor.rs1use crate::{Result, Error};
2
3pub struct Cursor<T> {
4 inner: T,
5 position: usize,
6}
7
8impl<T> Cursor<T> {
9 pub fn new(inner: T) -> Self {
10 Self {
11 inner,
12 position: 0,
13 }
14 }
15
16 pub fn position(&self) -> usize {
17 self.position
18 }
19
20 pub fn set_position(&mut self, position: usize) {
21 self.position = position;
22 }
23
24 pub fn get_ref(&self) -> &T {
25 &self.inner
26 }
27
28 pub fn get_mut_ref(&mut self) -> &mut T {
29 &mut self.inner
30 }
31}
32
33impl<T: AsRef<[u8]>> Cursor<T> {
34 pub fn remaining_slice(&self) -> &[u8] {
35 let len = self.position.min(self.inner.as_ref().len());
36
37 &self.inner.as_ref()[len..]
38 }
39
40 pub fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
41 let slice = self.remaining_slice();
42 let amt = buf.len().min(slice.len());
43 let a = &slice[..amt];
44
45 if amt == 1 {
46 buf[0] = a[0];
47 } else {
48 buf[..amt].copy_from_slice(a);
49 }
50
51 self.position += amt;
52
53 Ok(amt)
54 }
55
56 pub fn read_exact(&mut self, buf: &mut [u8]) -> Result<()> {
57 let slice = self.remaining_slice();
58 if buf.len() > slice.len() {
59 return Err(Error::UnexpectedEof);
60 }
61 let a = &slice[..buf.len()];
62
63 if buf.len() == 1 {
64 buf[0] = a[0];
65 } else {
66 buf.copy_from_slice(a);
67 }
68
69 self.position += buf.len();
70
71 Ok(())
72 }
73}
74
75impl Cursor<&mut [u8]> {
76 pub fn remaining_slice_mut(&mut self) -> &mut [u8] {
77 let len = self.position.min(self.inner.as_mut().len());
78
79 &mut self.inner.as_mut()[len..]
80 }
81
82 pub fn write(&mut self, data: &[u8]) -> Result<usize> {
83 let slice = self.remaining_slice_mut();
84 let amt = data.len().min(slice.len());
85
86 slice[..amt].copy_from_slice(&data[..amt]);
87
88 self.position += amt;
89
90 Ok(amt)
91 }
92}
93
94impl<const N: usize> Cursor<[u8; N]> {
95 pub fn remaining_slice_mut(&mut self) -> &mut [u8] {
96 let len = self.position.min(self.inner.as_mut().len());
97
98 &mut self.inner.as_mut()[len..]
99 }
100
101 pub fn write(&mut self, data: &[u8]) -> Result<usize> {
102 let slice = self.remaining_slice_mut();
103 let amt = data.len().min(slice.len());
104
105 slice[..amt].copy_from_slice(&data[..amt]);
106
107 self.position += amt;
108
109 Ok(amt)
110 }
111}
112
113impl<T: AsRef<[u8]>> AsRef<T> for Cursor<T> {
114 fn as_ref(&self) -> &T {
115 &self.inner
116 }
117}