io.rs 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. use bindings::EFAULT;
  2. use crate::prelude::*;
  3. use core::{fmt::Write, mem::MaybeUninit};
  4. #[must_use]
  5. pub enum FillResult {
  6. Done(usize),
  7. Partial(usize),
  8. Full,
  9. }
  10. impl FillResult {
  11. pub fn ok_or(self, err: u32) -> KResult<()> {
  12. match self {
  13. FillResult::Done(_) => Ok(()),
  14. _ => Err(err),
  15. }
  16. }
  17. pub fn should_stop(self) -> bool {
  18. return !matches!(self, FillResult::Done(_));
  19. }
  20. pub fn allow_partial(self) -> usize {
  21. match self {
  22. FillResult::Done(n) | FillResult::Partial(n) => n,
  23. FillResult::Full => 0,
  24. }
  25. }
  26. }
  27. pub trait Buffer {
  28. fn total(&self) -> usize;
  29. fn wrote(&self) -> usize;
  30. #[must_use]
  31. fn fill(&mut self, data: &[u8]) -> KResult<FillResult>;
  32. fn available(&self) -> usize {
  33. self.total() - self.wrote()
  34. }
  35. }
  36. pub trait BufferFill<T: Copy> {
  37. fn copy(&mut self, object: &T) -> KResult<FillResult>;
  38. }
  39. impl<T: Copy, B: Buffer + ?Sized> BufferFill<T> for B {
  40. fn copy(&mut self, object: &T) -> KResult<FillResult> {
  41. let ptr = object as *const T as *const u8;
  42. let len = core::mem::size_of::<T>();
  43. // SAFETY: `object` is a valid object.
  44. self.fill(unsafe { core::slice::from_raw_parts(ptr, len) })
  45. }
  46. }
  47. pub struct UninitBuffer<'lt, T: Copy + Sized> {
  48. data: Box<MaybeUninit<T>>,
  49. buffer: RawBuffer<'lt>,
  50. }
  51. impl<'lt, T: Copy + Sized> UninitBuffer<'lt, T> {
  52. pub fn new() -> Self {
  53. let mut data = Box::new(MaybeUninit::uninit());
  54. let ptr = data.as_mut_ptr();
  55. Self {
  56. data,
  57. buffer: RawBuffer::new_from_slice(unsafe {
  58. core::slice::from_raw_parts_mut(ptr as *mut u8, core::mem::size_of::<T>())
  59. }),
  60. }
  61. }
  62. pub fn assume_filled_ref(&self) -> KResult<&T> {
  63. if !self.buffer.filled() {
  64. return Err(EFAULT);
  65. }
  66. Ok(unsafe { self.data.assume_init_ref() })
  67. }
  68. pub fn assume_init(self) -> Option<T> {
  69. if self.buffer.filled() {
  70. Some(unsafe { *self.data.assume_init() })
  71. } else {
  72. None
  73. }
  74. }
  75. }
  76. impl<'lt, T: Copy + Sized> Buffer for UninitBuffer<'lt, T> {
  77. fn total(&self) -> usize {
  78. self.buffer.total()
  79. }
  80. fn wrote(&self) -> usize {
  81. self.buffer.wrote()
  82. }
  83. fn fill(&mut self, data: &[u8]) -> KResult<FillResult> {
  84. self.buffer.fill(data)
  85. }
  86. }
  87. pub struct RawBuffer<'lt> {
  88. buf: *mut u8,
  89. tot: usize,
  90. cur: usize,
  91. _phantom: core::marker::PhantomData<&'lt mut u8>,
  92. }
  93. impl<'lt> RawBuffer<'lt> {
  94. pub fn new_from_mut<T: Copy + Sized>(buf: &'lt mut T) -> Self {
  95. Self {
  96. buf: buf as *mut T as *mut u8,
  97. tot: core::mem::size_of::<T>(),
  98. cur: 0,
  99. _phantom: core::marker::PhantomData,
  100. }
  101. }
  102. pub fn new_from_slice<T: Copy + Sized>(buf: &'lt mut [T]) -> Self {
  103. Self {
  104. buf: buf.as_mut_ptr() as *mut u8,
  105. tot: core::mem::size_of::<T>() * buf.len(),
  106. cur: 0,
  107. _phantom: core::marker::PhantomData,
  108. }
  109. }
  110. pub fn new_from_raw(buf: *mut u8, tot: usize) -> Self {
  111. Self {
  112. buf,
  113. tot,
  114. cur: 0,
  115. _phantom: core::marker::PhantomData,
  116. }
  117. }
  118. pub fn count(&self) -> usize {
  119. self.cur
  120. }
  121. pub fn total(&self) -> usize {
  122. self.tot
  123. }
  124. pub fn available(&self) -> usize {
  125. self.total() - self.count()
  126. }
  127. pub fn filled(&self) -> bool {
  128. self.count() == self.total()
  129. }
  130. pub fn fill(&mut self, data: &[u8]) -> KResult<FillResult> {
  131. match self.available() {
  132. n if n == 0 => Ok(FillResult::Full),
  133. n if n < data.len() => {
  134. unsafe {
  135. core::ptr::copy_nonoverlapping(data.as_ptr(), self.buf.add(self.count()), n);
  136. }
  137. self.cur += n;
  138. Ok(FillResult::Partial(n))
  139. }
  140. _ => {
  141. unsafe {
  142. core::ptr::copy_nonoverlapping(
  143. data.as_ptr(),
  144. self.buf.add(self.count()),
  145. data.len(),
  146. );
  147. }
  148. self.cur += data.len();
  149. Ok(FillResult::Done(data.len()))
  150. }
  151. }
  152. }
  153. }
  154. impl Buffer for RawBuffer<'_> {
  155. fn total(&self) -> usize {
  156. RawBuffer::total(self)
  157. }
  158. fn wrote(&self) -> usize {
  159. self.count()
  160. }
  161. fn fill(&mut self, data: &[u8]) -> KResult<FillResult> {
  162. RawBuffer::fill(self, data)
  163. }
  164. }
  165. pub struct ByteBuffer<'lt> {
  166. buf: &'lt mut [u8],
  167. cur: usize,
  168. }
  169. impl<'lt> ByteBuffer<'lt> {
  170. pub fn new(buf: &'lt mut [u8]) -> Self {
  171. Self { buf, cur: 0 }
  172. }
  173. pub fn available(&self) -> usize {
  174. self.buf.len() - self.cur
  175. }
  176. pub fn data(&self) -> &[u8] {
  177. &self.buf[..self.cur]
  178. }
  179. }
  180. impl Buffer for ByteBuffer<'_> {
  181. fn total(&self) -> usize {
  182. self.buf.len()
  183. }
  184. fn fill(&mut self, data: &[u8]) -> KResult<FillResult> {
  185. match self.available() {
  186. n if n == 0 => Ok(FillResult::Full),
  187. n if n < data.len() => {
  188. self.buf[self.cur..].copy_from_slice(&data[..n]);
  189. self.cur += n;
  190. Ok(FillResult::Partial(n))
  191. }
  192. _ => {
  193. self.buf[self.cur..self.cur + data.len()].copy_from_slice(data);
  194. self.cur += data.len();
  195. Ok(FillResult::Done(data.len()))
  196. }
  197. }
  198. }
  199. fn wrote(&self) -> usize {
  200. self.cur
  201. }
  202. }
  203. impl Write for RawBuffer<'_> {
  204. fn write_str(&mut self, s: &str) -> core::fmt::Result {
  205. match self.fill(s.as_bytes()) {
  206. Ok(FillResult::Done(_)) => Ok(()),
  207. _ => Err(core::fmt::Error),
  208. }
  209. }
  210. }