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.
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.
11 //! This crate implements a double-ended queue with `O(1)` amortized inserts and removals from both
12 //! ends of the container. It also has `O(1)` indexing like a vector. The contained elements are
13 //! not required to be copyable, and the queue will be sendable if the contained type is sendable.
14 //! Its interface `Deque` is defined in `collections`.
18 use core::default::Default;
21 use core::raw::Slice as RawSlice;
23 use core::kinds::marker;
25 use core::num::{Int, UnsignedInt};
27 use std::hash::{Writer, Hash};
32 static INITIAL_CAPACITY: uint = 8u; // 2^3
33 static MINIMUM_CAPACITY: uint = 2u;
35 // FIXME(conventions): implement shrink_to_fit. Awkward with the current design, but it should
36 // be scrapped anyway. Defer to rewrite?
37 // FIXME(conventions): implement into_iter
40 /// `RingBuf` is a circular buffer that implements `Deque`.
41 pub struct RingBuf<T> {
42 // tail and head are pointers into the buffer. Tail always points
43 // to the first element that could be read, Head always points
44 // to where data should be written.
45 // If tail == head the buffer is empty. The length of the ringbuf
46 // is defined as the distance between the two.
54 impl<T: Clone> Clone for RingBuf<T> {
55 fn clone(&self) -> RingBuf<T> {
56 self.iter().map(|t| t.clone()).collect()
61 impl<T> Drop for RingBuf<T> {
65 if mem::size_of::<T>() != 0 {
66 heap::deallocate(self.ptr as *mut u8,
67 self.cap * mem::size_of::<T>(),
68 mem::min_align_of::<T>())
74 impl<T> Default for RingBuf<T> {
76 fn default() -> RingBuf<T> { RingBuf::new() }
80 /// Turn ptr into a slice
82 unsafe fn buffer_as_slice(&self) -> &[T] {
83 mem::transmute(RawSlice { data: self.ptr as *const T, len: self.cap })
86 /// Moves an element out of the buffer
88 unsafe fn buffer_read(&mut self, off: uint) -> T {
89 ptr::read(self.ptr.offset(off as int) as *const T)
92 /// Writes an element into the buffer, moving it.
94 unsafe fn buffer_write(&mut self, off: uint, t: T) {
95 ptr::write(self.ptr.offset(off as int), t);
98 /// Returns true iff the buffer is at capacity
100 fn is_full(&self) -> bool { self.cap - self.len() == 1 }
102 /// Returns the index in the underlying buffer for a given logical element index.
104 fn wrap_index(&self, idx: uint) -> uint { wrap_index(idx, self.cap) }
108 /// Creates an empty `RingBuf`.
109 #[unstable = "matches collection reform specification, waiting for dust to settle"]
110 pub fn new() -> RingBuf<T> {
111 RingBuf::with_capacity(INITIAL_CAPACITY)
114 /// Creates an empty `RingBuf` with space for at least `n` elements.
115 #[unstable = "matches collection reform specification, waiting for dust to settle"]
116 pub fn with_capacity(n: uint) -> RingBuf<T> {
117 // +1 since the ringbuffer always leaves one space empty
118 let cap = cmp::max(n + 1, MINIMUM_CAPACITY).next_power_of_two();
119 let size = cap.checked_mul(mem::size_of::<T>())
120 .expect("capacity overflow");
122 let ptr = if mem::size_of::<T>() != 0 {
124 let ptr = heap::allocate(size, mem::min_align_of::<T>()) as *mut T;;
125 if ptr.is_null() { ::alloc::oom() }
129 heap::EMPTY as *mut T
140 /// Retrieves an element in the `RingBuf` by index.
145 /// use std::collections::RingBuf;
147 /// let mut buf = RingBuf::new();
148 /// buf.push_back(3i);
149 /// buf.push_back(4);
150 /// buf.push_back(5);
151 /// assert_eq!(buf.get(1).unwrap(), &4);
153 #[unstable = "matches collection reform specification, waiting for dust to settle"]
154 pub fn get(&self, i: uint) -> Option<&T> {
156 let idx = self.wrap_index(self.tail + i);
157 unsafe { Some(&*self.ptr.offset(idx as int)) }
163 /// Retrieves an element in the `RingBuf` mutably by index.
168 /// use std::collections::RingBuf;
170 /// let mut buf = RingBuf::new();
171 /// buf.push_back(3i);
172 /// buf.push_back(4);
173 /// buf.push_back(5);
174 /// match buf.get_mut(1) {
181 /// assert_eq!(buf[1], 7);
183 #[unstable = "matches collection reform specification, waiting for dust to settle"]
184 pub fn get_mut(&mut self, i: uint) -> Option<&mut T> {
186 let idx = self.wrap_index(self.tail + i);
187 unsafe { Some(&mut *self.ptr.offset(idx as int)) }
193 /// Swaps elements at indices `i` and `j`.
195 /// `i` and `j` may be equal.
197 /// Fails if there is no element with either index.
202 /// use std::collections::RingBuf;
204 /// let mut buf = RingBuf::new();
205 /// buf.push_back(3i);
206 /// buf.push_back(4);
207 /// buf.push_back(5);
209 /// assert_eq!(buf[0], 5);
210 /// assert_eq!(buf[2], 3);
212 pub fn swap(&mut self, i: uint, j: uint) {
213 assert!(i < self.len());
214 assert!(j < self.len());
215 let ri = self.wrap_index(self.tail + i);
216 let rj = self.wrap_index(self.tail + j);
218 ptr::swap(self.ptr.offset(ri as int), self.ptr.offset(rj as int))
222 /// Returns the number of elements the `RingBuf` can hold without
228 /// use std::collections::RingBuf;
230 /// let buf: RingBuf<int> = RingBuf::with_capacity(10);
231 /// assert!(buf.capacity() >= 10);
234 #[unstable = "matches collection reform specification, waiting for dust to settle"]
235 pub fn capacity(&self) -> uint { self.cap - 1 }
237 /// Reserves the minimum capacity for exactly `additional` more elements to be inserted in the
238 /// given `RingBuf`. Does nothing if the capacity is already sufficient.
240 /// Note that the allocator may give the collection more space than it requests. Therefore
241 /// capacity can not be relied upon to be precisely minimal. Prefer `reserve` if future
242 /// insertions are expected.
246 /// Panics if the new capacity overflows `uint`.
251 /// use std::collections::RingBuf;
253 /// let mut buf: RingBuf<int> = vec![1].into_iter().collect();
254 /// buf.reserve_exact(10);
255 /// assert!(buf.capacity() >= 11);
257 #[unstable = "matches collection reform specification, waiting for dust to settle"]
258 pub fn reserve_exact(&mut self, additional: uint) {
259 self.reserve(additional);
262 /// Reserves capacity for at least `additional` more elements to be inserted in the given
263 /// `Ringbuf`. The collection may reserve more space to avoid frequent reallocations.
267 /// Panics if the new capacity overflows `uint`.
272 /// use std::collections::RingBuf;
274 /// let mut buf: RingBuf<int> = vec![1].into_iter().collect();
276 /// assert!(buf.capacity() >= 11);
278 #[unstable = "matches collection reform specification, waiting for dust to settle"]
279 pub fn reserve(&mut self, additional: uint) {
280 let new_len = self.len() + additional;
281 assert!(new_len + 1 > self.len(), "capacity overflow");
282 if new_len > self.capacity() {
283 let count = (new_len + 1).next_power_of_two();
284 assert!(count >= new_len + 1);
286 if mem::size_of::<T>() != 0 {
287 let old = self.cap * mem::size_of::<T>();
288 let new = count.checked_mul(mem::size_of::<T>())
289 .expect("capacity overflow");
291 self.ptr = heap::reallocate(self.ptr as *mut u8,
294 mem::min_align_of::<T>()) as *mut T;
295 if self.ptr.is_null() { ::alloc::oom() }
299 // Move the shortest contiguous section of the ring buffer
301 // [o o o o o o o . ]
303 // A [o o o o o o o . . . . . . . . . ]
305 // [o o . o o o o o ]
307 // B [. . . o o o o o o o . . . . . . ]
309 // [o o o o o . o o ]
311 // C [o o o o o . . . . . . . . . o o ]
313 let oldcap = self.cap;
316 if self.tail <= self.head { // A
318 } else if self.head < oldcap - self.tail { // B
320 ptr::copy_nonoverlapping_memory(
321 self.ptr.offset(oldcap as int),
322 self.ptr as *const T,
327 debug_assert!(self.head > self.tail);
330 ptr::copy_nonoverlapping_memory(
331 self.ptr.offset((count - (oldcap - self.tail)) as int),
332 self.ptr.offset(self.tail as int) as *const T,
336 self.tail = count - (oldcap - self.tail);
337 debug_assert!(self.head < self.tail);
339 debug_assert!(self.head < self.cap);
340 debug_assert!(self.tail < self.cap);
341 debug_assert!(self.cap.count_ones() == 1);
345 /// Returns a front-to-back iterator.
350 /// use std::collections::RingBuf;
352 /// let mut buf = RingBuf::new();
353 /// buf.push_back(5i);
354 /// buf.push_back(3);
355 /// buf.push_back(4);
356 /// let b: &[_] = &[&5, &3, &4];
357 /// assert_eq!(buf.iter().collect::<Vec<&int>>().as_slice(), b);
359 #[unstable = "matches collection reform specification, waiting for dust to settle"]
360 pub fn iter(&self) -> Items<T> {
364 ring: unsafe { self.buffer_as_slice() }
368 /// Returns a front-to-back iterator which returns mutable references.
373 /// use std::collections::RingBuf;
375 /// let mut buf = RingBuf::new();
376 /// buf.push_back(5i);
377 /// buf.push_back(3);
378 /// buf.push_back(4);
379 /// for num in buf.iter_mut() {
382 /// let b: &[_] = &[&mut 3, &mut 1, &mut 2];
383 /// assert_eq!(buf.iter_mut().collect::<Vec<&mut int>>()[], b);
385 #[unstable = "matches collection reform specification, waiting for dust to settle"]
386 pub fn iter_mut<'a>(&'a mut self) -> MutItems<'a, T> {
392 marker: marker::ContravariantLifetime::<'a>,
393 marker2: marker::NoCopy
397 /// Returns the number of elements in the `RingBuf`.
402 /// use std::collections::RingBuf;
404 /// let mut v = RingBuf::new();
405 /// assert_eq!(v.len(), 0);
407 /// assert_eq!(v.len(), 1);
409 #[unstable = "matches collection reform specification, waiting for dust to settle"]
410 pub fn len(&self) -> uint { count(self.tail, self.head, self.cap) }
412 /// Returns true if the buffer contains no elements
417 /// use std::collections::RingBuf;
419 /// let mut v = RingBuf::new();
420 /// assert!(v.is_empty());
421 /// v.push_front(1i);
422 /// assert!(!v.is_empty());
424 #[unstable = "matches collection reform specification, waiting for dust to settle"]
425 pub fn is_empty(&self) -> bool { self.len() == 0 }
427 /// Clears the buffer, removing all values.
432 /// use std::collections::RingBuf;
434 /// let mut v = RingBuf::new();
437 /// assert!(v.is_empty());
439 #[unstable = "matches collection reform specification, waiting for dust to settle"]
440 pub fn clear(&mut self) {
441 while self.pop_front().is_some() {}
446 /// Provides a reference to the front element, or `None` if the sequence is
452 /// use std::collections::RingBuf;
454 /// let mut d = RingBuf::new();
455 /// assert_eq!(d.front(), None);
459 /// assert_eq!(d.front(), Some(&1i));
461 #[unstable = "matches collection reform specification, waiting for dust to settle"]
462 pub fn front(&self) -> Option<&T> {
463 if !self.is_empty() { Some(&self[0]) } else { None }
466 /// Provides a mutable reference to the front element, or `None` if the
467 /// sequence is empty.
472 /// use std::collections::RingBuf;
474 /// let mut d = RingBuf::new();
475 /// assert_eq!(d.front_mut(), None);
479 /// match d.front_mut() {
480 /// Some(x) => *x = 9i,
483 /// assert_eq!(d.front(), Some(&9i));
485 #[unstable = "matches collection reform specification, waiting for dust to settle"]
486 pub fn front_mut(&mut self) -> Option<&mut T> {
487 if !self.is_empty() { Some(&mut self[0]) } else { None }
490 /// Provides a reference to the back element, or `None` if the sequence is
496 /// use std::collections::RingBuf;
498 /// let mut d = RingBuf::new();
499 /// assert_eq!(d.back(), None);
503 /// assert_eq!(d.back(), Some(&2i));
505 #[unstable = "matches collection reform specification, waiting for dust to settle"]
506 pub fn back(&self) -> Option<&T> {
507 if !self.is_empty() { Some(&self[self.len() - 1]) } else { None }
510 /// Provides a mutable reference to the back element, or `None` if the
511 /// sequence is empty.
516 /// use std::collections::RingBuf;
518 /// let mut d = RingBuf::new();
519 /// assert_eq!(d.back(), None);
523 /// match d.back_mut() {
524 /// Some(x) => *x = 9i,
527 /// assert_eq!(d.back(), Some(&9i));
529 #[unstable = "matches collection reform specification, waiting for dust to settle"]
530 pub fn back_mut(&mut self) -> Option<&mut T> {
531 let len = self.len();
532 if !self.is_empty() { Some(&mut self[len - 1]) } else { None }
535 /// Removes the first element and returns it, or `None` if the sequence is
541 /// use std::collections::RingBuf;
543 /// let mut d = RingBuf::new();
547 /// assert_eq!(d.pop_front(), Some(1i));
548 /// assert_eq!(d.pop_front(), Some(2i));
549 /// assert_eq!(d.pop_front(), None);
551 #[unstable = "matches collection reform specification, waiting for dust to settle"]
552 pub fn pop_front(&mut self) -> Option<T> {
556 let tail = self.tail;
557 self.tail = self.wrap_index(self.tail + 1);
558 unsafe { Some(self.buffer_read(tail)) }
562 /// Inserts an element first in the sequence.
567 /// use std::collections::RingBuf;
569 /// let mut d = RingBuf::new();
570 /// d.push_front(1i);
571 /// d.push_front(2i);
572 /// assert_eq!(d.front(), Some(&2i));
574 #[unstable = "matches collection reform specification, waiting for dust to settle"]
575 pub fn push_front(&mut self, t: T) {
578 debug_assert!(!self.is_full());
581 self.tail = self.wrap_index(self.tail - 1);
582 let tail = self.tail;
583 unsafe { self.buffer_write(tail, t); }
586 /// Deprecated: Renamed to `push_back`.
587 #[deprecated = "Renamed to `push_back`"]
588 pub fn push(&mut self, t: T) {
592 /// Appends an element to the back of a buffer
597 /// use std::collections::RingBuf;
599 /// let mut buf = RingBuf::new();
600 /// buf.push_back(1i);
601 /// buf.push_back(3);
602 /// assert_eq!(3, *buf.back().unwrap());
604 #[unstable = "matches collection reform specification, waiting for dust to settle"]
605 pub fn push_back(&mut self, t: T) {
608 debug_assert!(!self.is_full());
611 let head = self.head;
612 self.head = self.wrap_index(self.head + 1);
613 unsafe { self.buffer_write(head, t) }
616 /// Deprecated: Renamed to `pop_back`.
617 #[deprecated = "Renamed to `pop_back`"]
618 pub fn pop(&mut self) -> Option<T> {
622 /// Removes the last element from a buffer and returns it, or `None` if
628 /// use std::collections::RingBuf;
630 /// let mut buf = RingBuf::new();
631 /// assert_eq!(buf.pop_back(), None);
632 /// buf.push_back(1i);
633 /// buf.push_back(3);
634 /// assert_eq!(buf.pop_back(), Some(3));
636 #[unstable = "matches collection reform specification, waiting for dust to settle"]
637 pub fn pop_back(&mut self) -> Option<T> {
641 self.head = self.wrap_index(self.head - 1);
642 let head = self.head;
643 unsafe { Some(self.buffer_read(head)) }
648 /// Returns the index in the underlying buffer for a given logical element index.
650 fn wrap_index(index: uint, size: uint) -> uint {
651 // size is always a power of 2
655 /// Calculate the number of elements left to be read in the buffer
657 fn count(tail: uint, head: uint, size: uint) -> uint {
658 // size is always a power of 2
659 (head - tail) & (size - 1)
662 /// `RingBuf` iterator.
663 pub struct Items<'a, T:'a> {
669 impl<'a, T> Iterator<&'a T> for Items<'a, T> {
671 fn next(&mut self) -> Option<&'a T> {
672 if self.tail == self.head {
675 let tail = self.tail;
676 self.tail = wrap_index(self.tail + 1, self.ring.len());
677 unsafe { Some(self.ring.unsafe_get(tail)) }
681 fn size_hint(&self) -> (uint, Option<uint>) {
682 let len = count(self.tail, self.head, self.ring.len());
687 impl<'a, T> DoubleEndedIterator<&'a T> for Items<'a, T> {
689 fn next_back(&mut self) -> Option<&'a T> {
690 if self.tail == self.head {
693 self.head = wrap_index(self.head - 1, self.ring.len());
694 unsafe { Some(self.ring.unsafe_get(self.head)) }
699 impl<'a, T> ExactSize<&'a T> for Items<'a, T> {}
701 impl<'a, T> RandomAccessIterator<&'a T> for Items<'a, T> {
703 fn indexable(&self) -> uint {
704 let (len, _) = self.size_hint();
709 fn idx(&mut self, j: uint) -> Option<&'a T> {
710 if j >= self.indexable() {
713 let idx = wrap_index(self.tail + j, self.ring.len());
714 unsafe { Some(self.ring.unsafe_get(idx)) }
719 // FIXME This was implemented differently from Items because of a problem
720 // with returning the mutable reference. I couldn't find a way to
721 // make the lifetime checker happy so, but there should be a way.
722 /// `RingBuf` mutable iterator.
723 pub struct MutItems<'a, T:'a> {
728 marker: marker::ContravariantLifetime<'a>,
729 marker2: marker::NoCopy
732 impl<'a, T> Iterator<&'a mut T> for MutItems<'a, T> {
734 fn next(&mut self) -> Option<&'a mut T> {
735 if self.tail == self.head {
738 let tail = self.tail;
739 self.tail = wrap_index(self.tail + 1, self.cap);
740 if mem::size_of::<T>() != 0 {
741 unsafe { Some(&mut *self.ptr.offset(tail as int)) }
743 // use a non-zero pointer
744 Some(unsafe { mem::transmute(1u) })
749 fn size_hint(&self) -> (uint, Option<uint>) {
750 let len = count(self.tail, self.head, self.cap);
755 impl<'a, T> DoubleEndedIterator<&'a mut T> for MutItems<'a, T> {
757 fn next_back(&mut self) -> Option<&'a mut T> {
758 if self.tail == self.head {
761 self.head = wrap_index(self.head - 1, self.cap);
762 unsafe { Some(&mut *self.ptr.offset(self.head as int)) }
766 impl<'a, T> ExactSize<&'a mut T> for MutItems<'a, T> {}
768 impl<A: PartialEq> PartialEq for RingBuf<A> {
769 fn eq(&self, other: &RingBuf<A>) -> bool {
770 self.len() == other.len() &&
771 self.iter().zip(other.iter()).all(|(a, b)| a.eq(b))
773 fn ne(&self, other: &RingBuf<A>) -> bool {
778 impl<A: Eq> Eq for RingBuf<A> {}
780 impl<A: PartialOrd> PartialOrd for RingBuf<A> {
781 fn partial_cmp(&self, other: &RingBuf<A>) -> Option<Ordering> {
782 iter::order::partial_cmp(self.iter(), other.iter())
786 impl<A: Ord> Ord for RingBuf<A> {
788 fn cmp(&self, other: &RingBuf<A>) -> Ordering {
789 iter::order::cmp(self.iter(), other.iter())
793 impl<S: Writer, A: Hash<S>> Hash<S> for RingBuf<A> {
794 fn hash(&self, state: &mut S) {
795 self.len().hash(state);
796 for elt in self.iter() {
802 impl<A> Index<uint, A> for RingBuf<A> {
804 fn index<'a>(&'a self, i: &uint) -> &'a A {
805 self.get(*i).expect("Out of bounds access")
809 impl<A> IndexMut<uint, A> for RingBuf<A> {
811 fn index_mut<'a>(&'a mut self, i: &uint) -> &'a mut A {
812 self.get_mut(*i).expect("Out of bounds access")
816 impl<A> FromIterator<A> for RingBuf<A> {
817 fn from_iter<T: Iterator<A>>(iterator: T) -> RingBuf<A> {
818 let (lower, _) = iterator.size_hint();
819 let mut deq = RingBuf::with_capacity(lower);
820 deq.extend(iterator);
825 impl<A> Extend<A> for RingBuf<A> {
826 fn extend<T: Iterator<A>>(&mut self, mut iterator: T) {
827 for elt in iterator {
833 impl<T: fmt::Show> fmt::Show for RingBuf<T> {
834 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
835 try!(write!(f, "["));
837 for (i, e) in self.iter().enumerate() {
838 if i != 0 { try!(write!(f, ", ")); }
839 try!(write!(f, "{}", *e));
860 let mut d = RingBuf::new();
861 assert_eq!(d.len(), 0u);
865 assert_eq!(d.len(), 3u);
867 assert_eq!(d.len(), 4u);
868 debug!("{}", d.front());
869 assert_eq!(*d.front().unwrap(), 42);
870 debug!("{}", d.back());
871 assert_eq!(*d.back().unwrap(), 137);
872 let mut i = d.pop_front();
874 assert_eq!(i, Some(42));
877 assert_eq!(i, Some(137));
880 assert_eq!(i, Some(137));
883 assert_eq!(i, Some(17));
884 assert_eq!(d.len(), 0u);
886 assert_eq!(d.len(), 1u);
888 assert_eq!(d.len(), 2u);
890 assert_eq!(d.len(), 3u);
892 assert_eq!(d.len(), 4u);
904 fn test_parameterized<T:Clone + PartialEq + Show>(a: T, b: T, c: T, d: T) {
905 let mut deq = RingBuf::new();
906 assert_eq!(deq.len(), 0);
907 deq.push_front(a.clone());
908 deq.push_front(b.clone());
909 deq.push_back(c.clone());
910 assert_eq!(deq.len(), 3);
911 deq.push_back(d.clone());
912 assert_eq!(deq.len(), 4);
913 assert_eq!((*deq.front().unwrap()).clone(), b.clone());
914 assert_eq!((*deq.back().unwrap()).clone(), d.clone());
915 assert_eq!(deq.pop_front().unwrap(), b.clone());
916 assert_eq!(deq.pop_back().unwrap(), d.clone());
917 assert_eq!(deq.pop_back().unwrap(), c.clone());
918 assert_eq!(deq.pop_back().unwrap(), a.clone());
919 assert_eq!(deq.len(), 0);
920 deq.push_back(c.clone());
921 assert_eq!(deq.len(), 1);
922 deq.push_front(b.clone());
923 assert_eq!(deq.len(), 2);
924 deq.push_back(d.clone());
925 assert_eq!(deq.len(), 3);
926 deq.push_front(a.clone());
927 assert_eq!(deq.len(), 4);
928 assert_eq!(deq[0].clone(), a.clone());
929 assert_eq!(deq[1].clone(), b.clone());
930 assert_eq!(deq[2].clone(), c.clone());
931 assert_eq!(deq[3].clone(), d.clone());
935 fn test_push_front_grow() {
936 let mut deq = RingBuf::new();
937 for i in range(0u, 66) {
940 assert_eq!(deq.len(), 66);
942 for i in range(0u, 66) {
943 assert_eq!(deq[i], 65 - i);
946 let mut deq = RingBuf::new();
947 for i in range(0u, 66) {
951 for i in range(0u, 66) {
952 assert_eq!(deq[i], i);
958 let mut deq = RingBuf::new();
959 for i in range(1u, 4) {
962 assert_eq!(deq[1], 2);
967 fn test_index_out_of_bounds() {
968 let mut deq = RingBuf::new();
969 for i in range(1u, 4) {
976 fn bench_new(b: &mut test::Bencher) {
978 let ring: RingBuf<u64> = RingBuf::new();
979 test::black_box(ring);
984 fn bench_push_back_100(b: &mut test::Bencher) {
985 let mut deq = RingBuf::with_capacity(101);
987 for i in range(0i, 100) {
996 fn bench_push_front_100(b: &mut test::Bencher) {
997 let mut deq = RingBuf::with_capacity(101);
999 for i in range(0i, 100) {
1008 fn bench_pop_back_100(b: &mut test::Bencher) {
1009 let mut deq: RingBuf<int> = RingBuf::with_capacity(101);
1014 while !deq.is_empty() {
1015 test::black_box(deq.pop_back());
1021 fn bench_pop_front_100(b: &mut test::Bencher) {
1022 let mut deq: RingBuf<int> = RingBuf::with_capacity(101);
1027 while !deq.is_empty() {
1028 test::black_box(deq.pop_front());
1034 fn bench_grow_1025(b: &mut test::Bencher) {
1036 let mut deq = RingBuf::new();
1037 for i in range(0i, 1025) {
1040 test::black_box(deq);
1045 fn bench_iter_1000(b: &mut test::Bencher) {
1046 let ring: RingBuf<int> = range(0i, 1000).collect();
1050 for &i in ring.iter() {
1053 test::black_box(sum);
1058 fn bench_mut_iter_1000(b: &mut test::Bencher) {
1059 let mut ring: RingBuf<int> = range(0i, 1000).collect();
1063 for i in ring.iter_mut() {
1066 test::black_box(sum);
1071 #[deriving(Clone, PartialEq, Show)]
1075 Three(int, int, int),
1078 #[deriving(Clone, PartialEq, Show)]
1082 Threepar(int, int, int),
1085 #[deriving(Clone, PartialEq, Show)]
1093 fn test_param_int() {
1094 test_parameterized::<int>(5, 72, 64, 175);
1098 fn test_param_taggy() {
1099 test_parameterized::<Taggy>(One(1), Two(1, 2), Three(1, 2, 3), Two(17, 42));
1103 fn test_param_taggypar() {
1104 test_parameterized::<Taggypar<int>>(Onepar::<int>(1),
1105 Twopar::<int>(1, 2),
1106 Threepar::<int>(1, 2, 3),
1107 Twopar::<int>(17, 42));
1111 fn test_param_reccy() {
1112 let reccy1 = RecCy { x: 1, y: 2, t: One(1) };
1113 let reccy2 = RecCy { x: 345, y: 2, t: Two(1, 2) };
1114 let reccy3 = RecCy { x: 1, y: 777, t: Three(1, 2, 3) };
1115 let reccy4 = RecCy { x: 19, y: 252, t: Two(17, 42) };
1116 test_parameterized::<RecCy>(reccy1, reccy2, reccy3, reccy4);
1120 fn test_with_capacity() {
1121 let mut d = RingBuf::with_capacity(0);
1123 assert_eq!(d.len(), 1);
1124 let mut d = RingBuf::with_capacity(50);
1126 assert_eq!(d.len(), 1);
1130 fn test_with_capacity_non_power_two() {
1131 let mut d3 = RingBuf::with_capacity(3);
1136 assert_eq!(d3.pop_front(), Some(1));
1138 assert_eq!(d3.front(), None);
1145 assert_eq!(d3.pop_front(), Some(3));
1147 // Pushing the lo past half way point to trigger
1148 // the 'B' scenario for growth
1155 // There used to be a bug here about how the
1156 // RingBuf made growth assumptions about the
1157 // underlying Vec which didn't hold and lead
1159 // (Vec grows to next power of two)
1160 //good- [9, 12, 15, X, X, X, X, |6]
1161 //bug- [15, 12, X, X, X, |6, X, X]
1162 assert_eq!(d3.pop_front(), Some(6));
1164 // Which leads us to the following state which
1165 // would be a failure case.
1166 //bug- [15, 12, X, X, X, X, |X, X]
1167 assert_eq!(d3.front(), Some(&9));
1171 fn test_reserve_exact() {
1172 let mut d = RingBuf::new();
1174 d.reserve_exact(50);
1175 assert!(d.capacity() >= 51);
1176 let mut d = RingBuf::new();
1178 d.reserve_exact(50);
1179 assert!(d.capacity() >= 51);
1184 let mut d = RingBuf::new();
1187 assert!(d.capacity() >= 51);
1188 let mut d = RingBuf::new();
1191 assert!(d.capacity() >= 51);
1196 let mut d: RingBuf<int> = range(0i, 5).collect();
1199 assert_eq!(d.iter().map(|&x|x).collect::<Vec<int>>(), vec!(4, 2, 3, 1));
1204 let mut d = RingBuf::new();
1205 assert_eq!(d.iter().next(), None);
1206 assert_eq!(d.iter().size_hint(), (0, Some(0)));
1208 for i in range(0i, 5) {
1212 let b: &[_] = &[&0,&1,&2,&3,&4];
1213 assert_eq!(d.iter().collect::<Vec<&int>>().as_slice(), b);
1216 for i in range(6i, 9) {
1220 let b: &[_] = &[&8,&7,&6,&0,&1,&2,&3,&4];
1221 assert_eq!(d.iter().collect::<Vec<&int>>().as_slice(), b);
1224 let mut it = d.iter();
1225 let mut len = d.len();
1229 _ => { len -= 1; assert_eq!(it.size_hint(), (len, Some(len))) }
1235 fn test_rev_iter() {
1236 let mut d = RingBuf::new();
1237 assert_eq!(d.iter().rev().next(), None);
1239 for i in range(0i, 5) {
1243 let b: &[_] = &[&4,&3,&2,&1,&0];
1244 assert_eq!(d.iter().rev().collect::<Vec<&int>>().as_slice(), b);
1247 for i in range(6i, 9) {
1250 let b: &[_] = &[&4,&3,&2,&1,&0,&6,&7,&8];
1251 assert_eq!(d.iter().rev().collect::<Vec<&int>>().as_slice(), b);
1255 fn test_mut_rev_iter_wrap() {
1256 let mut d = RingBuf::with_capacity(3);
1257 assert!(d.iter_mut().rev().next().is_none());
1262 assert_eq!(d.pop_front(), Some(1));
1265 assert_eq!(d.iter_mut().rev().map(|x| *x).collect::<Vec<int>>(),
1270 fn test_mut_iter() {
1271 let mut d = RingBuf::new();
1272 assert!(d.iter_mut().next().is_none());
1274 for i in range(0u, 3) {
1278 for (i, elt) in d.iter_mut().enumerate() {
1279 assert_eq!(*elt, 2 - i);
1284 let mut it = d.iter_mut();
1285 assert_eq!(*it.next().unwrap(), 0);
1286 assert_eq!(*it.next().unwrap(), 1);
1287 assert_eq!(*it.next().unwrap(), 2);
1288 assert!(it.next().is_none());
1293 fn test_mut_rev_iter() {
1294 let mut d = RingBuf::new();
1295 assert!(d.iter_mut().rev().next().is_none());
1297 for i in range(0u, 3) {
1301 for (i, elt) in d.iter_mut().rev().enumerate() {
1302 assert_eq!(*elt, i);
1307 let mut it = d.iter_mut().rev();
1308 assert_eq!(*it.next().unwrap(), 0);
1309 assert_eq!(*it.next().unwrap(), 1);
1310 assert_eq!(*it.next().unwrap(), 2);
1311 assert!(it.next().is_none());
1316 fn test_from_iter() {
1318 let v = vec!(1i,2,3,4,5,6,7);
1319 let deq: RingBuf<int> = v.iter().map(|&x| x).collect();
1320 let u: Vec<int> = deq.iter().map(|&x| x).collect();
1323 let mut seq = iter::count(0u, 2).take(256);
1324 let deq: RingBuf<uint> = seq.collect();
1325 for (i, &x) in deq.iter().enumerate() {
1328 assert_eq!(deq.len(), 256);
1333 let mut d = RingBuf::new();
1338 assert_eq!(d.len(), 4u);
1339 let mut e = d.clone();
1340 assert_eq!(e.len(), 4u);
1341 while !d.is_empty() {
1342 assert_eq!(d.pop_back(), e.pop_back());
1344 assert_eq!(d.len(), 0u);
1345 assert_eq!(e.len(), 0u);
1350 let mut d = RingBuf::new();
1351 assert!(d == RingBuf::with_capacity(0));
1356 let mut e = RingBuf::with_capacity(0);
1366 assert!(e == RingBuf::new());
1371 let mut x = RingBuf::new();
1372 let mut y = RingBuf::new();
1384 assert!(hash::hash(&x) == hash::hash(&y));
1389 let x = RingBuf::new();
1390 let mut y = RingBuf::new();
1402 let ringbuf: RingBuf<int> = range(0i, 10).collect();
1403 assert!(format!("{}", ringbuf).as_slice() == "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]");
1405 let ringbuf: RingBuf<&str> = vec!["just", "one", "test", "more"].iter()
1408 assert!(format!("{}", ringbuf).as_slice() == "[just, one, test, more]");
1413 static mut drops: uint = 0;
1415 impl Drop for Elem {
1416 fn drop(&mut self) {
1417 unsafe { drops += 1; }
1421 let mut ring = RingBuf::new();
1422 ring.push_back(Elem);
1423 ring.push_front(Elem);
1424 ring.push_back(Elem);
1425 ring.push_front(Elem);
1428 assert_eq!(unsafe {drops}, 4);
1432 fn test_drop_with_pop() {
1433 static mut drops: uint = 0;
1435 impl Drop for Elem {
1436 fn drop(&mut self) {
1437 unsafe { drops += 1; }
1441 let mut ring = RingBuf::new();
1442 ring.push_back(Elem);
1443 ring.push_front(Elem);
1444 ring.push_back(Elem);
1445 ring.push_front(Elem);
1447 drop(ring.pop_back());
1448 drop(ring.pop_front());
1449 assert_eq!(unsafe {drops}, 2);
1452 assert_eq!(unsafe {drops}, 4);
1456 fn test_drop_clear() {
1457 static mut drops: uint = 0;
1459 impl Drop for Elem {
1460 fn drop(&mut self) {
1461 unsafe { drops += 1; }
1465 let mut ring = RingBuf::new();
1466 ring.push_back(Elem);
1467 ring.push_front(Elem);
1468 ring.push_back(Elem);
1469 ring.push_front(Elem);
1471 assert_eq!(unsafe {drops}, 4);
1474 assert_eq!(unsafe {drops}, 4);
1478 fn test_reserve_grow() {
1479 // test growth path A
1480 // [T o o H] -> [T o o H . . . . ]
1481 let mut ring = RingBuf::with_capacity(4);
1482 for i in range(0i, 3) {
1486 for i in range(0i, 3) {
1487 assert_eq!(ring.pop_front(), Some(i));
1490 // test growth path B
1491 // [H T o o] -> [. T o o H . . . ]
1492 let mut ring = RingBuf::with_capacity(4);
1493 for i in range(0i, 1) {
1495 assert_eq!(ring.pop_front(), Some(i));
1497 for i in range(0i, 3) {
1501 for i in range(0i, 3) {
1502 assert_eq!(ring.pop_front(), Some(i));
1505 // test growth path C
1506 // [o o H T] -> [o o H . . . . T ]
1507 let mut ring = RingBuf::with_capacity(4);
1508 for i in range(0i, 3) {
1510 assert_eq!(ring.pop_front(), Some(i));
1512 for i in range(0i, 3) {
1516 for i in range(0i, 3) {
1517 assert_eq!(ring.pop_front(), Some(i));
1523 let mut ring = RingBuf::new();
1525 assert_eq!(ring.get(0), Some(&0));
1526 assert_eq!(ring.get(1), None);
1529 assert_eq!(ring.get(0), Some(&0));
1530 assert_eq!(ring.get(1), Some(&1));
1531 assert_eq!(ring.get(2), None);
1534 assert_eq!(ring.get(0), Some(&0));
1535 assert_eq!(ring.get(1), Some(&1));
1536 assert_eq!(ring.get(2), Some(&2));
1537 assert_eq!(ring.get(3), None);
1539 assert_eq!(ring.pop_front(), Some(0));
1540 assert_eq!(ring.get(0), Some(&1));
1541 assert_eq!(ring.get(1), Some(&2));
1542 assert_eq!(ring.get(2), None);
1544 assert_eq!(ring.pop_front(), Some(1));
1545 assert_eq!(ring.get(0), Some(&2));
1546 assert_eq!(ring.get(1), None);
1548 assert_eq!(ring.pop_front(), Some(2));
1549 assert_eq!(ring.get(0), None);
1550 assert_eq!(ring.get(1), None);
1555 let mut ring = RingBuf::new();
1556 for i in range(0i, 3) {
1560 match ring.get_mut(1) {
1565 assert_eq!(ring.get_mut(0), Some(&mut 0));
1566 assert_eq!(ring.get_mut(1), Some(&mut -1));
1567 assert_eq!(ring.get_mut(2), Some(&mut 2));
1568 assert_eq!(ring.get_mut(3), None);
1570 assert_eq!(ring.pop_front(), Some(0));
1571 assert_eq!(ring.get_mut(0), Some(&mut -1));
1572 assert_eq!(ring.get_mut(1), Some(&mut 2));
1573 assert_eq!(ring.get_mut(2), None);