mononoke: use common traits from NodeFrontier

Summary: Address aslpavel's comments from D13275471

Reviewed By: aslpavel

Differential Revision: D13301218

fbshipit-source-id: 5e51dd3b19a6cd41ae9b4071ec3edb2f0c81999c
This commit is contained in:
Stanislau Hlebik 2018-12-03 05:04:26 -08:00 committed by Facebook Github Bot
parent a9d81657d0
commit bd7246dcf7
3 changed files with 31 additions and 21 deletions

View File

@ -4,8 +4,9 @@
// This software may be used and distributed according to the terms of the
// GNU General Public License version 2 or any later version.
use std::collections::{HashMap, HashSet};
use std::collections::{hash_map, HashMap, HashSet};
use std::default::Default;
use std::iter::{Extend, FromIterator};
use std::sync::Arc;
use failure::Error;
@ -38,6 +39,31 @@ impl Default for NodeFrontier {
}
}
impl IntoIterator for NodeFrontier {
type Item = (Generation, HashSet<ChangesetId>);
type IntoIter = hash_map::IntoIter<Generation, HashSet<ChangesetId>>;
fn into_iter(self) -> Self::IntoIter {
self.gen_map.into_iter()
}
}
impl Extend<(ChangesetId, Generation)> for NodeFrontier {
fn extend<T: IntoIterator<Item = (ChangesetId, Generation)>>(&mut self, iter: T) {
for edge_pair in iter {
self.insert(edge_pair);
}
}
}
impl FromIterator<(ChangesetId, Generation)> for NodeFrontier {
fn from_iter<I: IntoIterator<Item = (ChangesetId, Generation)>>(iter: I) -> Self {
let mut frontier = NodeFrontier::default();
frontier.extend(iter);
frontier
}
}
impl NodeFrontier {
pub fn new(input: HashMap<Generation, HashSet<ChangesetId>>) -> Self {
let mut gen_map = HashMap::new();
@ -53,18 +79,6 @@ impl NodeFrontier {
}
}
pub fn from_pairs(node_gen_pairs: Vec<(ChangesetId, Generation)>) -> Self {
let mut frontier = NodeFrontier::default();
frontier.insert_iter(node_gen_pairs.into_iter());
frontier
}
pub fn insert_iter(&mut self, iter: impl IntoIterator<Item = (ChangesetId, Generation)>) {
for edge_pair in iter {
self.insert(edge_pair);
}
}
pub fn get(&self, gen: &Generation) -> Option<&HashSet<ChangesetId>> {
self.gen_map.get(gen)
}
@ -94,10 +108,6 @@ impl NodeFrontier {
)
}
pub fn into_map(self) -> HashMap<Generation, HashSet<ChangesetId>> {
self.gen_map
}
pub fn len(&self) -> usize {
self.gen_map.len()
}

View File

@ -591,9 +591,9 @@ fn process_frontier(
}
})
.map(move |gen_cs| {
node_frontier.insert_iter(gen_cs.into_iter());
node_frontier.extend(gen_cs);
for (gen, s) in skipped_frontier.into_map() {
for (gen, s) in skipped_frontier {
for entry in s {
node_frontier.insert((entry, gen));
}

View File

@ -24,7 +24,7 @@
/// Mercurial pull to find commits that need to be sent to a client.
use std::collections::{BTreeMap, HashSet};
use std::collections::hash_set::IntoIter;
use std::iter;
use std::iter::{self, FromIterator};
use std::sync::Arc;
use failure::prelude::*;
@ -211,7 +211,7 @@ impl DifferenceOfUnionsOfAncestorsNodeStream {
// for it (see drain below)
current_generation: Generation::max_gen(),
pending_changesets: SelectAll::new(),
exclude_ancestors_future: ok(NodeFrontier::from_pairs(exclude_generations))
exclude_ancestors_future: ok(NodeFrontier::from_iter(exclude_generations))
.boxify(),
current_exclude_generation,
drain: hashset!{}.into_iter().peekable(),