Skip to content

Commit 6179c39

Browse files
committed
Merge pull request #20 from arthurprs/master
Add front and back methods; pop_* methods return removed values
2 parents 5464247 + 4a53363 commit 6179c39

File tree

1 file changed

+94
-3
lines changed

1 file changed

+94
-3
lines changed

src/lib.rs

Lines changed: 94 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ impl<K: Hash + Eq, V, S: HashState> LinkedHashMap<K, V, S> {
117117
fn with_map(map: HashMap<KeyRef<K>, Box<LinkedHashMapEntry<K, V>>, S>) -> LinkedHashMap<K, V, S> {
118118
let map = LinkedHashMap {
119119
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())) },
121121
};
122122
unsafe {
123123
(*map.head).next = map.head;
@@ -324,12 +324,76 @@ impl<K: Hash + Eq, V, S: HashState> LinkedHashMap<K, V, S> {
324324
/// assert_eq!(map.get(&2), Some(&20));
325325
/// ```
326326
#[inline]
327-
pub fn pop_front(&mut self) {
327+
pub fn pop_front(&mut self) -> Option<V> {
328328
if self.len() > 0 {
329329
let lru = unsafe { (*self.head).prev };
330330
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)
332332
}
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
333397
}
334398

335399
/// Returns the number of key-value pairs in the map.
@@ -799,6 +863,33 @@ mod tests {
799863
assert_opt_eq(map.get(&8), 80);
800864
}
801865

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+
802893
#[test]
803894
fn test_clear() {
804895
let mut map = LinkedHashMap::new();

0 commit comments

Comments
 (0)