stream_buffer/
buf.rs

1use std::marker::PhantomData;// use super::*;
2use tempfile::{SpooledTempFile};
3// use itertools::Itertools;
4use std::io::BufWriter;
5
6use super::constants::*;
7use super::types::*;
8use super::chunk::*;
9
10
11pub trait Buffer {}
12
13pub type ByteStreamBuf<F> = StreamBuffer<ByteResult, F>;
14
15pub struct StreamBuffer<T, F: FileLike> {
16    pub size: usize,
17    pub index: usize,
18    pub stream: Stream<T>,
19    pub file: F,
20    // reader: BufReader<Box<FileType>>,
21    // writer: BufWriter<Box<FileType>>,
22}
23
24pub struct StreamBuffer2<T: IterStream<S>, S, F: FileLike> {
25    pub size: usize,
26    pub index: usize,
27    pub stream: T,
28    pub file: F,
29    phantom: PhantomData<S>,
30}
31
32pub struct StreamBuffer3<T, F> 
33  where T: IntoStream<T>,
34        F: FileLike {
35    pub size: usize,
36    pub index: usize,
37    pub stream: T,
38    pub file: F,
39}
40
41
42
43pub trait BufferCreate<T, F: FileLike>: Buffer {
44    fn from_file(stream: Stream<T>, size: usize, file: F) -> Self;
45}
46
47pub trait CreateBuffer<T, F: FileLike>: Buffer {
48    fn from_file(stream: T, size: usize, file: F) -> Self;
49}
50
51pub trait BufferRead<T>: Buffer {
52    fn read(&mut self, offset: usize, size: usize) -> T;
53}
54
55impl<I, T: ChunkRead<I> + ChunkLocation + Buffer> BufferRead<I> for T {
56    fn read(&mut self, offset: usize, size: usize) -> I {
57        match self._chunk_location(offset, size) {
58            Location::BeforeIndex => self._chunk_before_index(offset, size),
59            Location::Bisected => self._chunk_bisected_by_index(offset, size),
60            Location::AtIndex => self._chunk_at_index(size),
61            Location::AfterIndex => self._chunk_after_index(offset, size)
62        }
63    }
64}
65
66
67
68impl<T, F: FileLike> Buffer for StreamBuffer<T, F> {}
69
70impl<T> StreamBuffer<T, SpooledTempFile> {
71    pub fn new(stream: Stream<T>, size: usize) -> StreamBuffer<T, SpooledTempFile> {
72        let file = SpooledTempFile::new(MAX_SIZE);
73        StreamBuffer { size, stream, file, index: START_INDEX }
74    }
75}
76
77impl<T, F: FileLike> BufferCreate<T, F> for StreamBuffer<T, F> {
78    fn from_file(stream: Stream<T>, size: usize, file: F) -> StreamBuffer<T, F> {
79        StreamBuffer { size, stream, file, index: START_INDEX }
80    }
81}
82
83impl<T: IterStream<S>, S, F: FileLike> Buffer for StreamBuffer2<T, S, F> {}
84
85impl<T: IterStream<S>, S> StreamBuffer2<T, S, SpooledTempFile>
86{
87    pub fn new(stream: T, size: usize) -> StreamBuffer2<T, S, SpooledTempFile> {
88        let file = SpooledTempFile::new(MAX_SIZE);
89        StreamBuffer2 { size, stream, file, index: START_INDEX , phantom: PhantomData }
90    }
91}
92
93impl<T: IterStream<S>, S, F: FileLike> CreateBuffer<T, F> for StreamBuffer2<T, S, F> {
94    fn from_file(stream: T, size: usize, file: F) -> StreamBuffer2<T, S, F> {
95        StreamBuffer2 { size, stream, file, index: START_INDEX, phantom: PhantomData }
96    }
97}
98
99
100// impl<T, F> CreateBuffer<T, F> for StreamBuffer<T, F> 
101//          where F: FileLike {
102//     fn from_file(stream: T, size: usize, file: F) -> StreamBuffer<T, F> {
103//         StreamBuffer { size, T, file, index: START_INDEX }
104//     }
105// }