1- // hijack HashMap for performance
2- type HashMap < K , V > = std:: collections:: HashMap < K , V , rustc_hash:: FxBuildHasher > ;
3-
1+ use rustc_hash:: FxHashMap ;
42use std:: ops:: RangeInclusive ;
53
64use uucore:: error:: UResult ;
@@ -42,12 +40,16 @@ pub(crate) struct NonrepeatingIterator<'a> {
4240
4341enum Values {
4442 Full ( Vec < u64 > ) ,
45- Sparse ( RangeInclusive < u64 > , HashMap < u64 , u64 > ) ,
43+ Sparse ( RangeInclusive < u64 > , FxHashMap < u64 , u64 > ) ,
4644}
4745
4846impl < ' a > NonrepeatingIterator < ' a > {
4947 pub ( crate ) fn new ( range : RangeInclusive < u64 > , rng : & ' a mut WrappedRng ) -> Self {
50- let values = Values :: Sparse ( range, HashMap :: default ( ) ) ;
48+ let cap = ( range. size_hint ( ) . 0 / 8 ) as usize ;
49+ let values = Values :: Sparse (
50+ range,
51+ FxHashMap :: with_capacity_and_hasher ( cap, Default :: default ( ) ) ,
52+ ) ;
5153 NonrepeatingIterator { rng, values }
5254 }
5355
@@ -96,8 +98,7 @@ impl Iterator for NonrepeatingIterator<'_> {
9698 Values :: Full ( _) => ( ) ,
9799 Values :: Sparse ( range, _) if range. is_empty ( ) => return None ,
98100 Values :: Sparse ( range, items) => {
99- let range_len = range. size_hint ( ) . 0 as u64 ;
100- if items. len ( ) as u64 >= range_len / 8 {
101+ if items. len ( ) as u64 >= items. capacity ( ) as u64 {
101102 self . values = Values :: Full ( hashmap_to_vec ( range. clone ( ) , items) ) ;
102103 }
103104 }
@@ -107,7 +108,7 @@ impl Iterator for NonrepeatingIterator<'_> {
107108 }
108109}
109110
110- fn hashmap_to_vec ( range : RangeInclusive < u64 > , map : & HashMap < u64 , u64 > ) -> Vec < u64 > {
111+ fn hashmap_to_vec ( range : RangeInclusive < u64 > , map : & FxHashMap < u64 , u64 > ) -> Vec < u64 > {
111112 let lookup = |idx| * map. get ( & idx) . unwrap_or ( & idx) ;
112113 range. rev ( ) . map ( lookup) . collect ( )
113114}
0 commit comments