From e8c4828e9e9459f66c0b22ea379f70c4c6c3ba23 Mon Sep 17 00:00:00 2001 From: Andrew Guschin Date: Sun, 13 Aug 2023 16:05:26 +0400 Subject: Iterator now stores state inside struct --- src/main.rs | 44 ++++++++++++++++++++++++++++---------------- 1 file changed, 28 insertions(+), 16 deletions(-) (limited to 'src/main.rs') diff --git a/src/main.rs b/src/main.rs index 9e695a6..ac9995b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -5,37 +5,47 @@ use std::ptr; enum geng_iterator {} extern "C" { - fn geng_iterator_init(iter: *const geng_iterator, n: i32); - fn geng_iterator_next(iter: *const geng_iterator, g: *mut i32) -> bool; - fn printgraph(g: *const i32, n: i32); + fn geng_iterator_create( + iter: *const *mut geng_iterator, + graph_size: usize, + batch_size: usize, + ); + fn geng_iterator_next(iter: *const geng_iterator, g: *mut u32) -> bool; + fn printgraph(g: *const u32, n: usize); } -fn print_graph(g: Vec, n: usize) { +fn print_graph(g: Vec, n: usize) { unsafe { - printgraph(g.as_ptr(), n as i32); + printgraph(g.as_ptr(), n); } } struct GengIterator { pub size: usize, + iter: Box, } impl GengIterator { fn new(n: usize) -> GengIterator { - unsafe { - geng_iterator_init(ptr::null(), n as i32); - } - GengIterator { size: n } + let iter = unsafe { + let iter: *mut geng_iterator = ptr::null_mut(); + geng_iterator_create(&iter, n, 100); + Box::from_raw(iter) + }; + GengIterator { size: n, iter } } } impl Iterator for &GengIterator { - type Item = Vec; + type Item = Vec; fn next(&mut self) -> Option { let mut g = vec![0; self.size]; let res; - unsafe { res = geng_iterator_next(ptr::null(), g.as_mut_ptr()) } + unsafe { + let ptr: *const geng_iterator = &*self.iter; + res = geng_iterator_next(ptr, g.as_mut_ptr()) + } if res { Some(g) } else { @@ -45,12 +55,14 @@ impl Iterator for &GengIterator { } fn main() { - let gi = GengIterator::new(12); + let gi = GengIterator::new(2); - let q = gi.skip(1000).next(); - println!("{:?}", q); - print_graph(q.unwrap(), gi.size); - // for i in &gi { + // let q = gi.take(2).collect::>(); + // println!("{:?}", q); + // for i in q { // print_graph(i, gi.size); // } + for i in &gi { + print_graph(i, gi.size); + } } -- cgit v1.2.3