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
//!
28
28
//! ```
29
29
30
30
#![ forbid( missing_docs) ]
31
- #![ cfg_attr( feature = "nightly" , feature( hashmap_public_hasher) ) ]
32
31
#![ cfg_attr( all( feature = "nightly" , test) , feature( test) ) ]
33
32
33
+ #![ cfg_attr( feature = "clippy" , feature( plugin) ) ]
34
+ #![ cfg_attr( feature = "clippy" , plugin( clippy) ) ]
35
+ #![ cfg_attr( feature = "clippy" , deny( clippy) ) ]
36
+
34
37
// Optional Serde support
35
38
#[ cfg( feature = "serde_impl" ) ]
36
- mod serde;
39
+ pub mod serde;
37
40
38
41
use std:: borrow:: Borrow ;
39
42
use std:: cmp:: Ordering ;
@@ -310,7 +313,7 @@ impl<K: Hash + Eq, V, S: BuildHasher> LinkedHashMap<K, V, S> {
310
313
self . detach ( node_ptr) ;
311
314
self . attach ( node_ptr) ;
312
315
}
313
- return value;
316
+ value
314
317
}
315
318
316
319
/// Removes and returns the value corresponding to the key from the map.
@@ -373,17 +376,17 @@ impl<K: Hash + Eq, V, S: BuildHasher> LinkedHashMap<K, V, S> {
373
376
/// ```
374
377
#[ inline]
375
378
pub fn pop_front ( & mut self ) -> Option < ( K , V ) > {
376
- if self . len ( ) > 0 {
377
- let lru = unsafe { ( * self . head ) . prev } ;
378
- self . detach ( lru) ;
379
- return self . map
380
- . remove ( & KeyRef { k : unsafe { & ( * lru) . key } } )
381
- . map ( |e| {
382
- let e = * unsafe { Box :: from_raw ( e) } ;
383
- ( e. key , e. value )
384
- } )
379
+ if self . is_empty ( ) {
380
+ return None
385
381
}
386
- None
382
+ let lru = unsafe { ( * self . head ) . prev } ;
383
+ self . detach ( lru) ;
384
+ self . map
385
+ . remove ( & KeyRef { k : unsafe { & ( * lru) . key } } )
386
+ . map ( |e| {
387
+ let e = * unsafe { Box :: from_raw ( e) } ;
388
+ ( e. key , e. value )
389
+ } )
387
390
}
388
391
389
392
/// Gets the first entry.
@@ -399,12 +402,13 @@ impl<K: Hash + Eq, V, S: BuildHasher> LinkedHashMap<K, V, S> {
399
402
/// ```
400
403
#[ inline]
401
404
pub fn front ( & self ) -> Option < ( & K , & V ) > {
402
- if self . len ( ) > 0 {
403
- let lru = unsafe { ( * self . head ) . prev } ;
404
- return self . map . get ( & KeyRef { k : unsafe { & ( * lru) . key } } )
405
- . map ( |e| unsafe { ( & ( * * e) . key , & ( * * e) . value ) } )
405
+ if self . is_empty ( ) {
406
+ return None
406
407
}
407
- None
408
+ let lru = unsafe { ( * self . head ) . prev } ;
409
+ self . map
410
+ . get ( & KeyRef { k : unsafe { & ( * lru) . key } } )
411
+ . map ( |e| unsafe { ( & ( * * e) . key , & ( * * e) . value ) } )
408
412
}
409
413
410
414
/// Removes the last entry.
@@ -422,17 +426,17 @@ impl<K: Hash + Eq, V, S: BuildHasher> LinkedHashMap<K, V, S> {
422
426
/// ```
423
427
#[ inline]
424
428
pub fn pop_back ( & mut self ) -> Option < ( K , V ) > {
425
- if self . len ( ) > 0 {
426
- let mru = unsafe { ( * self . head ) . next } ;
427
- self . detach ( mru) ;
428
- return self . map
429
- . remove ( & KeyRef { k : unsafe { & ( * mru) . key } } )
430
- . map ( |e| {
431
- let e = * unsafe { Box :: from_raw ( e) } ;
432
- ( e. key , e. value )
433
- } )
429
+ if self . is_empty ( ) {
430
+ return None
434
431
}
435
- None
432
+ let mru = unsafe { ( * self . head ) . next } ;
433
+ self . detach ( mru) ;
434
+ self . map
435
+ . remove ( & KeyRef { k : unsafe { & ( * mru) . key } } )
436
+ . map ( |e| {
437
+ let e = * unsafe { Box :: from_raw ( e) } ;
438
+ ( e. key , e. value )
439
+ } )
436
440
}
437
441
438
442
/// Gets the last entry.
@@ -448,12 +452,13 @@ impl<K: Hash + Eq, V, S: BuildHasher> LinkedHashMap<K, V, S> {
448
452
/// ```
449
453
#[ inline]
450
454
pub fn back ( & mut self ) -> Option < ( & K , & V ) > {
451
- if self . len ( ) > 0 {
452
- let mru = unsafe { ( * self . head ) . next } ;
453
- return self . map . get ( & KeyRef { k : unsafe { & ( * mru) . key } } )
454
- . map ( |e| unsafe { ( & ( * * e) . key , & ( * * e) . value ) } )
455
+ if self . is_empty ( ) {
456
+ return None
455
457
}
456
- None
458
+ let mru = unsafe { ( * self . head ) . next } ;
459
+ self . map
460
+ . get ( & KeyRef { k : unsafe { & ( * mru) . key } } )
461
+ . map ( |e| unsafe { ( & ( * * e) . key , & ( * * e) . value ) } )
457
462
}
458
463
459
464
/// Returns the number of key-value pairs in the map.
@@ -494,10 +499,10 @@ impl<K: Hash + Eq, V, S: BuildHasher> LinkedHashMap<K, V, S> {
494
499
/// assert_eq!(None, iter.next());
495
500
/// ```
496
501
pub fn iter ( & self ) -> Iter < K , V > {
497
- let head = if ! self . head . is_null ( ) {
498
- unsafe { ( * self . head ) . prev }
499
- } else {
502
+ let head = if self . head . is_null ( ) {
500
503
ptr:: null_mut ( )
504
+ } else {
505
+ unsafe { ( * self . head ) . prev }
501
506
} ;
502
507
Iter {
503
508
head : head,
@@ -528,10 +533,10 @@ impl<K: Hash + Eq, V, S: BuildHasher> LinkedHashMap<K, V, S> {
528
533
/// assert_eq!(&17, map.get(&"a").unwrap());
529
534
/// ```
530
535
pub fn iter_mut ( & mut self ) -> IterMut < K , V > {
531
- let head = if ! self . head . is_null ( ) {
532
- unsafe { ( * self . head ) . prev }
533
- } else {
536
+ let head = if self . head . is_null ( ) {
534
537
ptr:: null_mut ( )
538
+ } else {
539
+ unsafe { ( * self . head ) . prev }
535
540
} ;
536
541
IterMut {
537
542
head : head,
@@ -558,6 +563,7 @@ impl<K: Hash + Eq, V, S: BuildHasher> LinkedHashMap<K, V, S> {
558
563
/// assert_eq!(&'b', keys.next().unwrap());
559
564
/// assert_eq!(None, keys.next());
560
565
/// ```
566
+ #[ cfg_attr( feature = "clippy" , allow( needless_lifetimes) ) ] // false positive
561
567
pub fn keys < ' a > ( & ' a self ) -> Keys < ' a , K , V > {
562
568
fn first < A , B > ( ( a, _) : ( A , B ) ) -> A { a }
563
569
let first: fn ( ( & ' a K , & ' a V ) ) -> & ' a K = first; // coerce to fn ptr
@@ -582,6 +588,7 @@ impl<K: Hash + Eq, V, S: BuildHasher> LinkedHashMap<K, V, S> {
582
588
/// assert_eq!(&20, values.next().unwrap());
583
589
/// assert_eq!(None, values.next());
584
590
/// ```
591
+ #[ cfg_attr( feature = "clippy" , allow( needless_lifetimes) ) ] // false positive
585
592
pub fn values < ' a > ( & ' a self ) -> Values < ' a , K , V > {
586
593
fn second < A , B > ( ( _, b) : ( A , B ) ) -> B { b }
587
594
let second: fn ( ( & ' a K , & ' a V ) ) -> & ' a V = second; // coerce to fn ptr
@@ -822,8 +829,7 @@ impl<'a, K, V> DoubleEndedIterator for Iter<'a, K, V> {
822
829
self . remaining -= 1 ;
823
830
unsafe {
824
831
self . tail = ( * self . tail ) . next ;
825
- let r = Some ( ( & ( * self . tail ) . key , & ( * self . tail ) . value ) ) ;
826
- r
832
+ Some ( ( & ( * self . tail ) . key , & ( * self . tail ) . value ) )
827
833
}
828
834
}
829
835
}
@@ -837,8 +843,7 @@ impl<'a, K, V> DoubleEndedIterator for IterMut<'a, K, V> {
837
843
self . remaining -= 1 ;
838
844
unsafe {
839
845
self . tail = ( * self . tail ) . next ;
840
- let r = Some ( ( & ( * self . tail ) . key , & mut ( * self . tail ) . value ) ) ;
841
- r
846
+ Some ( ( & ( * self . tail ) . key , & mut ( * self . tail ) . value ) )
842
847
}
843
848
}
844
849
}
@@ -854,6 +859,7 @@ impl<'a, K, V> ExactSizeIterator for IterMut<'a, K, V> {
854
859
855
860
/// An insertion-order iterator over a `LinkedHashMap`'s keys.
856
861
pub struct Keys < ' a , K : ' a , V : ' a > {
862
+ #[ cfg_attr( feature = "clippy" , allow( type_complexity) ) ]
857
863
inner : iter:: Map < Iter < ' a , K , V > , fn ( ( & ' a K , & ' a V ) ) -> & ' a K >
858
864
}
859
865
@@ -878,6 +884,7 @@ impl<'a, K, V> ExactSizeIterator for Keys<'a, K, V> {
878
884
879
885
/// An insertion-order iterator over a `LinkedHashMap`'s values.
880
886
pub struct Values < ' a , K : ' a , V : ' a > {
887
+ #[ cfg_attr( feature = "clippy" , allow( type_complexity) ) ]
881
888
inner : iter:: Map < Iter < ' a , K , V > , fn ( ( & ' a K , & ' a V ) ) -> & ' a V >
882
889
}
883
890
0 commit comments