Skip to content

Commit

Permalink
tsort: Switch to BTreeHash and BTreeSet
Browse files Browse the repository at this point in the history
Using HashMap and HashSet give a valid topological sort, but the output
will change randomly at each run.

BTree based structures will guarantee that the output is always ordered
in the same way.

This also makes the ouptut similar to the output of the C version of the
tools, on which some applications rely.
  • Loading branch information
cazou authored and sylvestre committed Jun 4, 2023
1 parent ea3e4c5 commit e4bce54
Showing 1 changed file with 4 additions and 4 deletions.
8 changes: 4 additions & 4 deletions src/uu/tsort/src/tsort.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
// * For the full copyright and license information, please view the LICENSE
// * file that was distributed with this source code.
use clap::{crate_version, Arg, Command};
use std::collections::{HashMap, HashSet};
use std::collections::{BTreeMap, BTreeSet};
use std::fs::File;
use std::io::{stdin, BufRead, BufReader, Read};
use std::path::Path;
Expand Down Expand Up @@ -103,8 +103,8 @@ pub fn uu_app() -> Command {
// but using integer may improve performance.
#[derive(Default)]
struct Graph {
in_edges: HashMap<String, HashSet<String>>,
out_edges: HashMap<String, Vec<String>>,
in_edges: BTreeMap<String, BTreeSet<String>>,
out_edges: BTreeMap<String, Vec<String>>,
result: Vec<String>,
}

Expand All @@ -122,7 +122,7 @@ impl Graph {
}

fn init_node(&mut self, n: &str) {
self.in_edges.insert(n.to_string(), HashSet::new());
self.in_edges.insert(n.to_string(), BTreeSet::new());
self.out_edges.insert(n.to_string(), vec![]);
}

Expand Down

0 comments on commit e4bce54

Please sign in to comment.