xref: /DragonOS/kernel/src/libs/vec_cursor.rs (revision b5b571e02693d91eb6918d3b7561e088c3e7ee81)
1004e86ffSlogin #![allow(dead_code)]
2004e86ffSlogin 
3*b5b571e0SLoGin use core::mem::{size_of, size_of_val};
4004e86ffSlogin 
5004e86ffSlogin use alloc::vec::Vec;
691e9d4abSLoGin use system_error::SystemError;
7004e86ffSlogin 
891e9d4abSLoGin 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 新建一个游标
new(data: Vec<u8>) -> Self21004e86ffSlogin     pub fn new(data: Vec<u8>) -> Self {
22*b5b571e0SLoGin         return Self { data, pos: 0 };
23004e86ffSlogin     }
24004e86ffSlogin 
25004e86ffSlogin     /// @brief 创建一个全0的cursor
zerod(length: usize) -> Self26004e86ffSlogin     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 获取游标管理的数据的可变引用
get_mut(&mut self) -> &mut Vec<u8>36004e86ffSlogin     pub fn get_mut(&mut self) -> &mut Vec<u8> {
37004e86ffSlogin         return &mut self.data;
38004e86ffSlogin     }
39004e86ffSlogin 
40004e86ffSlogin     /// @brief 获取游标管理的数据的不可变引用
get_ref(&self) -> &Vec<u8>41004e86ffSlogin     pub fn get_ref(&self) -> &Vec<u8> {
42004e86ffSlogin         return &self.data;
43004e86ffSlogin     }
44004e86ffSlogin 
45004e86ffSlogin     /// @brief 读取一个u8的数据(小端对齐)
read_u8(&mut self) -> Result<u8, SystemError>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的数据(小端对齐)
read_u16(&mut self) -> Result<u16, SystemError>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的数据(小端对齐)
read_u32(&mut self) -> Result<u32, SystemError>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的数据(小端对齐)
read_u64(&mut self) -> Result<u64, SystemError>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) 没有这么多数据,读取失败
read_exact(&mut self, buf: &mut [u8]) -> Result<(), SystemError>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数组
read_u16_into(&mut self, buf: &mut [u16]) -> Result<(), SystemError>114676b8ef6SMork     pub fn read_u16_into(&mut self, buf: &mut [u16]) -> Result<(), SystemError> {
115*b5b571e0SLoGin         if self.pos + size_of_val(buf) > self.data.len() * size_of::<u16>() {
116676b8ef6SMork             return Err(SystemError::E2BIG);
117004e86ffSlogin         }
118004e86ffSlogin 
119*b5b571e0SLoGin         for item in buf.iter_mut() {
120*b5b571e0SLoGin             *item = self.read_u16()?;
121004e86ffSlogin         }
122004e86ffSlogin 
123004e86ffSlogin         return Ok(());
124004e86ffSlogin     }
125004e86ffSlogin 
126004e86ffSlogin     /// @brief 调整游标的位置
127004e86ffSlogin     ///
128004e86ffSlogin     /// @param 调整的相对值
129004e86ffSlogin     ///
130004e86ffSlogin     /// @return Ok(新的游标位置) 调整成功,返回新的游标位置
131676b8ef6SMork     /// @return Err(SystemError::EOVERFLOW) 调整失败,游标超出正确的范围。(失败时游标位置不变)
seek(&mut self, origin: SeekFrom) -> Result<usize, SystemError>132676b8ef6SMork     pub fn seek(&mut self, origin: SeekFrom) -> Result<usize, SystemError> {
133*b5b571e0SLoGin         let pos = match origin {
134*b5b571e0SLoGin             SeekFrom::SeekSet(offset) => offset,
135*b5b571e0SLoGin             SeekFrom::SeekCurrent(offset) => self.pos as i64 + offset,
136004e86ffSlogin             // 请注意,此处的offset应小于等于0,否则肯定是不合法的
137*b5b571e0SLoGin             SeekFrom::SeekEnd(offset) => self.data.len() as i64 + offset,
138004e86ffSlogin             SeekFrom::Invalid => {
139676b8ef6SMork                 return Err(SystemError::EINVAL);
140004e86ffSlogin             }
141*b5b571e0SLoGin         };
142004e86ffSlogin 
143004e86ffSlogin         if pos < 0 || pos > self.data.len() as i64 {
144676b8ef6SMork             return Err(SystemError::EOVERFLOW);
145004e86ffSlogin         }
146004e86ffSlogin         self.pos = pos as usize;
147004e86ffSlogin         return Ok(self.pos);
148004e86ffSlogin     }
149004e86ffSlogin 
150004e86ffSlogin     /// @brief 写入一个u8的数据(小端对齐)
write_u8(&mut self, value: u8) -> Result<u8, SystemError>151676b8ef6SMork     pub fn write_u8(&mut self, value: u8) -> Result<u8, SystemError> {
152004e86ffSlogin         if self.pos >= self.data.len() {
153676b8ef6SMork             return Err(SystemError::E2BIG);
154004e86ffSlogin         }
155004e86ffSlogin 
156004e86ffSlogin         self.data[self.pos] = value;
157004e86ffSlogin         self.pos += 1;
158004e86ffSlogin 
159004e86ffSlogin         return Ok(value);
160004e86ffSlogin     }
161004e86ffSlogin 
162004e86ffSlogin     /// @brief 写入一个u16的数据(小端对齐)
write_u16(&mut self, value: u16) -> Result<u16, SystemError>163676b8ef6SMork     pub fn write_u16(&mut self, value: u16) -> Result<u16, SystemError> {
164004e86ffSlogin         if self.pos + 2 > self.data.len() {
165676b8ef6SMork             return Err(SystemError::E2BIG);
166004e86ffSlogin         }
167004e86ffSlogin 
168004e86ffSlogin         self.data[self.pos] = (value & 0xff) as u8;
169004e86ffSlogin         self.pos += 1;
170004e86ffSlogin         self.data[self.pos] = ((value >> 8) & 0xff) as u8;
171004e86ffSlogin         self.pos += 1;
172004e86ffSlogin 
173004e86ffSlogin         return Ok(value);
174004e86ffSlogin     }
175004e86ffSlogin 
176004e86ffSlogin     /// @brief 写入一个u32的数据(小端对齐)
write_u32(&mut self, value: u32) -> Result<u32, SystemError>177676b8ef6SMork     pub fn write_u32(&mut self, value: u32) -> Result<u32, SystemError> {
178004e86ffSlogin         if self.pos + 4 > self.data.len() {
179676b8ef6SMork             return Err(SystemError::E2BIG);
180004e86ffSlogin         }
181004e86ffSlogin 
182004e86ffSlogin         for i in 0..4 {
183004e86ffSlogin             self.data[self.pos] = ((value >> (i * 8)) & 0xff) as u8;
184004e86ffSlogin             self.pos += 1;
185004e86ffSlogin         }
186004e86ffSlogin 
187004e86ffSlogin         return Ok(value);
188004e86ffSlogin     }
189004e86ffSlogin 
190004e86ffSlogin     /// @brief 写入一个u64的数据(小端对齐)
write_u64(&mut self, value: u64) -> Result<u64, SystemError>191676b8ef6SMork     pub fn write_u64(&mut self, value: u64) -> Result<u64, SystemError> {
192004e86ffSlogin         if self.pos + 8 > self.data.len() {
193676b8ef6SMork             return Err(SystemError::E2BIG);
194004e86ffSlogin         }
195004e86ffSlogin 
196004e86ffSlogin         for i in 0..8 {
197004e86ffSlogin             self.data[self.pos] = ((value >> (i * 8)) & 0xff) as u8;
198004e86ffSlogin             self.pos += 1;
199004e86ffSlogin         }
200004e86ffSlogin 
201004e86ffSlogin         return Ok(value);
202004e86ffSlogin     }
203004e86ffSlogin 
204004e86ffSlogin     /// @brief 精确写入与buf同样大小的数据。
205004e86ffSlogin     ///
206004e86ffSlogin     /// @param buf 要写入到的目标缓冲区
207004e86ffSlogin     ///
208004e86ffSlogin     /// @return Ok(()) 成功写入
209004e86ffSlogin     /// @retunr Err(-E2BIG) 没有这么多数据,写入失败
write_exact(&mut self, buf: &[u8]) -> Result<(), SystemError>210676b8ef6SMork     pub fn write_exact(&mut self, buf: &[u8]) -> Result<(), SystemError> {
211004e86ffSlogin         if self.pos + buf.len() > self.data.len() {
212676b8ef6SMork             return Err(SystemError::E2BIG);
213004e86ffSlogin         }
214004e86ffSlogin 
215*b5b571e0SLoGin         self.data[self.pos..self.pos + buf.len()].copy_from_slice(buf);
216004e86ffSlogin         self.pos += buf.len();
217004e86ffSlogin 
218004e86ffSlogin         return Ok(());
219004e86ffSlogin     }
220004e86ffSlogin 
221004e86ffSlogin     /// @brief 获取当前的数据切片
as_slice(&self) -> &[u8]222004e86ffSlogin     pub fn as_slice(&self) -> &[u8] {
223004e86ffSlogin         return &self.data[..];
224004e86ffSlogin     }
225004e86ffSlogin 
226004e86ffSlogin     /// @brief 获取可变数据切片
as_mut_slice(&mut self) -> &mut [u8]227004e86ffSlogin     pub fn as_mut_slice(&mut self) -> &mut [u8] {
228004e86ffSlogin         return &mut self.data[..];
229004e86ffSlogin     }
230004e86ffSlogin 
231004e86ffSlogin     /// @brief 获取当前游标的位置
232004e86ffSlogin     #[inline]
pos(&self) -> usize233004e86ffSlogin     pub fn pos(&self) -> usize {
234004e86ffSlogin         return self.pos;
235004e86ffSlogin     }
236004e86ffSlogin 
237004e86ffSlogin     /// @brief 获取缓冲区数据的大小
238004e86ffSlogin     #[inline]
len(&self) -> usize239004e86ffSlogin     pub fn len(&self) -> usize {
240004e86ffSlogin         return self.data.len();
241004e86ffSlogin     }
242004e86ffSlogin }
243