1
Fork 0

dlist: Add .rotate_to_front(), .rotate_to_back()

Add methods to move back element to front or front element to back,
without reallocating nodes.
This commit is contained in:
blake2-ppc 2013-07-21 19:31:40 +02:00
parent 78d0cf1409
commit b71c3d250f

View file

@ -258,6 +258,26 @@ impl<T> DList<T> {
DList{list_head: None, list_tail: Rawlink::none(), length: 0}
}
/// Move the last element to the front of the list.
///
/// If the list is empty, do nothing.
#[inline]
pub fn rotate_to_front(&mut self) {
do self.pop_back_node().map_consume |tail| {
self.push_front_node(tail)
};
}
/// Move the first element to the back of the list.
///
/// If the list is empty, do nothing.
#[inline]
pub fn rotate_to_back(&mut self) {
do self.pop_front_node().map_consume |head| {
self.push_back_node(head)
};
}
/// Add all elements from `other` to the end of the list
///
/// O(1)
@ -688,6 +708,29 @@ mod tests {
}
}
#[test]
fn test_rotate() {
let mut n = DList::new::<int>();
n.rotate_to_back(); check_links(&n);
assert_eq!(n.len(), 0);
n.rotate_to_front(); check_links(&n);
assert_eq!(n.len(), 0);
let v = ~[1,2,3,4,5];
let mut m = list_from(v);
m.rotate_to_back(); check_links(&m);
m.rotate_to_front(); check_links(&m);
assert_eq!(v.iter().collect::<~[&int]>(), m.iter().collect());
m.rotate_to_front(); check_links(&m);
m.rotate_to_front(); check_links(&m);
m.pop_front(); check_links(&m);
m.rotate_to_front(); check_links(&m);
m.rotate_to_back(); check_links(&m);
m.push_front(9); check_links(&m);
m.rotate_to_front(); check_links(&m);
assert_eq!(~[3,9,5,1,2], m.consume_iter().collect());
}
#[test]
fn test_iterator() {
let m = generate_test();