use crate::io::{Result, SeekFrom};
#[cfg(feature = "alloc")]
use alloc::boxed::Box;
#[cfg(feature = "std")]
use std::fs::File;
#[cfg(feature = "std")]
use std::io::{BufReader, BufWriter};
#[cfg(all(feature = "std", target_has_atomic = "ptr"))]
use alloc::sync::Arc;
pub trait Seek {
fn seek(&mut self, mode: SeekFrom) -> Result<u64>;
#[inline]
fn rewind(&mut self) -> Result<()> {
self.seek(SeekFrom::Start(0))?;
Ok(())
}
#[inline]
fn seek_relative(&mut self, offset: i64) -> Result<()> {
self.seek(SeekFrom::Current(offset))?;
Ok(())
}
#[inline]
fn stream_position(&mut self) -> Result<u64> {
let position = self.seek(SeekFrom::Current(0))?;
Ok(position)
}
}
#[cfg(all(feature = "std", target_has_atomic = "ptr"))]
impl Seek for Arc<File> {
#[inline]
fn seek(&mut self, mode: SeekFrom) -> Result<u64> {
let position = std::io::Seek::seek(self, mode.into())?;
Ok(position)
}
#[inline]
fn rewind(&mut self) -> Result<()> {
std::io::Seek::rewind(self)?;
Ok(())
}
#[inline]
fn seek_relative(&mut self, offset: i64) -> Result<()> {
std::io::Seek::seek_relative(self, offset)?;
Ok(())
}
#[inline]
fn stream_position(&mut self) -> Result<u64> {
let position = std::io::Seek::stream_position(self)?;
Ok(position)
}
}
#[cfg(feature = "alloc")]
impl<S: ?Sized + Seek> Seek for Box<S> {
#[inline]
fn seek(&mut self, mode: SeekFrom) -> Result<u64> {
let position = S::seek(self, mode)?;
Ok(position)
}
}
#[cfg(feature = "std")]
impl<S: ?Sized + std::io::Seek> Seek for BufReader<S> {
#[inline]
fn seek(&mut self, mode: SeekFrom) -> Result<u64> {
let position = std::io::Seek::seek(self, mode.into())?;
Ok(position)
}
#[inline]
fn rewind(&mut self) -> Result<()> {
std::io::Seek::rewind(self)?;
Ok(())
}
#[inline]
fn seek_relative(&mut self, offset: i64) -> Result<()> {
std::io::Seek::seek_relative(self, offset)?;
Ok(())
}
#[inline]
fn stream_position(&mut self) -> Result<u64> {
let position = std::io::Seek::stream_position(self)?;
Ok(position)
}
}
#[cfg(feature = "std")]
impl<S: ?Sized + std::io::Write + std::io::Seek> Seek for BufWriter<S> {
#[inline]
fn seek(&mut self, mode: SeekFrom) -> Result<u64> {
let position = std::io::Seek::seek(self, mode.into())?;
Ok(position)
}
#[inline]
fn rewind(&mut self) -> Result<()> {
std::io::Seek::rewind(self)?;
Ok(())
}
#[inline]
fn seek_relative(&mut self, offset: i64) -> Result<()> {
std::io::Seek::seek_relative(self, offset)?;
Ok(())
}
#[inline]
fn stream_position(&mut self) -> Result<u64> {
let position = std::io::Seek::stream_position(self)?;
Ok(position)
}
}
#[cfg(feature = "std")]
impl<T: AsRef<[u8]>> Seek for std::io::Cursor<T> {
#[inline]
fn seek(&mut self, mode: SeekFrom) -> Result<u64> {
let position = std::io::Seek::seek(self, mode.into())?;
Ok(position)
}
#[inline]
fn rewind(&mut self) -> Result<()> {
std::io::Seek::rewind(self)?;
Ok(())
}
#[inline]
fn seek_relative(&mut self, offset: i64) -> Result<()> {
std::io::Seek::seek_relative(self, offset)?;
Ok(())
}
#[inline]
fn stream_position(&mut self) -> Result<u64> {
let position = std::io::Seek::stream_position(self)?;
Ok(position)
}
}
#[cfg(feature = "std")]
impl Seek for std::io::Empty {
#[inline]
fn seek(&mut self, mode: SeekFrom) -> Result<u64> {
let position = std::io::Seek::seek(self, mode.into())?;
Ok(position)
}
#[inline]
fn rewind(&mut self) -> Result<()> {
std::io::Seek::rewind(self)?;
Ok(())
}
#[inline]
fn seek_relative(&mut self, offset: i64) -> Result<()> {
std::io::Seek::seek_relative(self, offset)?;
Ok(())
}
#[inline]
fn stream_position(&mut self) -> Result<u64> {
let position = std::io::Seek::stream_position(self)?;
Ok(position)
}
}
#[cfg(feature = "std")]
impl Seek for File {
#[inline]
fn seek(&mut self, mode: SeekFrom) -> Result<u64> {
let position = std::io::Seek::seek(self, mode.into())?;
Ok(position)
}
#[inline]
fn rewind(&mut self) -> Result<()> {
std::io::Seek::rewind(self)?;
Ok(())
}
#[inline]
fn seek_relative(&mut self, offset: i64) -> Result<()> {
std::io::Seek::seek_relative(self, offset)?;
Ok(())
}
#[inline]
fn stream_position(&mut self) -> Result<u64> {
let position = std::io::Seek::stream_position(self)?;
Ok(position)
}
}
#[cfg(feature = "std")]
impl Seek for &File {
#[inline]
fn seek(&mut self, mode: SeekFrom) -> Result<u64> {
let position = std::io::Seek::seek(self, mode.into())?;
Ok(position)
}
#[inline]
fn rewind(&mut self) -> Result<()> {
std::io::Seek::rewind(self)?;
Ok(())
}
#[inline]
fn seek_relative(&mut self, offset: i64) -> Result<()> {
std::io::Seek::seek_relative(self, offset)?;
Ok(())
}
#[inline]
fn stream_position(&mut self) -> Result<u64> {
let position = std::io::Seek::stream_position(self)?;
Ok(position)
}
}
impl<S: Seek> Seek for &mut S {
#[inline]
fn seek(&mut self, mode: SeekFrom) -> Result<u64> {
S::seek(self, mode)
}
#[inline]
fn rewind(&mut self) -> Result<()> {
S::rewind(self)
}
#[inline]
fn seek_relative(&mut self, offset: i64) -> Result<()> {
S::seek_relative(self, offset)
}
#[inline]
fn stream_position(&mut self) -> Result<u64> {
S::stream_position(self)
}
}