]> git.lizzy.rs Git - rust.git/blob - src/libcollections/dlist.rs
c5fa8286f7db3c1cffdd489bd45d02e9f32d12a6
[rust.git] / src / libcollections / dlist.rs
1 // Copyright 2012-2014 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
4 //
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
10
11 //! A doubly-linked list with owned nodes.
12 //!
13 //! The DList allows pushing and popping elements at either end.
14 //!
15 //! DList implements the trait Deque. It should be imported with `use
16 //! collections::deque::Deque`.
17
18 // DList is constructed like a singly-linked list over the field `next`.
19 // including the last link being None; each Node owns its `next` field.
20 //
21 // Backlinks over DList::prev are raw pointers that form a full chain in
22 // the reverse direction.
23
24 use std::iter;
25 use std::mem;
26 use std::ptr;
27
28 use deque::Deque;
29
30 /// A doubly-linked list.
31 pub struct DList<T> {
32     length: uint,
33     list_head: Link<T>,
34     list_tail: Rawlink<Node<T>>,
35 }
36
37 type Link<T> = Option<Box<Node<T>>>;
38 struct Rawlink<T> { p: *mut T }
39
40 struct Node<T> {
41     next: Link<T>,
42     prev: Rawlink<Node<T>>,
43     value: T,
44 }
45
46 /// Double-ended DList iterator
47 pub struct Items<'a, T> {
48     head: &'a Link<T>,
49     tail: Rawlink<Node<T>>,
50     nelem: uint,
51 }
52
53 // FIXME #11820: the &'a Option<> of the Link stops clone working.
54 impl<'a, T> Clone for Items<'a, T> {
55     fn clone(&self) -> Items<'a, T> { *self }
56 }
57
58 /// Double-ended mutable DList iterator
59 pub struct MutItems<'a, T> {
60     list: &'a mut DList<T>,
61     head: Rawlink<Node<T>>,
62     tail: Rawlink<Node<T>>,
63     nelem: uint,
64 }
65
66 /// DList consuming iterator
67 #[deriving(Clone)]
68 pub struct MoveItems<T> {
69     list: DList<T>
70 }
71
72 /// Rawlink is a type like Option<T> but for holding a raw pointer
73 impl<T> Rawlink<T> {
74     /// Like Option::None for Rawlink
75     fn none() -> Rawlink<T> {
76         Rawlink{p: ptr::mut_null()}
77     }
78
79     /// Like Option::Some for Rawlink
80     fn some(n: &mut T) -> Rawlink<T> {
81         Rawlink{p: n}
82     }
83
84     /// Convert the `Rawlink` into an Option value
85     fn resolve_immut(&self) -> Option<&T> {
86         unsafe { self.p.to_option() }
87     }
88
89     /// Convert the `Rawlink` into an Option value
90     fn resolve(&mut self) -> Option<&mut T> {
91         if self.p.is_null() {
92             None
93         } else {
94             Some(unsafe { mem::transmute(self.p) })
95         }
96     }
97
98     /// Return the `Rawlink` and replace with `Rawlink::none()`
99     fn take(&mut self) -> Rawlink<T> {
100         mem::replace(self, Rawlink::none())
101     }
102 }
103
104 impl<T> Clone for Rawlink<T> {
105     #[inline]
106     fn clone(&self) -> Rawlink<T> {
107         Rawlink{p: self.p}
108     }
109 }
110
111 impl<T> Node<T> {
112     fn new(v: T) -> Node<T> {
113         Node{value: v, next: None, prev: Rawlink::none()}
114     }
115 }
116
117 /// Set the .prev field on `next`, then return `Some(next)`
118 fn link_with_prev<T>(mut next: Box<Node<T>>, prev: Rawlink<Node<T>>)
119                   -> Link<T> {
120     next.prev = prev;
121     Some(next)
122 }
123
124 impl<T> Container for DList<T> {
125     /// O(1)
126     #[inline]
127     fn is_empty(&self) -> bool {
128         self.list_head.is_none()
129     }
130     /// O(1)
131     #[inline]
132     fn len(&self) -> uint {
133         self.length
134     }
135 }
136
137 impl<T> Mutable for DList<T> {
138     /// Remove all elements from the DList
139     ///
140     /// O(N)
141     #[inline]
142     fn clear(&mut self) {
143         *self = DList::new()
144     }
145 }
146
147 // private methods
148 impl<T> DList<T> {
149     /// Add a Node first in the list
150     #[inline]
151     fn push_front_node(&mut self, mut new_head: Box<Node<T>>) {
152         match self.list_head {
153             None => {
154                 self.list_tail = Rawlink::some(new_head);
155                 self.list_head = link_with_prev(new_head, Rawlink::none());
156             }
157             Some(ref mut head) => {
158                 new_head.prev = Rawlink::none();
159                 head.prev = Rawlink::some(new_head);
160                 mem::swap(head, &mut new_head);
161                 head.next = Some(new_head);
162             }
163         }
164         self.length += 1;
165     }
166
167     /// Remove the first Node and return it, or None if the list is empty
168     #[inline]
169     fn pop_front_node(&mut self) -> Option<Box<Node<T>>> {
170         self.list_head.take().map(|mut front_node| {
171             self.length -= 1;
172             match front_node.next.take() {
173                 Some(node) => self.list_head = link_with_prev(node, Rawlink::none()),
174                 None => self.list_tail = Rawlink::none()
175             }
176             front_node
177         })
178     }
179
180     /// Add a Node last in the list
181     #[inline]
182     fn push_back_node(&mut self, mut new_tail: Box<Node<T>>) {
183         match self.list_tail.resolve() {
184             None => return self.push_front_node(new_tail),
185             Some(tail) => {
186                 self.list_tail = Rawlink::some(new_tail);
187                 tail.next = link_with_prev(new_tail, Rawlink::some(tail));
188             }
189         }
190         self.length += 1;
191     }
192
193     /// Remove the last Node and return it, or None if the list is empty
194     #[inline]
195     fn pop_back_node(&mut self) -> Option<Box<Node<T>>> {
196         self.list_tail.resolve().map_or(None, |tail| {
197             self.length -= 1;
198             self.list_tail = tail.prev;
199             match tail.prev.resolve() {
200                 None => self.list_head.take(),
201                 Some(tail_prev) => tail_prev.next.take()
202             }
203         })
204     }
205 }
206
207 impl<T> Deque<T> for DList<T> {
208     /// Provide a reference to the front element, or None if the list is empty
209     #[inline]
210     fn front<'a>(&'a self) -> Option<&'a T> {
211         self.list_head.as_ref().map(|head| &head.value)
212     }
213
214     /// Provide a mutable reference to the front element, or None if the list is empty
215     #[inline]
216     fn front_mut<'a>(&'a mut self) -> Option<&'a mut T> {
217         self.list_head.as_mut().map(|head| &mut head.value)
218     }
219
220     /// Provide a reference to the back element, or None if the list is empty
221     #[inline]
222     fn back<'a>(&'a self) -> Option<&'a T> {
223         let tmp = self.list_tail.resolve_immut(); // FIXME: #3511: shouldn't need variable
224         tmp.as_ref().map(|tail| &tail.value)
225     }
226
227     /// Provide a mutable reference to the back element, or None if the list is empty
228     #[inline]
229     fn back_mut<'a>(&'a mut self) -> Option<&'a mut T> {
230         let tmp: Option<&'a mut Node<T>> =
231             self.list_tail.resolve(); // FIXME: #3511: shouldn't need variable
232         tmp.map(|tail| &mut tail.value)
233     }
234
235     /// Add an element first in the list
236     ///
237     /// O(1)
238     fn push_front(&mut self, elt: T) {
239         self.push_front_node(box Node::new(elt))
240     }
241
242     /// Remove the first element and return it, or None if the list is empty
243     ///
244     /// O(1)
245     fn pop_front(&mut self) -> Option<T> {
246         self.pop_front_node().map(|box Node{value, ..}| value)
247     }
248
249     /// Add an element last in the list
250     ///
251     /// O(1)
252     fn push_back(&mut self, elt: T) {
253         self.push_back_node(box Node::new(elt))
254     }
255
256     /// Remove the last element and return it, or None if the list is empty
257     ///
258     /// O(1)
259     fn pop_back(&mut self) -> Option<T> {
260         self.pop_back_node().map(|box Node{value, ..}| value)
261     }
262 }
263
264 impl<T> DList<T> {
265     /// Create an empty DList
266     #[inline]
267     pub fn new() -> DList<T> {
268         DList{list_head: None, list_tail: Rawlink::none(), length: 0}
269     }
270
271     /// Move the last element to the front of the list.
272     ///
273     /// If the list is empty, do nothing.
274     #[inline]
275     pub fn rotate_forward(&mut self) {
276         self.pop_back_node().map(|tail| {
277             self.push_front_node(tail)
278         });
279     }
280
281     /// Move the first element to the back of the list.
282     ///
283     /// If the list is empty, do nothing.
284     #[inline]
285     pub fn rotate_backward(&mut self) {
286         self.pop_front_node().map(|head| {
287             self.push_back_node(head)
288         });
289     }
290
291     /// Add all elements from `other` to the end of the list
292     ///
293     /// O(1)
294     pub fn append(&mut self, mut other: DList<T>) {
295         match self.list_tail.resolve() {
296             None => *self = other,
297             Some(tail) => {
298                 // Carefully empty `other`.
299                 let o_tail = other.list_tail.take();
300                 let o_length = other.length;
301                 match other.list_head.take() {
302                     None => return,
303                     Some(node) => {
304                         tail.next = link_with_prev(node, self.list_tail);
305                         self.list_tail = o_tail;
306                         self.length += o_length;
307                     }
308                 }
309             }
310         }
311     }
312
313     /// Add all elements from `other` to the beginning of the list
314     ///
315     /// O(1)
316     #[inline]
317     pub fn prepend(&mut self, mut other: DList<T>) {
318         mem::swap(self, &mut other);
319         self.append(other);
320     }
321
322     /// Insert `elt` before the first `x` in the list where `f(x, elt)` is true,
323     /// or at the end.
324     ///
325     /// O(N)
326     pub fn insert_when(&mut self, elt: T, f: |&T, &T| -> bool) {
327         {
328             let mut it = self.mut_iter();
329             loop {
330                 match it.peek_next() {
331                     None => break,
332                     Some(x) => if f(x, &elt) { break }
333                 }
334                 it.next();
335             }
336             it.insert_next(elt);
337         }
338     }
339
340     /// Merge DList `other` into this DList, using the function `f`.
341     /// Iterate the both DList with `a` from self and `b` from `other`, and
342     /// put `a` in the result if `f(a, b)` is true, else `b`.
343     ///
344     /// O(max(N, M))
345     pub fn merge(&mut self, mut other: DList<T>, f: |&T, &T| -> bool) {
346         {
347             let mut it = self.mut_iter();
348             loop {
349                 let take_a = match (it.peek_next(), other.front()) {
350                     (_   , None) => return,
351                     (None, _   ) => break,
352                     (Some(ref mut x), Some(y)) => f(*x, y),
353                 };
354                 if take_a {
355                     it.next();
356                 } else {
357                     it.insert_next_node(other.pop_front_node().unwrap());
358                 }
359             }
360         }
361         self.append(other);
362     }
363
364
365     /// Provide a forward iterator
366     #[inline]
367     pub fn iter<'a>(&'a self) -> Items<'a, T> {
368         Items{nelem: self.len(), head: &self.list_head, tail: self.list_tail}
369     }
370
371     /// Provide a forward iterator with mutable references
372     #[inline]
373     pub fn mut_iter<'a>(&'a mut self) -> MutItems<'a, T> {
374         let head_raw = match self.list_head {
375             Some(ref mut h) => Rawlink::some(*h),
376             None => Rawlink::none(),
377         };
378         MutItems{
379             nelem: self.len(),
380             head: head_raw,
381             tail: self.list_tail,
382             list: self
383         }
384     }
385
386
387     /// Consume the list into an iterator yielding elements by value
388     #[inline]
389     pub fn move_iter(self) -> MoveItems<T> {
390         MoveItems{list: self}
391     }
392 }
393
394 impl<T: TotalOrd> DList<T> {
395     /// Insert `elt` sorted in ascending order
396     ///
397     /// O(N)
398     #[inline]
399     pub fn insert_ordered(&mut self, elt: T) {
400         self.insert_when(elt, |a, b| a >= b)
401     }
402 }
403
404 #[unsafe_destructor]
405 impl<T> Drop for DList<T> {
406     fn drop(&mut self) {
407         // Dissolve the dlist in backwards direction
408         // Just dropping the list_head can lead to stack exhaustion
409         // when length is >> 1_000_000
410         let mut tail = self.list_tail;
411         loop {
412             match tail.resolve() {
413                 None => break,
414                 Some(prev) => {
415                     prev.next.take(); // release Box<Node<T>>
416                     tail = prev.prev;
417                 }
418             }
419         }
420         self.length = 0;
421         self.list_head = None;
422         self.list_tail = Rawlink::none();
423     }
424 }
425
426
427 impl<'a, A> Iterator<&'a A> for Items<'a, A> {
428     #[inline]
429     fn next(&mut self) -> Option<&'a A> {
430         if self.nelem == 0 {
431             return None;
432         }
433         self.head.as_ref().map(|head| {
434             self.nelem -= 1;
435             self.head = &head.next;
436             &head.value
437         })
438     }
439
440     #[inline]
441     fn size_hint(&self) -> (uint, Option<uint>) {
442         (self.nelem, Some(self.nelem))
443     }
444 }
445
446 impl<'a, A> DoubleEndedIterator<&'a A> for Items<'a, A> {
447     #[inline]
448     fn next_back(&mut self) -> Option<&'a A> {
449         if self.nelem == 0 {
450             return None;
451         }
452         let tmp = self.tail.resolve_immut(); // FIXME: #3511: shouldn't need variable
453         tmp.as_ref().map(|prev| {
454             self.nelem -= 1;
455             self.tail = prev.prev;
456             &prev.value
457         })
458     }
459 }
460
461 impl<'a, A> ExactSize<&'a A> for Items<'a, A> {}
462
463 impl<'a, A> Iterator<&'a mut A> for MutItems<'a, A> {
464     #[inline]
465     fn next(&mut self) -> Option<&'a mut A> {
466         if self.nelem == 0 {
467             return None;
468         }
469         self.head.resolve().map(|next| {
470             self.nelem -= 1;
471             self.head = match next.next {
472                 Some(ref mut node) => Rawlink::some(&mut **node),
473                 None => Rawlink::none(),
474             };
475             &mut next.value
476         })
477     }
478
479     #[inline]
480     fn size_hint(&self) -> (uint, Option<uint>) {
481         (self.nelem, Some(self.nelem))
482     }
483 }
484
485 impl<'a, A> DoubleEndedIterator<&'a mut A> for MutItems<'a, A> {
486     #[inline]
487     fn next_back(&mut self) -> Option<&'a mut A> {
488         if self.nelem == 0 {
489             return None;
490         }
491         self.tail.resolve().map(|prev| {
492             self.nelem -= 1;
493             self.tail = prev.prev;
494             &mut prev.value
495         })
496     }
497 }
498
499 impl<'a, A> ExactSize<&'a mut A> for MutItems<'a, A> {}
500
501 /// Allow mutating the DList while iterating
502 pub trait ListInsertion<A> {
503     /// Insert `elt` just after to the element most recently returned by `.next()`
504     ///
505     /// The inserted element does not appear in the iteration.
506     fn insert_next(&mut self, elt: A);
507
508     /// Provide a reference to the next element, without changing the iterator
509     fn peek_next<'a>(&'a mut self) -> Option<&'a mut A>;
510 }
511
512 // private methods for MutItems
513 impl<'a, A> MutItems<'a, A> {
514     fn insert_next_node(&mut self, mut ins_node: Box<Node<A>>) {
515         // Insert before `self.head` so that it is between the
516         // previously yielded element and self.head.
517         //
518         // The inserted node will not appear in further iteration.
519         match self.head.resolve() {
520             None => { self.list.push_back_node(ins_node); }
521             Some(node) => {
522                 let prev_node = match node.prev.resolve() {
523                     None => return self.list.push_front_node(ins_node),
524                     Some(prev) => prev,
525                 };
526                 let node_own = prev_node.next.take_unwrap();
527                 ins_node.next = link_with_prev(node_own, Rawlink::some(ins_node));
528                 prev_node.next = link_with_prev(ins_node, Rawlink::some(prev_node));
529                 self.list.length += 1;
530             }
531         }
532     }
533 }
534
535 impl<'a, A> ListInsertion<A> for MutItems<'a, A> {
536     #[inline]
537     fn insert_next(&mut self, elt: A) {
538         self.insert_next_node(box Node::new(elt))
539     }
540
541     #[inline]
542     fn peek_next<'a>(&'a mut self) -> Option<&'a mut A> {
543         if self.nelem == 0 {
544             return None
545         }
546         self.head.resolve().map(|head| &mut head.value)
547     }
548 }
549
550 impl<A> Iterator<A> for MoveItems<A> {
551     #[inline]
552     fn next(&mut self) -> Option<A> { self.list.pop_front() }
553
554     #[inline]
555     fn size_hint(&self) -> (uint, Option<uint>) {
556         (self.list.length, Some(self.list.length))
557     }
558 }
559
560 impl<A> DoubleEndedIterator<A> for MoveItems<A> {
561     #[inline]
562     fn next_back(&mut self) -> Option<A> { self.list.pop_back() }
563 }
564
565 impl<A> FromIterator<A> for DList<A> {
566     fn from_iter<T: Iterator<A>>(iterator: T) -> DList<A> {
567         let mut ret = DList::new();
568         ret.extend(iterator);
569         ret
570     }
571 }
572
573 impl<A> Extendable<A> for DList<A> {
574     fn extend<T: Iterator<A>>(&mut self, mut iterator: T) {
575         for elt in iterator { self.push_back(elt); }
576     }
577 }
578
579 impl<A: Eq> Eq for DList<A> {
580     fn eq(&self, other: &DList<A>) -> bool {
581         self.len() == other.len() &&
582             iter::order::eq(self.iter(), other.iter())
583     }
584
585     fn ne(&self, other: &DList<A>) -> bool {
586         self.len() != other.len() ||
587             iter::order::ne(self.iter(), other.iter())
588     }
589 }
590
591 impl<A: Ord> Ord for DList<A> {
592     fn lt(&self, other: &DList<A>) -> bool {
593         iter::order::lt(self.iter(), other.iter())
594     }
595     fn le(&self, other: &DList<A>) -> bool {
596         iter::order::le(self.iter(), other.iter())
597     }
598     fn gt(&self, other: &DList<A>) -> bool {
599         iter::order::gt(self.iter(), other.iter())
600     }
601     fn ge(&self, other: &DList<A>) -> bool {
602         iter::order::ge(self.iter(), other.iter())
603     }
604 }
605
606 impl<A: Clone> Clone for DList<A> {
607     fn clone(&self) -> DList<A> {
608         self.iter().map(|x| x.clone()).collect()
609     }
610 }
611
612 #[cfg(test)]
613 mod tests {
614     extern crate test;
615     use self::test::Bencher;
616     use deque::Deque;
617     use rand;
618     use super::{DList, Node, ListInsertion};
619
620     pub fn check_links<T>(list: &DList<T>) {
621         let mut len = 0u;
622         let mut last_ptr: Option<&Node<T>> = None;
623         let mut node_ptr: &Node<T>;
624         match list.list_head {
625             None => { assert_eq!(0u, list.length); return }
626             Some(ref node) => node_ptr = &**node,
627         }
628         loop {
629             match (last_ptr, node_ptr.prev.resolve_immut()) {
630                 (None   , None      ) => {}
631                 (None   , _         ) => fail!("prev link for list_head"),
632                 (Some(p), Some(pptr)) => {
633                     assert_eq!(p as *Node<T>, pptr as *Node<T>);
634                 }
635                 _ => fail!("prev link is none, not good"),
636             }
637             match node_ptr.next {
638                 Some(ref next) => {
639                     last_ptr = Some(node_ptr);
640                     node_ptr = &**next;
641                     len += 1;
642                 }
643                 None => {
644                     len += 1;
645                     break;
646                 }
647             }
648         }
649         assert_eq!(len, list.length);
650     }
651
652     #[test]
653     fn test_basic() {
654         let mut m: DList<Box<int>> = DList::new();
655         assert_eq!(m.pop_front(), None);
656         assert_eq!(m.pop_back(), None);
657         assert_eq!(m.pop_front(), None);
658         m.push_front(box 1);
659         assert_eq!(m.pop_front(), Some(box 1));
660         m.push_back(box 2);
661         m.push_back(box 3);
662         assert_eq!(m.len(), 2);
663         assert_eq!(m.pop_front(), Some(box 2));
664         assert_eq!(m.pop_front(), Some(box 3));
665         assert_eq!(m.len(), 0);
666         assert_eq!(m.pop_front(), None);
667         m.push_back(box 1);
668         m.push_back(box 3);
669         m.push_back(box 5);
670         m.push_back(box 7);
671         assert_eq!(m.pop_front(), Some(box 1));
672
673         let mut n = DList::new();
674         n.push_front(2);
675         n.push_front(3);
676         {
677             assert_eq!(n.front().unwrap(), &3);
678             let x = n.front_mut().unwrap();
679             assert_eq!(*x, 3);
680             *x = 0;
681         }
682         {
683             assert_eq!(n.back().unwrap(), &2);
684             let y = n.back_mut().unwrap();
685             assert_eq!(*y, 2);
686             *y = 1;
687         }
688         assert_eq!(n.pop_front(), Some(0));
689         assert_eq!(n.pop_front(), Some(1));
690     }
691
692     #[cfg(test)]
693     fn generate_test() -> DList<int> {
694         list_from(&[0,1,2,3,4,5,6])
695     }
696
697     #[cfg(test)]
698     fn list_from<T: Clone>(v: &[T]) -> DList<T> {
699         v.iter().map(|x| (*x).clone()).collect()
700     }
701
702     #[test]
703     fn test_append() {
704         {
705             let mut m = DList::new();
706             let mut n = DList::new();
707             n.push_back(2);
708             m.append(n);
709             assert_eq!(m.len(), 1);
710             assert_eq!(m.pop_back(), Some(2));
711             check_links(&m);
712         }
713         {
714             let mut m = DList::new();
715             let n = DList::new();
716             m.push_back(2);
717             m.append(n);
718             assert_eq!(m.len(), 1);
719             assert_eq!(m.pop_back(), Some(2));
720             check_links(&m);
721         }
722
723         let v = vec![1,2,3,4,5];
724         let u = vec![9,8,1,2,3,4,5];
725         let mut m = list_from(v.as_slice());
726         m.append(list_from(u.as_slice()));
727         check_links(&m);
728         let sum = v.append(u.as_slice());
729         assert_eq!(sum.len(), m.len());
730         for elt in sum.move_iter() {
731             assert_eq!(m.pop_front(), Some(elt))
732         }
733     }
734
735     #[test]
736     fn test_prepend() {
737         {
738             let mut m = DList::new();
739             let mut n = DList::new();
740             n.push_back(2);
741             m.prepend(n);
742             assert_eq!(m.len(), 1);
743             assert_eq!(m.pop_back(), Some(2));
744             check_links(&m);
745         }
746
747         let v = vec![1,2,3,4,5];
748         let u = vec![9,8,1,2,3,4,5];
749         let mut m = list_from(v.as_slice());
750         m.prepend(list_from(u.as_slice()));
751         check_links(&m);
752         let sum = u.append(v.as_slice());
753         assert_eq!(sum.len(), m.len());
754         for elt in sum.move_iter() {
755             assert_eq!(m.pop_front(), Some(elt))
756         }
757     }
758
759     #[test]
760     fn test_rotate() {
761         let mut n: DList<int> = DList::new();
762         n.rotate_backward(); check_links(&n);
763         assert_eq!(n.len(), 0);
764         n.rotate_forward(); check_links(&n);
765         assert_eq!(n.len(), 0);
766
767         let v = vec![1,2,3,4,5];
768         let mut m = list_from(v.as_slice());
769         m.rotate_backward(); check_links(&m);
770         m.rotate_forward(); check_links(&m);
771         assert_eq!(v.iter().collect::<Vec<&int>>(), m.iter().collect());
772         m.rotate_forward(); check_links(&m);
773         m.rotate_forward(); check_links(&m);
774         m.pop_front(); check_links(&m);
775         m.rotate_forward(); check_links(&m);
776         m.rotate_backward(); check_links(&m);
777         m.push_front(9); check_links(&m);
778         m.rotate_forward(); check_links(&m);
779         assert_eq!(vec![3,9,5,1,2], m.move_iter().collect());
780     }
781
782     #[test]
783     fn test_iterator() {
784         let m = generate_test();
785         for (i, elt) in m.iter().enumerate() {
786             assert_eq!(i as int, *elt);
787         }
788         let mut n = DList::new();
789         assert_eq!(n.iter().next(), None);
790         n.push_front(4);
791         let mut it = n.iter();
792         assert_eq!(it.size_hint(), (1, Some(1)));
793         assert_eq!(it.next().unwrap(), &4);
794         assert_eq!(it.size_hint(), (0, Some(0)));
795         assert_eq!(it.next(), None);
796     }
797
798     #[test]
799     fn test_iterator_clone() {
800         let mut n = DList::new();
801         n.push_back(2);
802         n.push_back(3);
803         n.push_back(4);
804         let mut it = n.iter();
805         it.next();
806         let mut jt = it.clone();
807         assert_eq!(it.next(), jt.next());
808         assert_eq!(it.next_back(), jt.next_back());
809         assert_eq!(it.next(), jt.next());
810     }
811
812     #[test]
813     fn test_iterator_double_end() {
814         let mut n = DList::new();
815         assert_eq!(n.iter().next(), None);
816         n.push_front(4);
817         n.push_front(5);
818         n.push_front(6);
819         let mut it = n.iter();
820         assert_eq!(it.size_hint(), (3, Some(3)));
821         assert_eq!(it.next().unwrap(), &6);
822         assert_eq!(it.size_hint(), (2, Some(2)));
823         assert_eq!(it.next_back().unwrap(), &4);
824         assert_eq!(it.size_hint(), (1, Some(1)));
825         assert_eq!(it.next_back().unwrap(), &5);
826         assert_eq!(it.next_back(), None);
827         assert_eq!(it.next(), None);
828     }
829
830     #[test]
831     fn test_rev_iter() {
832         let m = generate_test();
833         for (i, elt) in m.iter().rev().enumerate() {
834             assert_eq!((6 - i) as int, *elt);
835         }
836         let mut n = DList::new();
837         assert_eq!(n.iter().rev().next(), None);
838         n.push_front(4);
839         let mut it = n.iter().rev();
840         assert_eq!(it.size_hint(), (1, Some(1)));
841         assert_eq!(it.next().unwrap(), &4);
842         assert_eq!(it.size_hint(), (0, Some(0)));
843         assert_eq!(it.next(), None);
844     }
845
846     #[test]
847     fn test_mut_iter() {
848         let mut m = generate_test();
849         let mut len = m.len();
850         for (i, elt) in m.mut_iter().enumerate() {
851             assert_eq!(i as int, *elt);
852             len -= 1;
853         }
854         assert_eq!(len, 0);
855         let mut n = DList::new();
856         assert!(n.mut_iter().next().is_none());
857         n.push_front(4);
858         n.push_back(5);
859         let mut it = n.mut_iter();
860         assert_eq!(it.size_hint(), (2, Some(2)));
861         assert!(it.next().is_some());
862         assert!(it.next().is_some());
863         assert_eq!(it.size_hint(), (0, Some(0)));
864         assert!(it.next().is_none());
865     }
866
867     #[test]
868     fn test_iterator_mut_double_end() {
869         let mut n = DList::new();
870         assert!(n.mut_iter().next_back().is_none());
871         n.push_front(4);
872         n.push_front(5);
873         n.push_front(6);
874         let mut it = n.mut_iter();
875         assert_eq!(it.size_hint(), (3, Some(3)));
876         assert_eq!(*it.next().unwrap(), 6);
877         assert_eq!(it.size_hint(), (2, Some(2)));
878         assert_eq!(*it.next_back().unwrap(), 4);
879         assert_eq!(it.size_hint(), (1, Some(1)));
880         assert_eq!(*it.next_back().unwrap(), 5);
881         assert!(it.next_back().is_none());
882         assert!(it.next().is_none());
883     }
884
885     #[test]
886     fn test_insert_prev() {
887         let mut m = list_from(&[0,2,4,6,8]);
888         let len = m.len();
889         {
890             let mut it = m.mut_iter();
891             it.insert_next(-2);
892             loop {
893                 match it.next() {
894                     None => break,
895                     Some(elt) => {
896                         it.insert_next(*elt + 1);
897                         match it.peek_next() {
898                             Some(x) => assert_eq!(*x, *elt + 2),
899                             None => assert_eq!(8, *elt),
900                         }
901                     }
902                 }
903             }
904             it.insert_next(0);
905             it.insert_next(1);
906         }
907         check_links(&m);
908         assert_eq!(m.len(), 3 + len * 2);
909         assert_eq!(m.move_iter().collect::<Vec<int>>(), vec![-2,0,1,2,3,4,5,6,7,8,9,0,1]);
910     }
911
912     #[test]
913     fn test_merge() {
914         let mut m = list_from([0, 1, 3, 5, 6, 7, 2]);
915         let n = list_from([-1, 0, 0, 7, 7, 9]);
916         let len = m.len() + n.len();
917         m.merge(n, |a, b| a <= b);
918         assert_eq!(m.len(), len);
919         check_links(&m);
920         let res = m.move_iter().collect::<Vec<int>>();
921         assert_eq!(res, vec![-1, 0, 0, 0, 1, 3, 5, 6, 7, 2, 7, 7, 9]);
922     }
923
924     #[test]
925     fn test_insert_ordered() {
926         let mut n = DList::new();
927         n.insert_ordered(1);
928         assert_eq!(n.len(), 1);
929         assert_eq!(n.pop_front(), Some(1));
930
931         let mut m = DList::new();
932         m.push_back(2);
933         m.push_back(4);
934         m.insert_ordered(3);
935         check_links(&m);
936         assert_eq!(vec![2,3,4], m.move_iter().collect::<Vec<int>>());
937     }
938
939     #[test]
940     fn test_mut_rev_iter() {
941         let mut m = generate_test();
942         for (i, elt) in m.mut_iter().rev().enumerate() {
943             assert_eq!((6-i) as int, *elt);
944         }
945         let mut n = DList::new();
946         assert!(n.mut_iter().rev().next().is_none());
947         n.push_front(4);
948         let mut it = n.mut_iter().rev();
949         assert!(it.next().is_some());
950         assert!(it.next().is_none());
951     }
952
953     #[test]
954     fn test_send() {
955         let n = list_from([1,2,3]);
956         spawn(proc() {
957             check_links(&n);
958             assert_eq!(&[&1,&2,&3], n.iter().collect::<Vec<&int>>().as_slice());
959         });
960     }
961
962     #[test]
963     fn test_eq() {
964         let mut n: DList<u8> = list_from([]);
965         let mut m = list_from([]);
966         assert!(n == m);
967         n.push_front(1);
968         assert!(n != m);
969         m.push_back(1);
970         assert!(n == m);
971
972         let n = list_from([2,3,4]);
973         let m = list_from([1,2,3]);
974         assert!(n != m);
975     }
976
977     #[test]
978     fn test_ord() {
979         let n: DList<int> = list_from([]);
980         let m = list_from([1,2,3]);
981         assert!(n < m);
982         assert!(m > n);
983         assert!(n <= n);
984         assert!(n >= n);
985     }
986
987     #[test]
988     fn test_ord_nan() {
989         let nan = 0.0/0.0;
990         let n = list_from([nan]);
991         let m = list_from([nan]);
992         assert!(!(n < m));
993         assert!(!(n > m));
994         assert!(!(n <= m));
995         assert!(!(n >= m));
996
997         let n = list_from([nan]);
998         let one = list_from([1.0]);
999         assert!(!(n < one));
1000         assert!(!(n > one));
1001         assert!(!(n <= one));
1002         assert!(!(n >= one));
1003
1004         let u = list_from([1.0,2.0,nan]);
1005         let v = list_from([1.0,2.0,3.0]);
1006         assert!(!(u < v));
1007         assert!(!(u > v));
1008         assert!(!(u <= v));
1009         assert!(!(u >= v));
1010
1011         let s = list_from([1.0,2.0,4.0,2.0]);
1012         let t = list_from([1.0,2.0,3.0,2.0]);
1013         assert!(!(s < t));
1014         assert!(s > one);
1015         assert!(!(s <= one));
1016         assert!(s >= one);
1017     }
1018
1019     #[test]
1020     fn test_fuzz() {
1021         for _ in range(0, 25) {
1022             fuzz_test(3);
1023             fuzz_test(16);
1024             fuzz_test(189);
1025         }
1026     }
1027
1028     #[cfg(test)]
1029     fn fuzz_test(sz: int) {
1030         let mut m: DList<int> = DList::new();
1031         let mut v = vec![];
1032         for i in range(0, sz) {
1033             check_links(&m);
1034             let r: u8 = rand::random();
1035             match r % 6 {
1036                 0 => {
1037                     m.pop_back();
1038                     v.pop();
1039                 }
1040                 1 => {
1041                     m.pop_front();
1042                     v.shift();
1043                 }
1044                 2 | 4 =>  {
1045                     m.push_front(-i);
1046                     v.unshift(-i);
1047                 }
1048                 3 | 5 | _ => {
1049                     m.push_back(i);
1050                     v.push(i);
1051                 }
1052             }
1053         }
1054
1055         check_links(&m);
1056
1057         let mut i = 0u;
1058         for (a, &b) in m.move_iter().zip(v.iter()) {
1059             i += 1;
1060             assert_eq!(a, b);
1061         }
1062         assert_eq!(i, v.len());
1063     }
1064
1065     #[bench]
1066     fn bench_collect_into(b: &mut test::Bencher) {
1067         let v = &[0, ..64];
1068         b.iter(|| {
1069             let _: DList<int> = v.iter().map(|x| *x).collect();
1070         })
1071     }
1072
1073     #[bench]
1074     fn bench_push_front(b: &mut test::Bencher) {
1075         let mut m: DList<int> = DList::new();
1076         b.iter(|| {
1077             m.push_front(0);
1078         })
1079     }
1080
1081     #[bench]
1082     fn bench_push_back(b: &mut test::Bencher) {
1083         let mut m: DList<int> = DList::new();
1084         b.iter(|| {
1085             m.push_back(0);
1086         })
1087     }
1088
1089     #[bench]
1090     fn bench_push_back_pop_back(b: &mut test::Bencher) {
1091         let mut m: DList<int> = DList::new();
1092         b.iter(|| {
1093             m.push_back(0);
1094             m.pop_back();
1095         })
1096     }
1097
1098     #[bench]
1099     fn bench_push_front_pop_front(b: &mut test::Bencher) {
1100         let mut m: DList<int> = DList::new();
1101         b.iter(|| {
1102             m.push_front(0);
1103             m.pop_front();
1104         })
1105     }
1106
1107     #[bench]
1108     fn bench_rotate_forward(b: &mut test::Bencher) {
1109         let mut m: DList<int> = DList::new();
1110         m.push_front(0);
1111         m.push_front(1);
1112         b.iter(|| {
1113             m.rotate_forward();
1114         })
1115     }
1116
1117     #[bench]
1118     fn bench_rotate_backward(b: &mut test::Bencher) {
1119         let mut m: DList<int> = DList::new();
1120         m.push_front(0);
1121         m.push_front(1);
1122         b.iter(|| {
1123             m.rotate_backward();
1124         })
1125     }
1126
1127     #[bench]
1128     fn bench_iter(b: &mut test::Bencher) {
1129         let v = &[0, ..128];
1130         let m: DList<int> = v.iter().map(|&x|x).collect();
1131         b.iter(|| {
1132             assert!(m.iter().len() == 128);
1133         })
1134     }
1135     #[bench]
1136     fn bench_iter_mut(b: &mut test::Bencher) {
1137         let v = &[0, ..128];
1138         let mut m: DList<int> = v.iter().map(|&x|x).collect();
1139         b.iter(|| {
1140             assert!(m.mut_iter().len() == 128);
1141         })
1142     }
1143     #[bench]
1144     fn bench_iter_rev(b: &mut test::Bencher) {
1145         let v = &[0, ..128];
1146         let m: DList<int> = v.iter().map(|&x|x).collect();
1147         b.iter(|| {
1148             assert!(m.iter().rev().len() == 128);
1149         })
1150     }
1151     #[bench]
1152     fn bench_iter_mut_rev(b: &mut test::Bencher) {
1153         let v = &[0, ..128];
1154         let mut m: DList<int> = v.iter().map(|&x|x).collect();
1155         b.iter(|| {
1156             assert!(m.mut_iter().rev().len() == 128);
1157         })
1158     }
1159 }