fera_graph/graphs/
common.rs1use prelude::*;
6use rand::Rng;
7
8pub struct OutNeighborFromOutEdge<'a, G: 'a, I> {
9 g: &'a G,
10 iter: I,
11}
12
13impl<'a, G, I> OutNeighborFromOutEdge<'a, G, I>
14where
15 I: Iterator<Item = Edge<G>>,
16 G: 'a + WithEdge,
17{
18 pub fn new(g: &'a G, iter: I) -> Self {
19 OutNeighborFromOutEdge { g: g, iter: iter }
20 }
21}
22
23impl<'a, G, I> Iterator for OutNeighborFromOutEdge<'a, G, I>
24where
25 I: Iterator<Item = Edge<G>>,
26 G: 'a + WithEdge,
27{
28 type Item = Vertex<G>;
29
30 #[inline]
31 fn next(&mut self) -> Option<Self::Item> {
32 self.iter.next().map(|e| self.g.target(e))
33 }
34
35 #[inline]
36 fn size_hint(&self) -> (usize, Option<usize>) {
37 self.iter.size_hint()
38 }
39}
40
41impl<'a, G, I> ExactSizeIterator for OutNeighborFromOutEdge<'a, G, I>
42where
43 I: Iterator<Item = Edge<G>> + ExactSizeIterator,
44 G: 'a + WithEdge,
45{
46 #[inline]
47 fn len(&self) -> usize {
48 self.iter.len()
49 }
50}
51
52pub(crate) fn gen_range_bool<R: Rng>(to: usize, mut rng: R) -> Option<(usize, bool)> {
53 if to == 0 {
54 return None;
55 }
56 if let Some(to) = to.checked_mul(2) {
57 let i = rng.gen_range(0, to);
58 Some((i / 2, i % 2 == 0))
59 } else {
60 Some((rng.gen_range(0, to), rng.gen()))
61 }
62}