xref: /DragonOS/kernel/src/libs/vec_cursor.rs (revision 91e9d4ab55ef960f57a1b6287bc523ca4341f67a)
1004e86ffSlogin #![allow(dead_code)]
2004e86ffSlogin 
3004e86ffSlogin use core::mem::size_of;
4004e86ffSlogin 
5004e86ffSlogin use alloc::vec::Vec;
6*91e9d4abSLoGin use system_error::SystemError;
7004e86ffSlogin 
8*91e9d4abSLoGin use crate::driver::base::block::SeekFrom;
9004e86ffSlogin 
10004e86ffSlogin /// @brief 本模块用于为数组提供游标的功能,以简化其操作。
11004e86ffSlogin #[derive(Debug)]
12004e86ffSlogin pub struct VecCursor {
13004e86ffSlogin     /// 游标管理的数据
14004e86ffSlogin     data: Vec<u8>,
15004e86ffSlogin     /// 游标的位置
16004e86ffSlogin     pos: usize,
17004e86ffSlogin }
18004e86ffSlogin 
19004e86ffSlogin impl VecCursor {
20004e86ffSlogin     /// @brief 新建一个游标
21004e86ffSlogin     pub fn new(data: Vec<u8>) -> Self {
22004e86ffSlogin         return Self { data: data, pos: 0 };
23004e86ffSlogin     }
24004e86ffSlogin 
25004e86ffSlogin     /// @brief 创建一个全0的cursor
26004e86ffSlogin     pub fn zerod(length: usize) -> Self {
27004e86ffSlogin         let mut result = VecCursor {
28004e86ffSlogin             data: Vec::new(),
29004e86ffSlogin             pos: 0,
30004e86ffSlogin         };
31004e86ffSlogin         result.data.resize(length, 0);
32004e86ffSlogin         return result;
33004e86ffSlogin     }
34004e86ffSlogin 
35004e86ffSlogin     /// @brief 获取游标管理的数据的可变引用
36004e86ffSlogin     pub fn get_mut(&mut self) -> &mut Vec<u8> {
37004e86ffSlogin         return &mut self.data;
38004e86ffSlogin     }
39004e86ffSlogin 
40004e86ffSlogin     /// @brief 获取游标管理的数据的不可变引用
41004e86ffSlogin     pub fn get_ref(&self) -> &Vec<u8> {
42004e86ffSlogin         return &self.data;
43004e86ffSlogin     }
44004e86ffSlogin 
45004e86ffSlogin     /// @brief 读取一个u8的数据(小端对齐)
46676b8ef6SMork     pub fn read_u8(&mut self) -> Result<u8, SystemError> {
47004e86ffSlogin         if self.pos >= self.data.len() {
48676b8ef6SMork             return Err(SystemError::E2BIG);
49004e86ffSlogin         }
50004e86ffSlogin         self.pos += 1;
51004e86ffSlogin         return Ok(self.data[self.pos - 1]);
52004e86ffSlogin     }
53004e86ffSlogin 
54004e86ffSlogin     /// @brief 读取一个u16的数据(小端对齐)
55676b8ef6SMork     pub fn read_u16(&mut self) -> Result<u16, SystemError> {
56004e86ffSlogin         if self.pos + 2 > self.data.len() {
57676b8ef6SMork             return Err(SystemError::E2BIG);
58004e86ffSlogin         }
59004e86ffSlogin         let mut res = 0u16;
60004e86ffSlogin         res |= (self.data[self.pos] as u16) & 0xff;
61004e86ffSlogin         self.pos += 1;
62004e86ffSlogin         res |= ((self.data[self.pos] as u16) & 0xff) << 8;
63004e86ffSlogin         self.pos += 1;
64004e86ffSlogin 
65004e86ffSlogin         return Ok(res);
66004e86ffSlogin     }
67004e86ffSlogin 
68004e86ffSlogin     /// @brief 读取一个u32的数据(小端对齐)
69676b8ef6SMork     pub fn read_u32(&mut self) -> Result<u32, SystemError> {
70004e86ffSlogin         if self.pos + 4 > self.data.len() {
71676b8ef6SMork             return Err(SystemError::E2BIG);
72004e86ffSlogin         }
73004e86ffSlogin         let mut res = 0u32;
74004e86ffSlogin         for i in 0..4 {
75004e86ffSlogin             res |= ((self.data[self.pos] as u32) & 0xff) << (8 * i);
76004e86ffSlogin             self.pos += 1;
77004e86ffSlogin         }
78004e86ffSlogin 
79004e86ffSlogin         return Ok(res);
80004e86ffSlogin     }
81004e86ffSlogin 
82004e86ffSlogin     /// @brief 读取一个u64的数据(小端对齐)
83676b8ef6SMork     pub fn read_u64(&mut self) -> Result<u64, SystemError> {
84004e86ffSlogin         if self.pos + 8 > self.data.len() {
85676b8ef6SMork             return Err(SystemError::E2BIG);
86004e86ffSlogin         }
87004e86ffSlogin         let mut res = 0u64;
88004e86ffSlogin         for i in 0..8 {
89004e86ffSlogin             res |= ((self.data[self.pos] as u64) & 0xff) << (8 * i);
90004e86ffSlogin             self.pos += 1;
91004e86ffSlogin         }
92004e86ffSlogin 
93004e86ffSlogin         return Ok(res);
94004e86ffSlogin     }
95004e86ffSlogin 
96004e86ffSlogin     /// @brief 精确读取与buf同样大小的数据。
97004e86ffSlogin     ///
98004e86ffSlogin     /// @param buf 要读取到的目标缓冲区
99004e86ffSlogin     ///
100004e86ffSlogin     /// @return Ok(()) 成功读取
101004e86ffSlogin     /// @retunr Err(-E2BIG) 没有这么多数据,读取失败
102676b8ef6SMork     pub fn read_exact(&mut self, buf: &mut [u8]) -> Result<(), SystemError> {
103004e86ffSlogin         if self.pos + buf.len() > self.data.len() {
104676b8ef6SMork             return Err(SystemError::E2BIG);
105004e86ffSlogin         }
106004e86ffSlogin         buf.copy_from_slice(&self.data[self.pos..self.pos + buf.len()]);
107004e86ffSlogin         self.pos += buf.len();
108004e86ffSlogin         return Ok(());
109004e86ffSlogin     }
110004e86ffSlogin 
111004e86ffSlogin     /// @brief 小端对齐,读取数据到u16数组.
112004e86ffSlogin     ///
113004e86ffSlogin     /// @param buf 目标u16数组
114676b8ef6SMork     pub fn read_u16_into(&mut self, buf: &mut [u16]) -> Result<(), SystemError> {
115004e86ffSlogin         if self.pos + buf.len() * size_of::<u16>() > self.data.len() * size_of::<u16>() {
116676b8ef6SMork             return Err(SystemError::E2BIG);
117004e86ffSlogin         }
118004e86ffSlogin 
119004e86ffSlogin         for i in 0..buf.len() {
120004e86ffSlogin             buf[i] = self.read_u16()?;
121004e86ffSlogin         }
122004e86ffSlogin 
123004e86ffSlogin         return Ok(());
124004e86ffSlogin     }
125004e86ffSlogin 
126004e86ffSlogin     /// @brief 调整游标的位置
127004e86ffSlogin     ///
128004e86ffSlogin     /// @param 调整的相对值
129004e86ffSlogin     ///
130004e86ffSlogin     /// @return Ok(新的游标位置) 调整成功,返回新的游标位置
131676b8ef6SMork     /// @return Err(SystemError::EOVERFLOW) 调整失败,游标超出正确的范围。(失败时游标位置不变)
132676b8ef6SMork     pub fn seek(&mut self, origin: SeekFrom) -> Result<usize, SystemError> {
133004e86ffSlogin         let pos: i64;
134004e86ffSlogin         match origin {
135004e86ffSlogin             SeekFrom::SeekSet(offset) => {
136004e86ffSlogin                 pos = offset;
137004e86ffSlogin             }
138004e86ffSlogin             SeekFrom::SeekCurrent(offset) => {
139004e86ffSlogin                 pos = self.pos as i64 + offset;
140004e86ffSlogin             }
141004e86ffSlogin             SeekFrom::SeekEnd(offset) => {
142004e86ffSlogin                 // 请注意,此处的offset应小于等于0,否则肯定是不合法的
143004e86ffSlogin                 pos = self.data.len() as i64 + offset;
144004e86ffSlogin             }
145004e86ffSlogin             SeekFrom::Invalid => {
146676b8ef6SMork                 return Err(SystemError::EINVAL);
147004e86ffSlogin             }
148004e86ffSlogin         }
149004e86ffSlogin 
150004e86ffSlogin         if pos < 0 || pos > self.data.len() as i64 {
151676b8ef6SMork             return Err(SystemError::EOVERFLOW);
152004e86ffSlogin         }
153004e86ffSlogin         self.pos = pos as usize;
154004e86ffSlogin         return Ok(self.pos);
155004e86ffSlogin     }
156004e86ffSlogin 
157004e86ffSlogin     /// @brief 写入一个u8的数据(小端对齐)
158676b8ef6SMork     pub fn write_u8(&mut self, value: u8) -> Result<u8, SystemError> {
159004e86ffSlogin         if self.pos >= self.data.len() {
160676b8ef6SMork             return Err(SystemError::E2BIG);
161004e86ffSlogin         }
162004e86ffSlogin 
163004e86ffSlogin         self.data[self.pos] = value;
164004e86ffSlogin         self.pos += 1;
165004e86ffSlogin 
166004e86ffSlogin         return Ok(value);
167004e86ffSlogin     }
168004e86ffSlogin 
169004e86ffSlogin     /// @brief 写入一个u16的数据(小端对齐)
170676b8ef6SMork     pub fn write_u16(&mut self, value: u16) -> Result<u16, SystemError> {
171004e86ffSlogin         if self.pos + 2 > self.data.len() {
172676b8ef6SMork             return Err(SystemError::E2BIG);
173004e86ffSlogin         }
174004e86ffSlogin 
175004e86ffSlogin         self.data[self.pos] = (value & 0xff) as u8;
176004e86ffSlogin         self.pos += 1;
177004e86ffSlogin         self.data[self.pos] = ((value >> 8) & 0xff) as u8;
178004e86ffSlogin         self.pos += 1;
179004e86ffSlogin 
180004e86ffSlogin         return Ok(value);
181004e86ffSlogin     }
182004e86ffSlogin 
183004e86ffSlogin     /// @brief 写入一个u32的数据(小端对齐)
184676b8ef6SMork     pub fn write_u32(&mut self, value: u32) -> Result<u32, SystemError> {
185004e86ffSlogin         if self.pos + 4 > self.data.len() {
186676b8ef6SMork             return Err(SystemError::E2BIG);
187004e86ffSlogin         }
188004e86ffSlogin 
189004e86ffSlogin         for i in 0..4 {
190004e86ffSlogin             self.data[self.pos] = ((value >> (i * 8)) & 0xff) as u8;
191004e86ffSlogin             self.pos += 1;
192004e86ffSlogin         }
193004e86ffSlogin 
194004e86ffSlogin         return Ok(value);
195004e86ffSlogin     }
196004e86ffSlogin 
197004e86ffSlogin     /// @brief 写入一个u64的数据(小端对齐)
198676b8ef6SMork     pub fn write_u64(&mut self, value: u64) -> Result<u64, SystemError> {
199004e86ffSlogin         if self.pos + 8 > self.data.len() {
200676b8ef6SMork             return Err(SystemError::E2BIG);
201004e86ffSlogin         }
202004e86ffSlogin 
203004e86ffSlogin         for i in 0..8 {
204004e86ffSlogin             self.data[self.pos] = ((value >> (i * 8)) & 0xff) as u8;
205004e86ffSlogin             self.pos += 1;
206004e86ffSlogin         }
207004e86ffSlogin 
208004e86ffSlogin         return Ok(value);
209004e86ffSlogin     }
210004e86ffSlogin 
211004e86ffSlogin     /// @brief 精确写入与buf同样大小的数据。
212004e86ffSlogin     ///
213004e86ffSlogin     /// @param buf 要写入到的目标缓冲区
214004e86ffSlogin     ///
215004e86ffSlogin     /// @return Ok(()) 成功写入
216004e86ffSlogin     /// @retunr Err(-E2BIG) 没有这么多数据,写入失败
217676b8ef6SMork     pub fn write_exact(&mut self, buf: &[u8]) -> Result<(), SystemError> {
218004e86ffSlogin         if self.pos + buf.len() > self.data.len() {
219676b8ef6SMork             return Err(SystemError::E2BIG);
220004e86ffSlogin         }
221004e86ffSlogin 
222004e86ffSlogin         self.data[self.pos..self.pos + buf.len()].copy_from_slice(&buf[..]);
223004e86ffSlogin         self.pos += buf.len();
224004e86ffSlogin 
225004e86ffSlogin         return Ok(());
226004e86ffSlogin     }
227004e86ffSlogin 
228004e86ffSlogin     /// @brief 获取当前的数据切片
229004e86ffSlogin     pub fn as_slice(&self) -> &[u8] {
230004e86ffSlogin         return &self.data[..];
231004e86ffSlogin     }
232004e86ffSlogin 
233004e86ffSlogin     /// @brief 获取可变数据切片
234004e86ffSlogin     pub fn as_mut_slice(&mut self) -> &mut [u8] {
235004e86ffSlogin         return &mut self.data[..];
236004e86ffSlogin     }
237004e86ffSlogin 
238004e86ffSlogin     /// @brief 获取当前游标的位置
239004e86ffSlogin     #[inline]
240004e86ffSlogin     pub fn pos(&self) -> usize {
241004e86ffSlogin         return self.pos;
242004e86ffSlogin     }
243004e86ffSlogin 
244004e86ffSlogin     /// @brief 获取缓冲区数据的大小
245004e86ffSlogin     #[inline]
246004e86ffSlogin     pub fn len(&self) -> usize {
247004e86ffSlogin         return self.data.len();
248004e86ffSlogin     }
249004e86ffSlogin }
250