forked from M-Labs/artiq
firmware: extract io::Cursor into its own file.
Also remove unused io::CursorError.
This commit is contained in:
parent
a4ab236af3
commit
9e8f8bb669
86
artiq/firmware/libio/cursor.rs
Normal file
86
artiq/firmware/libio/cursor.rs
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
use {Read, Write};
|
||||||
|
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
|
pub struct Cursor<T> {
|
||||||
|
inner: T,
|
||||||
|
pos: usize
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T> Cursor<T> {
|
||||||
|
#[inline]
|
||||||
|
pub fn new(inner: T) -> Cursor<T> {
|
||||||
|
Cursor { inner, pos: 0 }
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
pub fn into_inner(self) -> T {
|
||||||
|
self.inner
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
pub fn get_ref(&self) -> &T {
|
||||||
|
&self.inner
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
pub fn get_mut(&mut self) -> &mut T {
|
||||||
|
&mut self.inner
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
pub fn position(&self) -> usize {
|
||||||
|
self.pos
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
pub fn set_position(&mut self, pos: usize) {
|
||||||
|
self.pos = pos
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T: AsRef<[u8]>> Read for Cursor<T> {
|
||||||
|
type ReadError = !;
|
||||||
|
|
||||||
|
fn read(&mut self, buf: &mut [u8]) -> Result<usize, Self::ReadError> {
|
||||||
|
let data = &self.inner.as_ref()[self.pos..];
|
||||||
|
let len = buf.len().min(data.len());
|
||||||
|
buf[..len].copy_from_slice(&data[..len]);
|
||||||
|
self.pos += len;
|
||||||
|
Ok(len)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> Write for Cursor<&'a mut [u8]> {
|
||||||
|
type WriteError = !;
|
||||||
|
type FlushError = !;
|
||||||
|
|
||||||
|
fn write(&mut self, buf: &[u8]) -> Result<usize, Self::WriteError> {
|
||||||
|
let data = &mut self.inner[self.pos..];
|
||||||
|
let len = buf.len().min(data.len());
|
||||||
|
data[..len].copy_from_slice(&buf[..len]);
|
||||||
|
self.pos += len;
|
||||||
|
Ok(len)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
fn flush(&mut self) -> Result<(), Self::FlushError> {
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "alloc")]
|
||||||
|
impl Write for Cursor<::alloc::Vec<u8>> {
|
||||||
|
type WriteError = !;
|
||||||
|
type FlushError = !;
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
fn write(&mut self, buf: &[u8]) -> Result<usize, Self::WriteError> {
|
||||||
|
self.inner.extend_from_slice(buf);
|
||||||
|
Ok(buf.len())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
fn flush(&mut self) -> Result<(), Self::FlushError> {
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
@ -11,9 +11,12 @@ extern crate byteorder;
|
|||||||
use core::result;
|
use core::result;
|
||||||
use core::fmt;
|
use core::fmt;
|
||||||
|
|
||||||
|
mod cursor;
|
||||||
#[cfg(feature = "byteorder")]
|
#[cfg(feature = "byteorder")]
|
||||||
pub mod proto;
|
pub mod proto;
|
||||||
|
|
||||||
|
pub use cursor::Cursor;
|
||||||
|
|
||||||
pub type Result<T, E> = result::Result<T, Error<E>>;
|
pub type Result<T, E> = result::Result<T, Error<E>>;
|
||||||
|
|
||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||||
@ -152,93 +155,3 @@ impl<'a> Write for alloc::Vec<u8> {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
|
||||||
pub enum CursorError {
|
|
||||||
EndOfBuffer
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
|
||||||
pub struct Cursor<T> {
|
|
||||||
inner: T,
|
|
||||||
pos: usize
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<T> Cursor<T> {
|
|
||||||
#[inline]
|
|
||||||
pub fn new(inner: T) -> Cursor<T> {
|
|
||||||
Cursor { inner, pos: 0 }
|
|
||||||
}
|
|
||||||
|
|
||||||
#[inline]
|
|
||||||
pub fn into_inner(self) -> T {
|
|
||||||
self.inner
|
|
||||||
}
|
|
||||||
|
|
||||||
#[inline]
|
|
||||||
pub fn get_ref(&self) -> &T {
|
|
||||||
&self.inner
|
|
||||||
}
|
|
||||||
|
|
||||||
#[inline]
|
|
||||||
pub fn get_mut(&mut self) -> &mut T {
|
|
||||||
&mut self.inner
|
|
||||||
}
|
|
||||||
|
|
||||||
#[inline]
|
|
||||||
pub fn position(&self) -> usize {
|
|
||||||
self.pos
|
|
||||||
}
|
|
||||||
|
|
||||||
#[inline]
|
|
||||||
pub fn set_position(&mut self, pos: usize) {
|
|
||||||
self.pos = pos
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<T: AsRef<[u8]>> Read for Cursor<T> {
|
|
||||||
type ReadError = !;
|
|
||||||
|
|
||||||
fn read(&mut self, buf: &mut [u8]) -> result::Result<usize, Self::ReadError> {
|
|
||||||
let data = &self.inner.as_ref()[self.pos..];
|
|
||||||
let len = buf.len().min(data.len());
|
|
||||||
buf[..len].copy_from_slice(&data[..len]);
|
|
||||||
self.pos += len;
|
|
||||||
Ok(len)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'a> Write for Cursor<&'a mut [u8]> {
|
|
||||||
type WriteError = !;
|
|
||||||
type FlushError = !;
|
|
||||||
|
|
||||||
fn write(&mut self, buf: &[u8]) -> result::Result<usize, Self::WriteError> {
|
|
||||||
let data = &mut self.inner[self.pos..];
|
|
||||||
let len = buf.len().min(data.len());
|
|
||||||
data[..len].copy_from_slice(&buf[..len]);
|
|
||||||
self.pos += len;
|
|
||||||
Ok(len)
|
|
||||||
}
|
|
||||||
|
|
||||||
#[inline]
|
|
||||||
fn flush(&mut self) -> result::Result<(), Self::FlushError> {
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(feature = "alloc")]
|
|
||||||
impl Write for Cursor<::alloc::Vec<u8>> {
|
|
||||||
type WriteError = !;
|
|
||||||
type FlushError = !;
|
|
||||||
|
|
||||||
#[inline]
|
|
||||||
fn write(&mut self, buf: &[u8]) -> result::Result<usize, Self::WriteError> {
|
|
||||||
self.inner.extend_from_slice(buf);
|
|
||||||
Ok(buf.len())
|
|
||||||
}
|
|
||||||
|
|
||||||
#[inline]
|
|
||||||
fn flush(&mut self) -> result::Result<(), Self::FlushError> {
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
Loading…
Reference in New Issue
Block a user