8
8
// option. This file may not be copied, modified, or distributed
9
9
// except according to those terms.
10
10
11
- //! A HashMap wrapper that holds key-value pairs in insertion order.
11
+ //! A ` HashMap` wrapper that holds key-value pairs in insertion order.
12
12
//!
13
13
//! # Examples
14
14
//!
30
30
#![ forbid( missing_docs) ]
31
31
#![ cfg_attr( all( feature = "nightly" , test) , feature( test) ) ]
32
32
33
+ #![ cfg_attr( feature = "clippy" , feature( plugin) ) ]
34
+ #![ cfg_attr( feature = "clippy" , plugin( clippy) ) ]
35
+ #![ cfg_attr( feature = "clippy" , deny( clippy) ) ]
36
+
33
37
// Optional Serde support
34
38
#[ cfg( feature = "serde_impl" ) ]
35
39
pub mod serde;
@@ -302,7 +306,7 @@ impl<K: Hash + Eq, V, S: BuildHasher> LinkedHashMap<K, V, S> {
302
306
self . detach ( node_ptr) ;
303
307
self . attach ( node_ptr) ;
304
308
}
305
- return value;
309
+ value
306
310
}
307
311
308
312
/// Removes and returns the value corresponding to the key from the map.
@@ -367,14 +371,14 @@ impl<K: Hash + Eq, V, S: BuildHasher> LinkedHashMap<K, V, S> {
367
371
/// ```
368
372
#[ inline]
369
373
pub fn pop_front ( & mut self ) -> Option < ( K , V ) > {
370
- if self . len ( ) > 0 {
371
- let lru = unsafe { ( * self . head ) . prev } ;
372
- self . detach ( lru) ;
373
- return self . map
374
- . remove ( & KeyRef { k : unsafe { & ( * lru) . key } } )
375
- . map ( |e| { let e = * e; ( e. key , e. value ) } )
374
+ if self . is_empty ( ) {
375
+ return None
376
376
}
377
- None
377
+ let lru = unsafe { ( * self . head ) . prev } ;
378
+ self . detach ( lru) ;
379
+ self . map
380
+ . remove ( & KeyRef { k : unsafe { & ( * lru) . key } } )
381
+ . map ( |e| { let e = * e; ( e. key , e. value ) } )
378
382
}
379
383
380
384
/// Gets the first entry.
@@ -390,12 +394,12 @@ impl<K: Hash + Eq, V, S: BuildHasher> LinkedHashMap<K, V, S> {
390
394
/// ```
391
395
#[ inline]
392
396
pub fn front ( & self ) -> Option < ( & K , & V ) > {
393
- if self . len ( ) > 0 {
394
- let lru = unsafe { ( * self . head ) . prev } ;
395
- return self . map . get ( & KeyRef { k : unsafe { & ( * lru) . key } } )
396
- . map ( |e| ( & e. key , & e. value ) )
397
+ if self . is_empty ( ) {
398
+ return None
397
399
}
398
- None
400
+ let lru = unsafe { ( * self . head ) . prev } ;
401
+ self . map . get ( & KeyRef { k : unsafe { & ( * lru) . key } } )
402
+ . map ( |e| ( & e. key , & e. value ) )
399
403
}
400
404
401
405
/// Removes the last entry.
@@ -413,14 +417,14 @@ impl<K: Hash + Eq, V, S: BuildHasher> LinkedHashMap<K, V, S> {
413
417
/// ```
414
418
#[ inline]
415
419
pub fn pop_back ( & mut self ) -> Option < ( K , V ) > {
416
- if self . len ( ) > 0 {
417
- let mru = unsafe { ( * self . head ) . next } ;
418
- self . detach ( mru) ;
419
- return self . map
420
- . remove ( & KeyRef { k : unsafe { & ( * mru) . key } } )
421
- . map ( |e| { let e = * e; ( e. key , e. value ) } )
420
+ if self . is_empty ( ) {
421
+ return None
422
422
}
423
- None
423
+ let mru = unsafe { ( * self . head ) . next } ;
424
+ self . detach ( mru) ;
425
+ self . map
426
+ . remove ( & KeyRef { k : unsafe { & ( * mru) . key } } )
427
+ . map ( |e| { let e = * e; ( e. key , e. value ) } )
424
428
}
425
429
426
430
/// Gets the last entry.
@@ -436,12 +440,12 @@ impl<K: Hash + Eq, V, S: BuildHasher> LinkedHashMap<K, V, S> {
436
440
/// ```
437
441
#[ inline]
438
442
pub fn back ( & mut self ) -> Option < ( & K , & V ) > {
439
- if self . len ( ) > 0 {
440
- let mru = unsafe { ( * self . head ) . next } ;
441
- return self . map . get ( & KeyRef { k : unsafe { & ( * mru) . key } } )
442
- . map ( |e| ( & e. key , & e. value ) )
443
+ if self . is_empty ( ) {
444
+ return None
443
445
}
444
- None
446
+ let mru = unsafe { ( * self . head ) . next } ;
447
+ self . map . get ( & KeyRef { k : unsafe { & ( * mru) . key } } )
448
+ . map ( |e| ( & e. key , & e. value ) )
445
449
}
446
450
447
451
/// Returns the number of key-value pairs in the map.
@@ -481,10 +485,10 @@ impl<K: Hash + Eq, V, S: BuildHasher> LinkedHashMap<K, V, S> {
481
485
/// assert_eq!(None, iter.next());
482
486
/// ```
483
487
pub fn iter ( & self ) -> Iter < K , V > {
484
- let head = if ! self . head . is_null ( ) {
485
- unsafe { ( * self . head ) . prev }
486
- } else {
488
+ let head = if self . head . is_null ( ) {
487
489
ptr:: null_mut ( )
490
+ } else {
491
+ unsafe { ( * self . head ) . prev }
488
492
} ;
489
493
Iter {
490
494
head : head,
@@ -515,10 +519,10 @@ impl<K: Hash + Eq, V, S: BuildHasher> LinkedHashMap<K, V, S> {
515
519
/// assert_eq!(&17, map.get(&"a").unwrap());
516
520
/// ```
517
521
pub fn iter_mut ( & mut self ) -> IterMut < K , V > {
518
- let head = if ! self . head . is_null ( ) {
519
- unsafe { ( * self . head ) . prev }
520
- } else {
522
+ let head = if self . head . is_null ( ) {
521
523
ptr:: null_mut ( )
524
+ } else {
525
+ unsafe { ( * self . head ) . prev }
522
526
} ;
523
527
IterMut {
524
528
head : head,
@@ -545,6 +549,7 @@ impl<K: Hash + Eq, V, S: BuildHasher> LinkedHashMap<K, V, S> {
545
549
/// assert_eq!(&'b', keys.next().unwrap());
546
550
/// assert_eq!(None, keys.next());
547
551
/// ```
552
+ #[ cfg_attr( feature = "clippy" , allow( needless_lifetimes) ) ] // false positive
548
553
pub fn keys < ' a > ( & ' a self ) -> Keys < ' a , K , V > {
549
554
fn first < A , B > ( ( a, _) : ( A , B ) ) -> A { a }
550
555
let first: fn ( ( & ' a K , & ' a V ) ) -> & ' a K = first; // coerce to fn ptr
@@ -569,6 +574,7 @@ impl<K: Hash + Eq, V, S: BuildHasher> LinkedHashMap<K, V, S> {
569
574
/// assert_eq!(&20, values.next().unwrap());
570
575
/// assert_eq!(None, values.next());
571
576
/// ```
577
+ #[ cfg_attr( feature = "clippy" , allow( needless_lifetimes) ) ] // false positive
572
578
pub fn values < ' a > ( & ' a self ) -> Values < ' a , K , V > {
573
579
fn second < A , B > ( ( _, b) : ( A , B ) ) -> B { b }
574
580
let second: fn ( ( & ' a K , & ' a V ) ) -> & ' a V = second; // coerce to fn ptr
@@ -808,8 +814,7 @@ impl<'a, K, V> DoubleEndedIterator for Iter<'a, K, V> {
808
814
self . remaining -= 1 ;
809
815
unsafe {
810
816
self . tail = ( * self . tail ) . next ;
811
- let r = Some ( ( & ( * self . tail ) . key , & ( * self . tail ) . value ) ) ;
812
- r
817
+ Some ( ( & ( * self . tail ) . key , & ( * self . tail ) . value ) )
813
818
}
814
819
}
815
820
}
@@ -823,8 +828,7 @@ impl<'a, K, V> DoubleEndedIterator for IterMut<'a, K, V> {
823
828
self . remaining -= 1 ;
824
829
unsafe {
825
830
self . tail = ( * self . tail ) . next ;
826
- let r = Some ( ( & ( * self . tail ) . key , & mut ( * self . tail ) . value ) ) ;
827
- r
831
+ Some ( ( & ( * self . tail ) . key , & mut ( * self . tail ) . value ) )
828
832
}
829
833
}
830
834
}
@@ -840,6 +844,7 @@ impl<'a, K, V> ExactSizeIterator for IterMut<'a, K, V> {
840
844
841
845
/// An insertion-order iterator over a `LinkedHashMap`'s keys.
842
846
pub struct Keys < ' a , K : ' a , V : ' a > {
847
+ #[ cfg_attr( feature = "clippy" , allow( type_complexity) ) ]
843
848
inner : iter:: Map < Iter < ' a , K , V > , fn ( ( & ' a K , & ' a V ) ) -> & ' a K >
844
849
}
845
850
@@ -864,6 +869,7 @@ impl<'a, K, V> ExactSizeIterator for Keys<'a, K, V> {
864
869
865
870
/// An insertion-order iterator over a `LinkedHashMap`'s values.
866
871
pub struct Values < ' a , K : ' a , V : ' a > {
872
+ #[ cfg_attr( feature = "clippy" , allow( type_complexity) ) ]
867
873
inner : iter:: Map < Iter < ' a , K , V > , fn ( ( & ' a K , & ' a V ) ) -> & ' a V >
868
874
}
869
875
0 commit comments