@@ -26,6 +26,7 @@ use std::fmt;
2626use self :: core:: IndexMapCore ;
2727use equivalent:: Equivalent ;
2828use util:: third;
29+ use EntryVec ;
2930use { Bucket , Entries , HashValue } ;
3031
3132pub use self :: core:: { Entry , OccupiedEntry , VacantEntry } ;
@@ -105,23 +106,23 @@ impl<K, V, S> Entries for IndexMap<K, V, S> {
105106 type Entry = Bucket < K , V > ;
106107
107108 #[ inline]
108- fn into_entries ( self ) -> Vec < Self :: Entry > {
109+ fn into_entries ( self ) -> EntryVec < Self :: Entry > {
109110 self . core . into_entries ( )
110111 }
111112
112113 #[ inline]
113- fn as_entries ( & self ) -> & [ Self :: Entry ] {
114+ fn as_entries ( & self ) -> & EntryVec < Self :: Entry > {
114115 self . core . as_entries ( )
115116 }
116117
117118 #[ inline]
118- fn as_entries_mut ( & mut self ) -> & mut [ Self :: Entry ] {
119+ fn as_entries_mut ( & mut self ) -> & mut EntryVec < Self :: Entry > {
119120 self . core . as_entries_mut ( )
120121 }
121122
122123 fn with_entries < F > ( & mut self , f : F )
123124 where
124- F : FnOnce ( & mut [ Self :: Entry ] ) ,
125+ F : FnOnce ( & mut EntryVec < Self :: Entry > ) ,
125126 {
126127 self . core . with_entries ( f) ;
127128 }
@@ -622,6 +623,8 @@ where
622623 K : Ord ,
623624 {
624625 self . with_entries ( |entries| {
626+ #[ cfg( feature = "amortize" ) ]
627+ let entries = entries. make_contiguous ( ) ;
625628 entries. sort_by ( |a, b| Ord :: cmp ( & a. key , & b. key ) ) ;
626629 } ) ;
627630 }
@@ -639,6 +642,8 @@ where
639642 F : FnMut ( & K , & V , & K , & V ) -> Ordering ,
640643 {
641644 self . with_entries ( move |entries| {
645+ #[ cfg( feature = "amortize" ) ]
646+ let entries = entries. make_contiguous ( ) ;
642647 entries. sort_by ( move |a, b| cmp ( & a. key , & a. value , & b. key , & b. value ) ) ;
643648 } ) ;
644649 }
@@ -652,7 +657,11 @@ where
652657 F : FnMut ( & K , & V , & K , & V ) -> Ordering ,
653658 {
654659 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+ }
656665 IntoIter {
657666 iter : entries. into_iter ( ) ,
658667 }
@@ -720,10 +729,6 @@ impl<K, V, S> IndexMap<K, V, S> {
720729 }
721730}
722731
723- use std:: slice:: Iter as SliceIter ;
724- use std:: slice:: IterMut as SliceIterMut ;
725- use std:: vec:: IntoIter as VecIntoIter ;
726-
727732/// An iterator over the keys of a `IndexMap`.
728733///
729734/// This `struct` is created by the [`keys`] method on [`IndexMap`]. See its
@@ -732,7 +737,7 @@ use std::vec::IntoIter as VecIntoIter;
732737/// [`keys`]: struct.IndexMap.html#method.keys
733738/// [`IndexMap`]: struct.IndexMap.html
734739pub 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 ,
736741}
737742
738743impl < ' 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> {
776781/// [`values`]: struct.IndexMap.html#method.values
777782/// [`IndexMap`]: struct.IndexMap.html
778783pub struct Values < ' a , K : ' a , V : ' a > {
779- iter : SliceIter < ' a , Bucket < K , V > > ,
784+ iter : < & ' a EntryVec < Bucket < K , V > > as IntoIterator > :: IntoIter ,
780785}
781786
782787impl < ' 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> {
820825/// [`values_mut`]: struct.IndexMap.html#method.values_mut
821826/// [`IndexMap`]: struct.IndexMap.html
822827pub 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 ,
824829}
825830
826831impl < ' a , K , V > Iterator for ValuesMut < ' a , K , V > {
@@ -849,7 +854,7 @@ impl<'a, K, V> ExactSizeIterator for ValuesMut<'a, K, V> {
849854/// [`iter`]: struct.IndexMap.html#method.iter
850855/// [`IndexMap`]: struct.IndexMap.html
851856pub struct Iter < ' a , K : ' a , V : ' a > {
852- iter : SliceIter < ' a , Bucket < K , V > > ,
857+ iter : < & ' a EntryVec < Bucket < K , V > > as IntoIterator > :: IntoIter ,
853858}
854859
855860impl < ' 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> {
893898/// [`iter_mut`]: struct.IndexMap.html#method.iter_mut
894899/// [`IndexMap`]: struct.IndexMap.html
895900pub 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 ,
897902}
898903
899904impl < ' a , K , V > Iterator for IterMut < ' a , K , V > {
@@ -922,7 +927,7 @@ impl<'a, K, V> ExactSizeIterator for IterMut<'a, K, V> {
922927/// [`into_iter`]: struct.IndexMap.html#method.into_iter
923928/// [`IndexMap`]: struct.IndexMap.html
924929pub struct IntoIter < K , V > {
925- pub ( crate ) iter : VecIntoIter < Bucket < K , V > > ,
930+ pub ( crate ) iter : < EntryVec < Bucket < K , V > > as IntoIterator > :: IntoIter ,
926931}
927932
928933impl < K , V > Iterator for IntoIter < K , V > {
@@ -944,6 +949,11 @@ impl<K, V> ExactSizeIterator for IntoIter<K, V> {
944949}
945950
946951impl < 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" ) ) ]
947957 fn fmt ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result {
948958 let iter = self . iter . as_slice ( ) . iter ( ) . map ( Bucket :: refs) ;
949959 f. debug_list ( ) . entries ( iter) . finish ( )
@@ -962,7 +972,10 @@ where
962972 K : ' a ,
963973 V : ' a ,
964974{
975+ #[ cfg( not( feature = "amortize" ) ) ]
965976 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 > > ,
966979}
967980
968981impl < ' a , K , V > Iterator for Drain < ' a , K , V > {
@@ -1320,7 +1333,9 @@ mod tests {
13201333 assert_eq ! ( map. get( & i) , Some ( & ( i * i) ) ) ;
13211334 map. shrink_to_fit ( ) ;
13221335 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+ }
13241339 assert_eq ! ( map. get( & i) , Some ( & ( i * i) ) ) ;
13251340 }
13261341 }
0 commit comments