diff --git a/algo_lib/src/graph/bfs.rs b/algo_lib/src/graph/bfs.rs index b6592c0..e79cb1f 100644 --- a/algo_lib/src/graph/bfs.rs +++ b/algo_lib/src/graph/bfs.rs @@ -4,6 +4,7 @@ use crate::graph::edges::edge_trait::EdgeTrait; use crate::graph::edges::weighted_edge::WeightedEdge; use crate::graph::graph_trait::GraphTrait; +#[derive(Debug)] pub struct BfsState { queue: VecDeque, pub dist: Vec, diff --git a/algo_lib/src/graph/edges/edge_trait.rs b/algo_lib/src/graph/edges/edge_trait.rs index ed2d91d..579f7d5 100644 --- a/algo_lib/src/graph/edges/edge_trait.rs +++ b/algo_lib/src/graph/edges/edge_trait.rs @@ -2,3 +2,13 @@ pub trait EdgeTrait: Copy + Clone { fn to(&self) -> usize; fn rev(&self, from: usize) -> Self; } + +impl EdgeTrait for usize { + fn to(&self) -> usize { + *self + } + + fn rev(&self, from: usize) -> Self { + from + } +} diff --git a/algo_lib/src/graph/graph_trait.rs b/algo_lib/src/graph/graph_trait.rs index 2d4b967..b213ced 100644 --- a/algo_lib/src/graph/graph_trait.rs +++ b/algo_lib/src/graph/graph_trait.rs @@ -11,3 +11,39 @@ where fn adj(&self, v: usize) -> &[E]; } + +impl GraphTrait for [Vec] { + fn len(&self) -> usize { + self.len() + } + + fn num_vertices(&self) -> usize { + self.len() + } + + fn num_edges(&self) -> usize { + self.iter().map(|v| v.len()).sum() + } + + fn adj(&self, v: usize) -> &[usize] { + &self[v] + } +} + +impl GraphTrait for Vec> { + fn len(&self) -> usize { + self.len() + } + + fn num_vertices(&self) -> usize { + self.len() + } + + fn num_edges(&self) -> usize { + self.iter().map(|v| v.len()).sum() + } + + fn adj(&self, v: usize) -> &[usize] { + &self[v] + } +} diff --git a/algo_lib/src/misc/rec_function.rs b/algo_lib/src/misc/rec_function.rs index 39ed784..6c257fc 100644 --- a/algo_lib/src/misc/rec_function.rs +++ b/algo_lib/src/misc/rec_function.rs @@ -1,5 +1,6 @@ // Copied from https://github.com/EgorKulikov/rust_algo/blob/master/algo_lib/src/misc/recursive_function.rs +use std::cell::UnsafeCell; use std::marker::PhantomData; macro_rules! recursive_function { @@ -12,7 +13,7 @@ macro_rules! recursive_function { where F: FnMut(&mut dyn $trait<$($type, )*Output>, $($type, )*) -> Output, { - f: F, + f: UnsafeCell, $($arg: PhantomData<$type>, )* phantom_output: PhantomData, @@ -24,7 +25,7 @@ macro_rules! recursive_function { { pub fn new(f: F) -> Self { Self { - f, + f : f.into(), $($arg: Default::default(), )* phantom_output: Default::default(), @@ -37,9 +38,8 @@ macro_rules! recursive_function { F: FnMut(&mut dyn $trait<$($type, )*Output>, $($type, )*) -> Output, { fn call(&mut self, $($arg: $type,)*) -> Output { - let const_ptr = &self.f as *const F; - let mut_ptr = const_ptr as *mut F; - unsafe { (&mut *mut_ptr)(self, $($arg, )*) } + let ptr = self.f.get(); + unsafe { (*ptr)(self, $($arg, )*) } } } } @@ -54,4 +54,4 @@ recursive_function!(RecursiveFunction5, Callable5, (Arg1 arg1, Arg2 arg2, Arg3 a recursive_function!(RecursiveFunction6, Callable6, (Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5, Arg6 arg6,)); recursive_function!(RecursiveFunction7, Callable7, (Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5, Arg6 arg6, Arg7 arg7,)); recursive_function!(RecursiveFunction8, Callable8, (Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5, Arg6 arg6, Arg7 arg7, Arg8 arg8,)); -recursive_function!(RecursiveFunction9, Callable9, (Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5, Arg6 arg6, Arg7 arg7, Arg8 arg8, Arg9 arg9,)); \ No newline at end of file +recursive_function!(RecursiveFunction9, Callable9, (Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5, Arg6 arg6, Arg7 arg7, Arg8 arg8, Arg9 arg9,));