Skip to main content

fera_graph/graphs/
common.rs

1// This Source Code Form is subject to the terms of the Mozilla Public
2// License, v. 2.0. If a copy of the MPL was not distributed with this
3// file, You can obtain one at http://mozilla.org/MPL/2.0/.
4
5use 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}