1use std::marker::PhantomData;use tempfile::{SpooledTempFile};
3use 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 }
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