@@ -9,6 +9,7 @@ use std::hash::BuildHasher;
9
9
use std:: hash:: Hasher ;
10
10
use std:: collections:: hash_map:: RandomState ;
11
11
use std:: borrow:: Borrow ;
12
+ use std:: ops:: RangeFull ;
12
13
13
14
use std:: cmp:: { max, Ordering } ;
14
15
use std:: fmt;
@@ -979,6 +980,17 @@ impl<K, V, S> OrderMap<K, V, S>
979
980
self . entries . sort_by ( move |a, b| cmp ( & a. key , & a. value , & b. key , & b. value ) ) ;
980
981
self . into_iter ( )
981
982
}
983
+ /// Clears the `OrderMap`, returning all key-value pairs as a drain iterator.
984
+ /// Keeps the allocated memory for reuse.
985
+ pub fn drain ( & mut self , range : RangeFull ) -> Drain < K , V > {
986
+ for i in & mut self . indices {
987
+ * i = Pos :: none ( ) ;
988
+ }
989
+
990
+ Drain {
991
+ inner : self . entries . drain ( range) ,
992
+ }
993
+ }
982
994
}
983
995
984
996
impl < K , V , S > OrderMap < K , V , S > {
@@ -1496,6 +1508,20 @@ impl<K, V, S> Eq for OrderMap<K, V, S>
1496
1508
{
1497
1509
}
1498
1510
1511
+ pub struct Drain < ' a , K , V > where K : ' a , V : ' a {
1512
+ inner : :: std:: vec:: Drain < ' a , Bucket < K , V > >
1513
+ }
1514
+
1515
+ impl < ' a , K , V > Iterator for Drain < ' a , K , V > {
1516
+ type Item = ( K , V ) ;
1517
+ fn next ( & mut self ) -> Option < Self :: Item > {
1518
+ self . inner . next ( ) . map ( |bucket| ( bucket. key , bucket. value ) )
1519
+ }
1520
+ fn size_hint ( & self ) -> ( usize , Option < usize > ) {
1521
+ self . inner . size_hint ( )
1522
+ }
1523
+ }
1524
+
1499
1525
#[ cfg( test) ]
1500
1526
mod tests {
1501
1527
use super :: * ;
0 commit comments