diff options
Diffstat (limited to 'vendor/qoi/src/utils.rs')
-rw-r--r-- | vendor/qoi/src/utils.rs | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/vendor/qoi/src/utils.rs b/vendor/qoi/src/utils.rs new file mode 100644 index 0000000..d0c37a6 --- /dev/null +++ b/vendor/qoi/src/utils.rs @@ -0,0 +1,107 @@ +#[cfg(feature = "std")] +use std::io::Write; + +use crate::error::Result; + +#[inline(always)] +#[cold] +pub const fn cold() {} + +#[inline(always)] +#[allow(unused)] +pub const fn likely(b: bool) -> bool { + if !b { + cold(); + } + b +} + +#[inline(always)] +pub const fn unlikely(b: bool) -> bool { + if b { + cold(); + } + b +} + +pub trait Writer: Sized { + fn write_one(self, v: u8) -> Result<Self>; + fn write_many(self, v: &[u8]) -> Result<Self>; + fn capacity(&self) -> usize; +} + +pub struct BytesMut<'a>(&'a mut [u8]); + +impl<'a> BytesMut<'a> { + pub fn new(buf: &'a mut [u8]) -> Self { + Self(buf) + } + + #[inline] + pub fn write_one(self, v: u8) -> Self { + if let Some((first, tail)) = self.0.split_first_mut() { + *first = v; + Self(tail) + } else { + unreachable!() + } + } + + #[inline] + pub fn write_many(self, v: &[u8]) -> Self { + if v.len() <= self.0.len() { + let (head, tail) = self.0.split_at_mut(v.len()); + head.copy_from_slice(v); + Self(tail) + } else { + unreachable!() + } + } +} + +impl<'a> Writer for BytesMut<'a> { + #[inline] + fn write_one(self, v: u8) -> Result<Self> { + Ok(BytesMut::write_one(self, v)) + } + + #[inline] + fn write_many(self, v: &[u8]) -> Result<Self> { + Ok(BytesMut::write_many(self, v)) + } + + #[inline] + fn capacity(&self) -> usize { + self.0.len() + } +} + +#[cfg(feature = "std")] +pub struct GenericWriter<W> { + writer: W, + n_written: usize, +} + +#[cfg(feature = "std")] +impl<W: Write> GenericWriter<W> { + pub const fn new(writer: W) -> Self { + Self { writer, n_written: 0 } + } +} + +#[cfg(feature = "std")] +impl<W: Write> Writer for GenericWriter<W> { + fn write_one(mut self, v: u8) -> Result<Self> { + self.n_written += 1; + self.writer.write_all(&[v]).map(|_| self).map_err(Into::into) + } + + fn write_many(mut self, v: &[u8]) -> Result<Self> { + self.n_written += v.len(); + self.writer.write_all(v).map(|_| self).map_err(Into::into) + } + + fn capacity(&self) -> usize { + usize::MAX - self.n_written + } +} |