diff --git a/generator-native/Cargo.lock b/generator-native/Cargo.lock index fcc616a..900f843 100644 --- a/generator-native/Cargo.lock +++ b/generator-native/Cargo.lock @@ -3,3 +3,20 @@ [[package]] name = "generator-native" version = "0.1.0" +dependencies = [ + "heaparray", +] + +[[package]] +name = "heaparray" +version = "0.1.0" +source = "git+https://github.com/notflan/heaparray#6b57c19cf82a71f6bd6e566be7cf36ef1926def7" +dependencies = [ + "libc", +] + +[[package]] +name = "libc" +version = "0.2.70" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3baa92041a6fec78c687fa0cc2b3fae8884f743d672cf551bed1d6dac6988d0f" diff --git a/generator-native/Cargo.toml b/generator-native/Cargo.toml index 72c05fd..6ebb2f9 100644 --- a/generator-native/Cargo.toml +++ b/generator-native/Cargo.toml @@ -7,3 +7,4 @@ edition = "2018" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +heaparray = { git = "https://github.com/notflan/heaparray" } \ No newline at end of file diff --git a/generator-native/src/iter/file.rs b/generator-native/src/iter/file.rs new file mode 100644 index 0000000..bcd5332 --- /dev/null +++ b/generator-native/src/iter/file.rs @@ -0,0 +1,71 @@ +use std::{ + io::{ + Read, + }, +}; +use heaparray::{ + heap, +}; + +pub struct BufferedReadIter +where F: Read +{ + iter: F, + buffer: Box<[u8]>, + buffer_len: usize, +} + +impl Iterator for BufferedReadIter +{ + type Item = Box<[u8]>; + + fn next(&mut self) -> Option + { + if self.buffer_len >= self.buffer.len() { + // Buffer is full. + return Some(self.swap_out()); + } + + if let Ok(read) = self.iter.read(&mut self.buffer[self.buffer_len..]) + { + self.buffer_len += read; + if self.buffer_len ==0 { + None + } else { + Some(self.swap_out()) + } + } else { + None + } + } +} + +impl BufferedReadIter +{ + fn swap_out(&mut self) -> Box<[u8]> + { + let len = self.buffer_len; + self.buffer_len=0; + + heaparray::box_slice(&mut self.buffer[..len]) + } + + pub fn new(iter: F, buffer_len: usize) -> Self { + let buffer = heap![u8; buffer_len].into_box(); + Self { + iter, + buffer_len: 0, + buffer, + } + } +} + +pub trait ReadIterExt: Read + Sized +{ + fn into_iter(self, buffer_len: usize) -> BufferedReadIter + { + BufferedReadIter::new(self, buffer_len) + } +} +impl ReadIterExt for T{} + diff --git a/generator-native/src/iter/group.rs b/generator-native/src/iter/group.rs index 8226ff0..107aa14 100644 --- a/generator-native/src/iter/group.rs +++ b/generator-native/src/iter/group.rs @@ -43,7 +43,6 @@ where I: Iterator } } -use super::*; pub trait GroupExt: Iterator + Sized { fn group_at(self, at: usize) -> GroupIter<::Item, Self> { diff --git a/generator-native/src/iter/mod.rs b/generator-native/src/iter/mod.rs index e685fca..f043b64 100644 --- a/generator-native/src/iter/mod.rs +++ b/generator-native/src/iter/mod.rs @@ -1,3 +1,12 @@ - mod group; pub use group::*; + +mod file; +pub use file::*; + +pub mod prelude +{ + pub use super::{ + ReadIterExt, GroupExt, + }; +} diff --git a/generator-native/src/main.rs b/generator-native/src/main.rs index c5d3c1c..0ebb035 100644 --- a/generator-native/src/main.rs +++ b/generator-native/src/main.rs @@ -1,5 +1,28 @@ +extern crate heaparray; + +use std::{ + fs::{ + self, File, OpenOptions, + }, + io, + error::Error, +}; + mod iter; +use iter::prelude::*; + +fn main() -> Result<(), Box>{ + + /*let file = OpenOptions::new() + .read(true) + .open("test.txt")?; + + for buf in file.into_iter(2).group_at(2) + { + println!("{:?}", buf); +}*/ + + -fn main() { - println!("Hello, world!"); + Ok(()) }