diff options
author | Matt Mastracci <matthew@mastracci.com> | 2023-07-01 18:00:14 -0600 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-07-02 00:00:14 +0000 |
commit | e746b6d80654ba4e4e26370fe6e4f784ce841d92 (patch) | |
tree | 153ffad92a96126b9ab8e906dcdabf7648755931 /core/io.rs | |
parent | b9c0e7cd550ab14fa7da7e33ed87cbeeeb9785a0 (diff) |
refactor(core): Extract deno_core (#19658)
`deno_core` is moving out! You'll find it at
https://github.com/denoland/deno_core/ once this PR lands.
Diffstat (limited to 'core/io.rs')
-rw-r--r-- | core/io.rs | 300 |
1 files changed, 0 insertions, 300 deletions
diff --git a/core/io.rs b/core/io.rs deleted file mode 100644 index c7a56d942..000000000 --- a/core/io.rs +++ /dev/null @@ -1,300 +0,0 @@ -// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license. - -use std::ops::Deref; -use std::ops::DerefMut; - -use bytes::Buf; -use serde_v8::JsBuffer; - -/// BufView is a wrapper around an underlying contiguous chunk of bytes. It can -/// be created from a [JsBuffer], [bytes::Bytes], or [Vec<u8>] and implements -/// `Deref<[u8]>` and `AsRef<[u8]>`. -/// -/// The wrapper has the ability to constrain the exposed view to a sub-region of -/// the underlying buffer. This is useful for write operations, because they may -/// have to be called multiple times, with different views onto the buffer to be -/// able to write it entirely. -pub struct BufView { - inner: BufViewInner, - cursor: usize, -} - -enum BufViewInner { - Empty, - Bytes(bytes::Bytes), - JsBuffer(JsBuffer), - Vec(Vec<u8>), -} - -impl BufView { - const fn from_inner(inner: BufViewInner) -> Self { - Self { inner, cursor: 0 } - } - - pub const fn empty() -> Self { - Self::from_inner(BufViewInner::Empty) - } - - /// Get the length of the buffer view. This is the length of the underlying - /// buffer minus the cursor position. - pub fn len(&self) -> usize { - match &self.inner { - BufViewInner::Empty => 0, - BufViewInner::Bytes(bytes) => bytes.len() - self.cursor, - BufViewInner::JsBuffer(js_buf) => js_buf.len() - self.cursor, - BufViewInner::Vec(vec) => vec.len() - self.cursor, - } - } - - /// Is the buffer view empty? - pub fn is_empty(&self) -> bool { - self.len() == 0 - } - - /// Advance the internal cursor of the buffer view by `n` bytes. - pub fn advance_cursor(&mut self, n: usize) { - assert!(self.len() >= n); - self.cursor += n; - } - - /// Reset the internal cursor of the buffer view to the beginning of the - /// buffer. Returns the old cursor position. - pub fn reset_cursor(&mut self) -> usize { - let old = self.cursor; - self.cursor = 0; - old - } -} - -impl Buf for BufView { - fn remaining(&self) -> usize { - self.len() - } - - fn chunk(&self) -> &[u8] { - self.deref() - } - - fn advance(&mut self, cnt: usize) { - self.advance_cursor(cnt) - } -} - -impl Deref for BufView { - type Target = [u8]; - - fn deref(&self) -> &[u8] { - let buf = match &self.inner { - BufViewInner::Empty => &[], - BufViewInner::Bytes(bytes) => bytes.deref(), - BufViewInner::JsBuffer(js_buf) => js_buf.deref(), - BufViewInner::Vec(vec) => vec.deref(), - }; - &buf[self.cursor..] - } -} - -impl AsRef<[u8]> for BufView { - fn as_ref(&self) -> &[u8] { - self.deref() - } -} - -impl From<JsBuffer> for BufView { - fn from(buf: JsBuffer) -> Self { - Self::from_inner(BufViewInner::JsBuffer(buf)) - } -} - -impl From<Vec<u8>> for BufView { - fn from(vec: Vec<u8>) -> Self { - Self::from_inner(BufViewInner::Vec(vec)) - } -} - -impl From<bytes::Bytes> for BufView { - fn from(buf: bytes::Bytes) -> Self { - Self::from_inner(BufViewInner::Bytes(buf)) - } -} - -impl From<BufView> for bytes::Bytes { - fn from(buf: BufView) -> Self { - match buf.inner { - BufViewInner::Empty => bytes::Bytes::new(), - BufViewInner::Bytes(bytes) => bytes, - BufViewInner::JsBuffer(js_buf) => js_buf.into(), - BufViewInner::Vec(vec) => vec.into(), - } - } -} - -/// BufMutView is a wrapper around an underlying contiguous chunk of writable -/// bytes. It can be created from a `JsBuffer` or a `Vec<u8>` and implements -/// `DerefMut<[u8]>` and `AsMut<[u8]>`. -/// -/// The wrapper has the ability to constrain the exposed view to a sub-region of -/// the underlying buffer. This is useful for write operations, because they may -/// have to be called multiple times, with different views onto the buffer to be -/// able to write it entirely. -/// -/// A `BufMutView` can be turned into a `BufView` by calling `BufMutView::into_view`. -pub struct BufMutView { - inner: BufMutViewInner, - cursor: usize, -} - -enum BufMutViewInner { - JsBuffer(JsBuffer), - Vec(Vec<u8>), -} - -impl BufMutView { - fn from_inner(inner: BufMutViewInner) -> Self { - Self { inner, cursor: 0 } - } - - pub fn new(len: usize) -> Self { - Self::from_inner(BufMutViewInner::Vec(vec![0; len])) - } - - /// Get the length of the buffer view. This is the length of the underlying - /// buffer minus the cursor position. - pub fn len(&self) -> usize { - match &self.inner { - BufMutViewInner::JsBuffer(js_buf) => js_buf.len() - self.cursor, - BufMutViewInner::Vec(vec) => vec.len() - self.cursor, - } - } - - /// Is the buffer view empty? - pub fn is_empty(&self) -> bool { - self.len() == 0 - } - - /// Advance the internal cursor of the buffer view by `n` bytes. - pub fn advance_cursor(&mut self, n: usize) { - assert!(self.len() >= n); - self.cursor += n; - } - - /// Reset the internal cursor of the buffer view to the beginning of the - /// buffer. Returns the old cursor position. - pub fn reset_cursor(&mut self) -> usize { - let old = self.cursor; - self.cursor = 0; - old - } - - /// Turn this `BufMutView` into a `BufView`. - pub fn into_view(self) -> BufView { - let inner = match self.inner { - BufMutViewInner::JsBuffer(js_buf) => BufViewInner::JsBuffer(js_buf), - BufMutViewInner::Vec(vec) => BufViewInner::Vec(vec), - }; - BufView { - inner, - cursor: self.cursor, - } - } - - /// Unwrap the underlying buffer into a `Vec<u8>`, consuming the `BufMutView`. - /// - /// This method panics when called on a `BufMutView` that was created from a - /// `JsBuffer`. - pub fn unwrap_vec(self) -> Vec<u8> { - match self.inner { - BufMutViewInner::JsBuffer(_) => { - panic!("Cannot unwrap a JsBuffer backed BufMutView into a Vec"); - } - BufMutViewInner::Vec(vec) => vec, - } - } - - /// Get a mutable reference to an underlying `Vec<u8>`. - /// - /// This method panics when called on a `BufMutView` that was created from a - /// `JsBuffer`. - pub fn get_mut_vec(&mut self) -> &mut Vec<u8> { - match &mut self.inner { - BufMutViewInner::JsBuffer(_) => { - panic!("Cannot unwrap a JsBuffer backed BufMutView into a Vec"); - } - BufMutViewInner::Vec(vec) => vec, - } - } -} - -impl Buf for BufMutView { - fn remaining(&self) -> usize { - self.len() - } - - fn chunk(&self) -> &[u8] { - self.deref() - } - - fn advance(&mut self, cnt: usize) { - self.advance_cursor(cnt) - } -} - -impl Deref for BufMutView { - type Target = [u8]; - - fn deref(&self) -> &[u8] { - let buf = match &self.inner { - BufMutViewInner::JsBuffer(js_buf) => js_buf.deref(), - BufMutViewInner::Vec(vec) => vec.deref(), - }; - &buf[self.cursor..] - } -} - -impl DerefMut for BufMutView { - fn deref_mut(&mut self) -> &mut [u8] { - let buf = match &mut self.inner { - BufMutViewInner::JsBuffer(js_buf) => js_buf.deref_mut(), - BufMutViewInner::Vec(vec) => vec.deref_mut(), - }; - &mut buf[self.cursor..] - } -} - -impl AsRef<[u8]> for BufMutView { - fn as_ref(&self) -> &[u8] { - self.deref() - } -} - -impl AsMut<[u8]> for BufMutView { - fn as_mut(&mut self) -> &mut [u8] { - self.deref_mut() - } -} - -impl From<JsBuffer> for BufMutView { - fn from(buf: JsBuffer) -> Self { - Self::from_inner(BufMutViewInner::JsBuffer(buf)) - } -} - -impl From<Vec<u8>> for BufMutView { - fn from(buf: Vec<u8>) -> Self { - Self::from_inner(BufMutViewInner::Vec(buf)) - } -} - -pub enum WriteOutcome { - Partial { nwritten: usize, view: BufView }, - Full { nwritten: usize }, -} - -impl WriteOutcome { - pub fn nwritten(&self) -> usize { - match self { - WriteOutcome::Partial { nwritten, .. } => *nwritten, - WriteOutcome::Full { nwritten } => *nwritten, - } - } -} |