@@ -800,6 +800,52 @@ impl<K, V, S, A: Allocator + Clone> HashMap<K, V, S, A> {
800
800
pub fn clear ( & mut self ) {
801
801
self . table . clear ( ) ;
802
802
}
803
+
804
+ /// Creates a consuming iterator visiting all the keys in arbitrary order.
805
+ /// The map cannot be used after calling this.
806
+ /// The iterator element type is `K`.
807
+ ///
808
+ /// # Examples
809
+ ///
810
+ /// ```
811
+ /// use hashbrown::HashMap;
812
+ ///
813
+ /// let mut map = HashMap::new();
814
+ /// map.insert("a", 1);
815
+ /// map.insert("b", 2);
816
+ /// map.insert("c", 3);
817
+ ///
818
+ /// let vec: Vec<&str> = map.into_keys().collect();
819
+ /// ```
820
+ #[ inline]
821
+ pub fn into_keys ( self ) -> IntoKeys < K , V , A > {
822
+ IntoKeys {
823
+ inner : self . into_iter ( ) ,
824
+ }
825
+ }
826
+
827
+ /// Creates a consuming iterator visiting all the values in arbitrary order.
828
+ /// The map cannot be used after calling this.
829
+ /// The iterator element type is `V`.
830
+ ///
831
+ /// # Examples
832
+ ///
833
+ /// ```
834
+ /// use hashbrown::HashMap;
835
+ ///
836
+ /// let mut map = HashMap::new();
837
+ /// map.insert("a", 1);
838
+ /// map.insert("b", 2);
839
+ /// map.insert("c", 3);
840
+ ///
841
+ /// let vec: Vec<i32> = map.into_values().collect();
842
+ /// ```
843
+ #[ inline]
844
+ pub fn into_values ( self ) -> IntoValues < K , V , A > {
845
+ IntoValues {
846
+ inner : self . into_iter ( ) ,
847
+ }
848
+ }
803
849
}
804
850
805
851
impl < K , V , S , A > HashMap < K , V , S , A >
@@ -1614,6 +1660,88 @@ impl<K, V, A: Allocator + Clone> IntoIter<K, V, A> {
1614
1660
}
1615
1661
}
1616
1662
1663
+ /// An owning iterator over the keys of a `HashMap`.
1664
+ ///
1665
+ /// This `struct` is created by the [`into_keys`] method on [`HashMap`].
1666
+ /// See its documentation for more.
1667
+ ///
1668
+ /// [`into_keys`]: struct.HashMap.html#method.into_keys
1669
+ /// [`HashMap`]: struct.HashMap.html
1670
+ pub struct IntoKeys < K , V , A : Allocator + Clone = Global > {
1671
+ inner : IntoIter < K , V , A > ,
1672
+ }
1673
+
1674
+ impl < K , V , A : Allocator + Clone > Iterator for IntoKeys < K , V , A > {
1675
+ type Item = K ;
1676
+
1677
+ #[ inline]
1678
+ fn next ( & mut self ) -> Option < K > {
1679
+ self . inner . next ( ) . map ( |( k, _) | k)
1680
+ }
1681
+ #[ inline]
1682
+ fn size_hint ( & self ) -> ( usize , Option < usize > ) {
1683
+ self . inner . size_hint ( )
1684
+ }
1685
+ }
1686
+
1687
+ impl < K , V , A : Allocator + Clone > ExactSizeIterator for IntoKeys < K , V , A > {
1688
+ #[ inline]
1689
+ fn len ( & self ) -> usize {
1690
+ self . inner . len ( )
1691
+ }
1692
+ }
1693
+
1694
+ impl < K , V , A : Allocator + Clone > FusedIterator for IntoKeys < K , V , A > { }
1695
+
1696
+ impl < K : Debug , V : Debug , A : Allocator + Clone > fmt:: Debug for IntoKeys < K , V , A > {
1697
+ fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
1698
+ f. debug_list ( )
1699
+ . entries ( self . inner . iter ( ) . map ( |( k, _) | k) )
1700
+ . finish ( )
1701
+ }
1702
+ }
1703
+
1704
+ /// An owning iterator over the values of a `HashMap`.
1705
+ ///
1706
+ /// This `struct` is created by the [`into_values`] method on [`HashMap`].
1707
+ /// See its documentation for more.
1708
+ ///
1709
+ /// [`into_values`]: struct.HashMap.html#method.into_values
1710
+ /// [`HashMap`]: struct.HashMap.html
1711
+ pub struct IntoValues < K , V , A : Allocator + Clone = Global > {
1712
+ inner : IntoIter < K , V , A > ,
1713
+ }
1714
+
1715
+ impl < K , V , A : Allocator + Clone > Iterator for IntoValues < K , V , A > {
1716
+ type Item = V ;
1717
+
1718
+ #[ inline]
1719
+ fn next ( & mut self ) -> Option < V > {
1720
+ self . inner . next ( ) . map ( |( _, v) | v)
1721
+ }
1722
+ #[ inline]
1723
+ fn size_hint ( & self ) -> ( usize , Option < usize > ) {
1724
+ self . inner . size_hint ( )
1725
+ }
1726
+ }
1727
+
1728
+ impl < K , V , A : Allocator + Clone > ExactSizeIterator for IntoValues < K , V , A > {
1729
+ #[ inline]
1730
+ fn len ( & self ) -> usize {
1731
+ self . inner . len ( )
1732
+ }
1733
+ }
1734
+
1735
+ impl < K , V , A : Allocator + Clone > FusedIterator for IntoValues < K , V , A > { }
1736
+
1737
+ impl < K : Debug , V : Debug , A : Allocator + Clone > fmt:: Debug for IntoValues < K , V , A > {
1738
+ fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
1739
+ f. debug_list ( )
1740
+ . entries ( self . inner . iter ( ) . map ( |( k, _) | k) )
1741
+ . finish ( )
1742
+ }
1743
+ }
1744
+
1617
1745
/// An iterator over the keys of a `HashMap`.
1618
1746
///
1619
1747
/// This `struct` is created by the [`keys`] method on [`HashMap`]. See its
@@ -4018,6 +4146,30 @@ mod test_map {
4018
4146
assert ! ( values. contains( & 6 ) ) ;
4019
4147
}
4020
4148
4149
+ #[ test]
4150
+ fn test_into_keys ( ) {
4151
+ let vec = vec ! [ ( 1 , 'a' ) , ( 2 , 'b' ) , ( 3 , 'c' ) ] ;
4152
+ let map: HashMap < _ , _ > = vec. into_iter ( ) . collect ( ) ;
4153
+ let keys: Vec < _ > = map. into_keys ( ) . collect ( ) ;
4154
+
4155
+ assert_eq ! ( keys. len( ) , 3 ) ;
4156
+ assert ! ( keys. contains( & 1 ) ) ;
4157
+ assert ! ( keys. contains( & 2 ) ) ;
4158
+ assert ! ( keys. contains( & 3 ) ) ;
4159
+ }
4160
+
4161
+ #[ test]
4162
+ fn test_into_values ( ) {
4163
+ let vec = vec ! [ ( 1 , 'a' ) , ( 2 , 'b' ) , ( 3 , 'c' ) ] ;
4164
+ let map: HashMap < _ , _ > = vec. into_iter ( ) . collect ( ) ;
4165
+ let values: Vec < _ > = map. into_values ( ) . collect ( ) ;
4166
+
4167
+ assert_eq ! ( values. len( ) , 3 ) ;
4168
+ assert ! ( values. contains( & 'a' ) ) ;
4169
+ assert ! ( values. contains( & 'b' ) ) ;
4170
+ assert ! ( values. contains( & 'c' ) ) ;
4171
+ }
4172
+
4021
4173
#[ test]
4022
4174
fn test_find ( ) {
4023
4175
let mut m = HashMap :: new ( ) ;
0 commit comments