summaryrefslogtreecommitdiff
path: root/graph-checker/src/geng.rs
diff options
context:
space:
mode:
Diffstat (limited to 'graph-checker/src/geng.rs')
-rw-r--r--graph-checker/src/geng.rs65
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);
+ }
+ }
+}