diff options
| author | Andrew Guschin <guschin@altlinux.org> | 2024-03-31 18:36:27 +0500 |
|---|---|---|
| committer | Andrew Guschin <guschin@altlinux.org> | 2024-03-31 18:36:27 +0500 |
| commit | f7aa97e10a2fbddb76e1893b7deb193ad56e7192 (patch) | |
| tree | dab29cd1166edee5c096bdfc45d1c6ab509107f8 /graph-checker/src/geng.rs | |
| parent | b294692a8251eb9c4ea8f3e78651d88fc6efd792 (diff) | |
latest version
Diffstat (limited to 'graph-checker/src/geng.rs')
| -rw-r--r-- | graph-checker/src/geng.rs | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/graph-checker/src/geng.rs b/graph-checker/src/geng.rs new file mode 100644 index 0000000..a998b28 --- /dev/null +++ b/graph-checker/src/geng.rs @@ -0,0 +1,65 @@ +use std::iter::Iterator; +use std::ptr; + +#[allow(non_camel_case_types)] +enum geng_iterator {} + +extern "C" { + 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 geng_iterator_destroy(iter: *const geng_iterator); + fn printgraph(g: *const u32, n: usize); +} + +fn print_graph(g: Vec<u32>, n: usize) { + unsafe { + printgraph(g.as_ptr(), n); + } +} + +pub struct GengIterator { + pub size: usize, + iter: Box<geng_iterator>, +} + +impl GengIterator { + fn new(n: usize) -> GengIterator { + let iter = unsafe { + let iter: *mut geng_iterator = ptr::null_mut(); + geng_iterator_create(&iter, n, 10000); + Box::from_raw(iter) + }; + GengIterator { size: n, iter } + } +} + +impl Iterator for &GengIterator { + type Item = Vec<u32>; + + fn next(&mut self) -> Option<Self::Item> { + let mut g = vec![0; self.size]; + let res; + unsafe { + let ptr: *const geng_iterator = &*self.iter; + res = geng_iterator_next(ptr, g.as_mut_ptr()) + } + if res { + Some(g) + } else { + None + } + } +} + +impl Drop for GengIterator { + fn drop(&mut self) { + unsafe { + let ptr: *const geng_iterator = &*self.iter; + geng_iterator_destroy(ptr); + } + } +} |