Skip to content

Commit fe2ab44

Browse files
committed
Merge pull request #22 from arthurprs/master
*front and *back should also return the entry key
2 parents 2233af4 + 7944b29 commit fe2ab44

File tree

1 file changed

+22
-16
lines changed

1 file changed

+22
-16
lines changed

src/lib.rs

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -323,11 +323,13 @@ impl<K: Hash + Eq, V, S: HashState> LinkedHashMap<K, V, S> {
323323
/// assert_eq!(map.get(&2), Some(&20));
324324
/// ```
325325
#[inline]
326-
pub fn pop_front(&mut self) -> Option<V> {
326+
pub fn pop_front(&mut self) -> Option<(K, V)> {
327327
if self.len() > 0 {
328328
let lru = unsafe { (*self.head).prev };
329329
self.detach(lru);
330-
return self.map.remove(&KeyRef{k: unsafe { &(*lru).key }}).map(|e| e.value)
330+
return self.map
331+
.remove(&KeyRef{k: unsafe { &(*lru).key }})
332+
.map(|e| { let e = *e; (e.key, e.value) })
331333
}
332334
None
333335
}
@@ -341,13 +343,14 @@ impl<K: Hash + Eq, V, S: HashState> LinkedHashMap<K, V, S> {
341343
/// let mut map = LinkedHashMap::new();
342344
/// map.insert(1, 10);
343345
/// map.insert(2, 20);
344-
/// assert_eq!(map.front(), Some(&10));
346+
/// assert_eq!(map.front(), Some((&1, &10)));
345347
/// ```
346348
#[inline]
347-
pub fn front(&self) -> Option<&V> {
349+
pub fn front(&self) -> Option<(&K, &V)> {
348350
if self.len() > 0 {
349351
let lru = unsafe { (*self.head).prev };
350-
return self.map.get(&KeyRef{k: unsafe { &(*lru).key }}).map(|e| &e.value)
352+
return self.map.get(&KeyRef{k: unsafe { &(*lru).key }})
353+
.map(|e| (&e.key, &e.value))
351354
}
352355
None
353356
}
@@ -366,11 +369,13 @@ impl<K: Hash + Eq, V, S: HashState> LinkedHashMap<K, V, S> {
366369
/// assert_eq!(map.get(&2), None);
367370
/// ```
368371
#[inline]
369-
pub fn pop_back(&mut self) -> Option<V> {
372+
pub fn pop_back(&mut self) -> Option<(K, V)> {
370373
if self.len() > 0 {
371374
let mru = unsafe { (*self.head).next };
372375
self.detach(mru);
373-
return self.map.remove(&KeyRef{k: unsafe { &(*mru).key }}).map(|e| e.value)
376+
return self.map
377+
.remove(&KeyRef{k: unsafe { &(*mru).key }})
378+
.map(|e| { let e = *e; (e.key, e.value) })
374379
}
375380
None
376381
}
@@ -384,13 +389,14 @@ impl<K: Hash + Eq, V, S: HashState> LinkedHashMap<K, V, S> {
384389
/// let mut map = LinkedHashMap::new();
385390
/// map.insert(1, 10);
386391
/// map.insert(2, 20);
387-
/// assert_eq!(map.back(), Some(&20));
392+
/// assert_eq!(map.back(), Some((&2, &20)));
388393
/// ```
389394
#[inline]
390-
pub fn back(&mut self) -> Option<&V> {
395+
pub fn back(&mut self) -> Option<(&K, &V)> {
391396
if self.len() > 0 {
392397
let mru = unsafe { (*self.head).next };
393-
return self.map.get(&KeyRef{k: unsafe { &(*mru).key }}).map(|e| &e.value)
398+
return self.map.get(&KeyRef{k: unsafe { &(*mru).key }})
399+
.map(|e| (&e.key, &e.value))
394400
}
395401
None
396402
}
@@ -871,21 +877,21 @@ mod tests {
871877
map.insert(3, 30);
872878
map.insert(4, 40);
873879
map.insert(5, 50);
874-
assert_eq!(map.pop_front(), Some(10));
880+
assert_eq!(map.pop_front(), Some((1, 10)));
875881
assert!(map.get(&1).is_none());
876-
assert_eq!(map.pop_back(), Some(50));
882+
assert_eq!(map.pop_back(), Some((5, 50)));
877883
assert!(map.get(&5).is_none());
878884
map.insert(6, 60);
879885
map.insert(7, 70);
880886
map.insert(8, 80);
881-
assert_eq!(map.pop_front(), Some(20));
887+
assert_eq!(map.pop_front(), Some((2, 20)));
882888
assert!(map.get(&2).is_none());
883-
assert_eq!(map.pop_back(), Some(80));
889+
assert_eq!(map.pop_back(), Some((8, 80)));
884890
assert!(map.get(&8).is_none());
885891
map.insert(3, 30);
886-
assert_eq!(map.pop_front(), Some(40));
892+
assert_eq!(map.pop_front(), Some((4, 40)));
887893
assert!(map.get(&4).is_none());
888-
assert_eq!(map.pop_back(), Some(30));
894+
assert_eq!(map.pop_back(), Some((3, 30)));
889895
assert!(map.get(&3).is_none());
890896
}
891897

0 commit comments

Comments
 (0)