9 //! |
9 //! |
10 //! Used to counts the references to directories in a manifest or dirstate. |
10 //! Used to counts the references to directories in a manifest or dirstate. |
11 use crate::utils::hg_path::{HgPath, HgPathBuf}; |
11 use crate::utils::hg_path::{HgPath, HgPathBuf}; |
12 use crate::{ |
12 use crate::{ |
13 dirstate::EntryState, utils::files, DirstateEntry, DirstateMapError, |
13 dirstate::EntryState, utils::files, DirstateEntry, DirstateMapError, |
|
14 FastHashMap, |
14 }; |
15 }; |
15 use std::collections::hash_map::{self, Entry}; |
16 use std::collections::hash_map::{self, Entry}; |
16 use std::collections::HashMap; |
|
17 |
17 |
18 // could be encapsulated if we care API stability more seriously |
18 // could be encapsulated if we care API stability more seriously |
19 pub type DirsMultisetIter<'a> = hash_map::Keys<'a, HgPathBuf, u32>; |
19 pub type DirsMultisetIter<'a> = hash_map::Keys<'a, HgPathBuf, u32>; |
20 |
20 |
21 #[derive(PartialEq, Debug)] |
21 #[derive(PartialEq, Debug)] |
22 pub struct DirsMultiset { |
22 pub struct DirsMultiset { |
23 inner: HashMap<HgPathBuf, u32>, |
23 inner: FastHashMap<HgPathBuf, u32>, |
24 } |
24 } |
25 |
25 |
26 impl DirsMultiset { |
26 impl DirsMultiset { |
27 /// Initializes the multiset from a dirstate. |
27 /// Initializes the multiset from a dirstate. |
28 /// |
28 /// |
29 /// If `skip_state` is provided, skips dirstate entries with equal state. |
29 /// If `skip_state` is provided, skips dirstate entries with equal state. |
30 pub fn from_dirstate( |
30 pub fn from_dirstate( |
31 vec: &HashMap<HgPathBuf, DirstateEntry>, |
31 vec: &FastHashMap<HgPathBuf, DirstateEntry>, |
32 skip_state: Option<EntryState>, |
32 skip_state: Option<EntryState>, |
33 ) -> Self { |
33 ) -> Self { |
34 let mut multiset = DirsMultiset { |
34 let mut multiset = DirsMultiset { |
35 inner: HashMap::new(), |
35 inner: FastHashMap::default(), |
36 }; |
36 }; |
37 |
37 |
38 for (filename, DirstateEntry { state, .. }) in vec { |
38 for (filename, DirstateEntry { state, .. }) in vec { |
39 // This `if` is optimized out of the loop |
39 // This `if` is optimized out of the loop |
40 if let Some(skip) = skip_state { |
40 if let Some(skip) = skip_state { |
241 |
240 |
242 #[test] |
241 #[test] |
243 fn test_dirsmultiset_new_empty() { |
242 fn test_dirsmultiset_new_empty() { |
244 let new = DirsMultiset::from_manifest(&vec![]); |
243 let new = DirsMultiset::from_manifest(&vec![]); |
245 let expected = DirsMultiset { |
244 let expected = DirsMultiset { |
246 inner: HashMap::new(), |
245 inner: FastHashMap::default(), |
247 }; |
246 }; |
248 assert_eq!(expected, new); |
247 assert_eq!(expected, new); |
249 |
248 |
250 let new = DirsMultiset::from_dirstate(&HashMap::new(), None); |
249 let new = DirsMultiset::from_dirstate(&FastHashMap::default(), None); |
251 let expected = DirsMultiset { |
250 let expected = DirsMultiset { |
252 inner: HashMap::new(), |
251 inner: FastHashMap::default(), |
253 }; |
252 }; |
254 assert_eq!(expected, new); |
253 assert_eq!(expected, new); |
255 } |
254 } |
256 |
255 |
257 #[test] |
256 #[test] |