@@ -26,6 +26,7 @@ use std::fmt;
26
26
use self :: core:: IndexMapCore ;
27
27
use equivalent:: Equivalent ;
28
28
use util:: third;
29
+ use EntryVec ;
29
30
use { Bucket , Entries , HashValue } ;
30
31
31
32
pub use self :: core:: { Entry , OccupiedEntry , VacantEntry } ;
@@ -105,23 +106,23 @@ impl<K, V, S> Entries for IndexMap<K, V, S> {
105
106
type Entry = Bucket < K , V > ;
106
107
107
108
#[ inline]
108
- fn into_entries ( self ) -> Vec < Self :: Entry > {
109
+ fn into_entries ( self ) -> EntryVec < Self :: Entry > {
109
110
self . core . into_entries ( )
110
111
}
111
112
112
113
#[ inline]
113
- fn as_entries ( & self ) -> & [ Self :: Entry ] {
114
+ fn as_entries ( & self ) -> & EntryVec < Self :: Entry > {
114
115
self . core . as_entries ( )
115
116
}
116
117
117
118
#[ inline]
118
- fn as_entries_mut ( & mut self ) -> & mut [ Self :: Entry ] {
119
+ fn as_entries_mut ( & mut self ) -> & mut EntryVec < Self :: Entry > {
119
120
self . core . as_entries_mut ( )
120
121
}
121
122
122
123
fn with_entries < F > ( & mut self , f : F )
123
124
where
124
- F : FnOnce ( & mut [ Self :: Entry ] ) ,
125
+ F : FnOnce ( & mut EntryVec < Self :: Entry > ) ,
125
126
{
126
127
self . core . with_entries ( f) ;
127
128
}
@@ -622,6 +623,8 @@ where
622
623
K : Ord ,
623
624
{
624
625
self . with_entries ( |entries| {
626
+ #[ cfg( feature = "amortize" ) ]
627
+ let entries = entries. make_contiguous ( ) ;
625
628
entries. sort_by ( |a, b| Ord :: cmp ( & a. key , & b. key ) ) ;
626
629
} ) ;
627
630
}
@@ -639,6 +642,8 @@ where
639
642
F : FnMut ( & K , & V , & K , & V ) -> Ordering ,
640
643
{
641
644
self . with_entries ( move |entries| {
645
+ #[ cfg( feature = "amortize" ) ]
646
+ let entries = entries. make_contiguous ( ) ;
642
647
entries. sort_by ( move |a, b| cmp ( & a. key , & a. value , & b. key , & b. value ) ) ;
643
648
} ) ;
644
649
}
@@ -652,7 +657,11 @@ where
652
657
F : FnMut ( & K , & V , & K , & V ) -> Ordering ,
653
658
{
654
659
let mut entries = self . into_entries ( ) ;
655
- entries. sort_by ( move |a, b| cmp ( & a. key , & a. value , & b. key , & b. value ) ) ;
660
+ {
661
+ #[ cfg( feature = "amortize" ) ]
662
+ let entries = entries. make_contiguous ( ) ;
663
+ entries. sort_by ( move |a, b| cmp ( & a. key , & a. value , & b. key , & b. value ) ) ;
664
+ }
656
665
IntoIter {
657
666
iter : entries. into_iter ( ) ,
658
667
}
@@ -720,10 +729,6 @@ impl<K, V, S> IndexMap<K, V, S> {
720
729
}
721
730
}
722
731
723
- use std:: slice:: Iter as SliceIter ;
724
- use std:: slice:: IterMut as SliceIterMut ;
725
- use std:: vec:: IntoIter as VecIntoIter ;
726
-
727
732
/// An iterator over the keys of a `IndexMap`.
728
733
///
729
734
/// This `struct` is created by the [`keys`] method on [`IndexMap`]. See its
@@ -732,7 +737,7 @@ use std::vec::IntoIter as VecIntoIter;
732
737
/// [`keys`]: struct.IndexMap.html#method.keys
733
738
/// [`IndexMap`]: struct.IndexMap.html
734
739
pub struct Keys < ' a , K : ' a , V : ' a > {
735
- pub ( crate ) iter : SliceIter < ' a , Bucket < K , V > > ,
740
+ pub ( crate ) iter : < & ' a EntryVec < Bucket < K , V > > as IntoIterator > :: IntoIter ,
736
741
}
737
742
738
743
impl < ' a , K , V > Iterator for Keys < ' a , K , V > {
@@ -776,7 +781,7 @@ impl<'a, K: fmt::Debug, V> fmt::Debug for Keys<'a, K, V> {
776
781
/// [`values`]: struct.IndexMap.html#method.values
777
782
/// [`IndexMap`]: struct.IndexMap.html
778
783
pub struct Values < ' a , K : ' a , V : ' a > {
779
- iter : SliceIter < ' a , Bucket < K , V > > ,
784
+ iter : < & ' a EntryVec < Bucket < K , V > > as IntoIterator > :: IntoIter ,
780
785
}
781
786
782
787
impl < ' a , K , V > Iterator for Values < ' a , K , V > {
@@ -820,7 +825,7 @@ impl<'a, K, V: fmt::Debug> fmt::Debug for Values<'a, K, V> {
820
825
/// [`values_mut`]: struct.IndexMap.html#method.values_mut
821
826
/// [`IndexMap`]: struct.IndexMap.html
822
827
pub struct ValuesMut < ' a , K : ' a , V : ' a > {
823
- iter : SliceIterMut < ' a , Bucket < K , V > > ,
828
+ iter : < & ' a mut EntryVec < Bucket < K , V > > as IntoIterator > :: IntoIter ,
824
829
}
825
830
826
831
impl < ' a , K , V > Iterator for ValuesMut < ' a , K , V > {
@@ -849,7 +854,7 @@ impl<'a, K, V> ExactSizeIterator for ValuesMut<'a, K, V> {
849
854
/// [`iter`]: struct.IndexMap.html#method.iter
850
855
/// [`IndexMap`]: struct.IndexMap.html
851
856
pub struct Iter < ' a , K : ' a , V : ' a > {
852
- iter : SliceIter < ' a , Bucket < K , V > > ,
857
+ iter : < & ' a EntryVec < Bucket < K , V > > as IntoIterator > :: IntoIter ,
853
858
}
854
859
855
860
impl < ' a , K , V > Iterator for Iter < ' a , K , V > {
@@ -893,7 +898,7 @@ impl<'a, K: fmt::Debug, V: fmt::Debug> fmt::Debug for Iter<'a, K, V> {
893
898
/// [`iter_mut`]: struct.IndexMap.html#method.iter_mut
894
899
/// [`IndexMap`]: struct.IndexMap.html
895
900
pub struct IterMut < ' a , K : ' a , V : ' a > {
896
- iter : SliceIterMut < ' a , Bucket < K , V > > ,
901
+ iter : < & ' a mut EntryVec < Bucket < K , V > > as IntoIterator > :: IntoIter ,
897
902
}
898
903
899
904
impl < ' a , K , V > Iterator for IterMut < ' a , K , V > {
@@ -922,7 +927,7 @@ impl<'a, K, V> ExactSizeIterator for IterMut<'a, K, V> {
922
927
/// [`into_iter`]: struct.IndexMap.html#method.into_iter
923
928
/// [`IndexMap`]: struct.IndexMap.html
924
929
pub struct IntoIter < K , V > {
925
- pub ( crate ) iter : VecIntoIter < Bucket < K , V > > ,
930
+ pub ( crate ) iter : < EntryVec < Bucket < K , V > > as IntoIterator > :: IntoIter ,
926
931
}
927
932
928
933
impl < K , V > Iterator for IntoIter < K , V > {
@@ -944,6 +949,11 @@ impl<K, V> ExactSizeIterator for IntoIter<K, V> {
944
949
}
945
950
946
951
impl < K : fmt:: Debug , V : fmt:: Debug > fmt:: Debug for IntoIter < K , V > {
952
+ #[ cfg( feature = "amortize" ) ]
953
+ fn fmt ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result {
954
+ f. debug_struct ( "IntoIter" ) . finish ( )
955
+ }
956
+ #[ cfg( not( feature = "amortize" ) ) ]
947
957
fn fmt ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result {
948
958
let iter = self . iter . as_slice ( ) . iter ( ) . map ( Bucket :: refs) ;
949
959
f. debug_list ( ) . entries ( iter) . finish ( )
@@ -962,7 +972,10 @@ where
962
972
K : ' a ,
963
973
V : ' a ,
964
974
{
975
+ #[ cfg( not( feature = "amortize" ) ) ]
965
976
pub ( crate ) iter : :: std:: vec:: Drain < ' a , Bucket < K , V > > ,
977
+ #[ cfg( feature = "amortize" ) ]
978
+ pub ( crate ) iter : atone:: vc:: Drain < ' a , Bucket < K , V > > ,
966
979
}
967
980
968
981
impl < ' a , K , V > Iterator for Drain < ' a , K , V > {
@@ -1320,7 +1333,9 @@ mod tests {
1320
1333
assert_eq ! ( map. get( & i) , Some ( & ( i * i) ) ) ;
1321
1334
map. shrink_to_fit ( ) ;
1322
1335
assert_eq ! ( map. len( ) , i + 1 ) ;
1323
- assert_eq ! ( map. capacity( ) , i + 1 ) ;
1336
+ if !cfg ! ( feature = "amortize" ) {
1337
+ assert_eq ! ( map. capacity( ) , i + 1 ) ;
1338
+ }
1324
1339
assert_eq ! ( map. get( & i) , Some ( & ( i * i) ) ) ;
1325
1340
}
1326
1341
}
0 commit comments