1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
//! Wrapper trait for [std::io::BufReader], requires that the reader implements [std::io::Read] and [std::io::Seek]
use std::fs::File;
use std::io;

/// Allows a stdin reader to be used in the same way as a file reader, by making it possible to seek (skip data)
/// Formally it it requires implementing [std::io::Seek] but practically only the seek_relative method is used
/// and as such all other methods can be left unimplemented (return not implemented error)
pub trait BufferedReaderWrapper: io::Read + io::Seek + Send {
    /// Seek relative to the current position
    fn seek_relative(&mut self, offset: i64) -> io::Result<()>;
}

impl BufferedReaderWrapper for io::BufReader<File> {
    #[inline]
    fn seek_relative(&mut self, offset: i64) -> io::Result<()> {
        self.seek_relative(offset)
    }
}

impl<T> BufferedReaderWrapper for &mut T
where
    T: BufferedReaderWrapper + std::marker::Sync,
{
    #[inline]
    fn seek_relative(&mut self, offset: i64) -> io::Result<()> {
        (*self).seek_relative(offset)
    }
}

impl<T> BufferedReaderWrapper for Box<T>
where
    T: BufferedReaderWrapper + std::marker::Sync,
{
    #[inline]
    fn seek_relative(&mut self, offset: i64) -> io::Result<()> {
        (**self).seek_relative(offset)
    }
}