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