@@ -117,7 +117,7 @@ impl<K: Hash + Eq, V, S: HashState> LinkedHashMap<K, V, S> {
117
117
fn with_map ( map : HashMap < KeyRef < K > , Box < LinkedHashMapEntry < K , V > > , S > ) -> LinkedHashMap < K , V , S > {
118
118
let map = LinkedHashMap {
119
119
map : map,
120
- head : unsafe { boxed:: into_raw ( Box :: new ( mem:: uninitialized :: < LinkedHashMapEntry < K , V > > ( ) ) ) } ,
120
+ head : unsafe { boxed:: into_raw ( Box :: new ( mem:: uninitialized ( ) ) ) } ,
121
121
} ;
122
122
unsafe {
123
123
( * map. head ) . next = map. head ;
@@ -324,12 +324,76 @@ impl<K: Hash + Eq, V, S: HashState> LinkedHashMap<K, V, S> {
324
324
/// assert_eq!(map.get(&2), Some(&20));
325
325
/// ```
326
326
#[ inline]
327
- pub fn pop_front ( & mut self ) {
327
+ pub fn pop_front ( & mut self ) -> Option < V > {
328
328
if self . len ( ) > 0 {
329
329
let lru = unsafe { ( * self . head ) . prev } ;
330
330
self . detach ( lru) ;
331
- self . map . remove ( & KeyRef { k : unsafe { & ( * lru) . key } } ) ;
331
+ return self . map . remove ( & KeyRef { k : unsafe { & ( * lru) . key } } ) . map ( |e| e . value )
332
332
}
333
+ None
334
+ }
335
+
336
+ /// Get the first entry.
337
+ ///
338
+ /// # Examples
339
+ ///
340
+ /// ```
341
+ /// use linked_hash_map::LinkedHashMap;
342
+ /// let mut map = LinkedHashMap::new();
343
+ /// map.insert(1, 10);
344
+ /// map.insert(2, 20);
345
+ /// assert_eq!(map.front(), Some(&10));
346
+ /// ```
347
+ #[ inline]
348
+ pub fn front ( & self ) -> Option < & V > {
349
+ if self . len ( ) > 0 {
350
+ let lru = unsafe { ( * self . head ) . prev } ;
351
+ return self . map . get ( & KeyRef { k : unsafe { & ( * lru) . key } } ) . map ( |e| & e. value )
352
+ }
353
+ None
354
+ }
355
+
356
+ /// Removes the last entry.
357
+ ///
358
+ /// # Examples
359
+ ///
360
+ /// ```
361
+ /// use linked_hash_map::LinkedHashMap;
362
+ /// let mut map = LinkedHashMap::new();
363
+ /// map.insert(1, 10);
364
+ /// map.insert(2, 20);
365
+ /// map.pop_back();
366
+ /// assert_eq!(map.get(&1), Some(&10));
367
+ /// assert_eq!(map.get(&2), None);
368
+ /// ```
369
+ #[ inline]
370
+ pub fn pop_back ( & mut self ) -> Option < V > {
371
+ if self . len ( ) > 0 {
372
+ let mru = unsafe { ( * self . head ) . next } ;
373
+ self . detach ( mru) ;
374
+ return self . map . remove ( & KeyRef { k : unsafe { & ( * mru) . key } } ) . map ( |e| e. value )
375
+ }
376
+ None
377
+ }
378
+
379
+ /// Get the last entry.
380
+ ///
381
+ /// # Examples
382
+ ///
383
+ /// ```
384
+ /// use linked_hash_map::LinkedHashMap;
385
+ /// let mut map = LinkedHashMap::new();
386
+ /// map.insert(1, 10);
387
+ /// map.insert(2, 20);
388
+ /// assert_eq!(map.back(), Some(&20));
389
+ /// ```
390
+ #[ inline]
391
+ pub fn back ( & mut self ) -> Option < & V > {
392
+ if self . len ( ) > 0 {
393
+ let mru = unsafe { ( * self . head ) . next } ;
394
+ return self . map . get ( & KeyRef { k : unsafe { & ( * mru) . key } } ) . map ( |e| & e. value )
395
+ }
396
+ None
333
397
}
334
398
335
399
/// Returns the number of key-value pairs in the map.
@@ -799,6 +863,33 @@ mod tests {
799
863
assert_opt_eq ( map. get ( & 8 ) , 80 ) ;
800
864
}
801
865
866
+
867
+ #[ test]
868
+ fn test_pop ( ) {
869
+ let mut map = LinkedHashMap :: new ( ) ;
870
+ map. insert ( 1 , 10 ) ;
871
+ map. insert ( 2 , 20 ) ;
872
+ map. insert ( 3 , 30 ) ;
873
+ map. insert ( 4 , 40 ) ;
874
+ map. insert ( 5 , 50 ) ;
875
+ assert_eq ! ( map. pop_front( ) , Some ( 10 ) ) ;
876
+ assert ! ( map. get( & 1 ) . is_none( ) ) ;
877
+ assert_eq ! ( map. pop_back( ) , Some ( 50 ) ) ;
878
+ assert ! ( map. get( & 5 ) . is_none( ) ) ;
879
+ map. insert ( 6 , 60 ) ;
880
+ map. insert ( 7 , 70 ) ;
881
+ map. insert ( 8 , 80 ) ;
882
+ assert_eq ! ( map. pop_front( ) , Some ( 20 ) ) ;
883
+ assert ! ( map. get( & 2 ) . is_none( ) ) ;
884
+ assert_eq ! ( map. pop_back( ) , Some ( 80 ) ) ;
885
+ assert ! ( map. get( & 8 ) . is_none( ) ) ;
886
+ map. insert ( 3 , 30 ) ;
887
+ assert_eq ! ( map. pop_front( ) , Some ( 40 ) ) ;
888
+ assert ! ( map. get( & 4 ) . is_none( ) ) ;
889
+ assert_eq ! ( map. pop_back( ) , Some ( 30 ) ) ;
890
+ assert ! ( map. get( & 3 ) . is_none( ) ) ;
891
+ }
892
+
802
893
#[ test]
803
894
fn test_clear ( ) {
804
895
let mut map = LinkedHashMap :: new ( ) ;
0 commit comments