blob: e09bf1023d6798d3cad2aa3038c23920c32b13cf [file] [log] [blame]
Daniel Micayb47e1e92013-02-16 22:55:551// Copyright 2012-2013 The Rust Project Developers. See the COPYRIGHT
Graydon Hoare00c856c2012-12-04 00:48:012// 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
Daniel Micayb2060172013-03-21 23:14:0211//! A double-ended queue implemented as a circular buffer
blake2-ppc0f9b9a52013-07-11 14:17:5112//!
13//! RingBuf implements the trait Deque. It should be imported with `use
14//! extra::container::Deque`.
Patrick Waltonf3723cf2013-05-17 22:28:4415
Michael Darakanandabf1464c2014-02-06 07:34:3316use std::cmp;
Corey Richardson1662bd32013-06-28 22:32:2617use std::vec;
Sean Chalmers292ed3e2014-01-23 19:41:5718use std::iter::{Rev, RandomAccessIterator};
Alex Crichton998fece2013-05-06 04:42:5419
HeroesGraved81bb442014-02-03 05:56:4920use deque::Deque;
blake2-ppc70523712013-07-10 13:27:1421
blake2-ppc0ff5c172013-07-06 03:42:4522static INITIAL_CAPACITY: uint = 8u; // 2^3
23static MINIMUM_CAPACITY: uint = 2u;
Daniel Micayb47e1e92013-02-16 22:55:5524
blake2-ppc0f9b9a52013-07-11 14:17:5125/// RingBuf is a circular buffer that implements Deque.
blake2-ppc10c76982013-07-06 13:27:3226#[deriving(Clone)]
blake2-ppc70523712013-07-10 13:27:1427pub struct RingBuf<T> {
Daniel Micayb47e1e92013-02-16 22:55:5528 priv nelts: uint,
29 priv lo: uint,
Daniel Micayb47e1e92013-02-16 22:55:5530 priv elts: ~[Option<T>]
Marijn Haverbeke26610db2012-01-11 11:49:3331}
Roy Frostig9c818892010-07-21 01:03:0932
blake2-ppc70523712013-07-10 13:27:1433impl<T> Container for RingBuf<T> {
34 /// Return the number of elements in the RingBuf
Alex Crichtonb29c3682013-06-24 03:44:1135 fn len(&self) -> uint { self.nelts }
Daniel Micayb47e1e92013-02-16 22:55:5536}
Roy Frostig9c818892010-07-21 01:03:0937
blake2-ppc70523712013-07-10 13:27:1438impl<T> Mutable for RingBuf<T> {
39 /// Clear the RingBuf, removing all values.
Daniel Micayed7c9c42013-02-16 23:55:2540 fn clear(&mut self) {
Daniel Micay100894552013-08-03 16:45:2341 for x in self.elts.mut_iter() { *x = None }
Daniel Micayed7c9c42013-02-16 23:55:2542 self.nelts = 0;
43 self.lo = 0;
Daniel Micayed7c9c42013-02-16 23:55:2544 }
45}
46
blake2-ppc70523712013-07-10 13:27:1447impl<T> Deque<T> for RingBuf<T> {
48 /// Return a reference to the first element in the RingBuf
49 fn front<'a>(&'a self) -> Option<&'a T> {
50 if self.nelts > 0 { Some(self.get(0)) } else { None }
blake2-ppc0ff5c172013-07-06 03:42:4551 }
52
blake2-ppc70523712013-07-10 13:27:1453 /// Return a mutable reference to the first element in the RingBuf
54 fn front_mut<'a>(&'a mut self) -> Option<&'a mut T> {
55 if self.nelts > 0 { Some(self.get_mut(0)) } else { None }
Niko Matsakis03396472013-04-10 20:14:0656 }
57
blake2-ppc70523712013-07-10 13:27:1458 /// Return a reference to the last element in the RingBuf
59 fn back<'a>(&'a self) -> Option<&'a T> {
60 if self.nelts > 0 { Some(self.get(self.nelts - 1)) } else { None }
61 }
Niko Matsakis03396472013-04-10 20:14:0662
blake2-ppc70523712013-07-10 13:27:1463 /// Return a mutable reference to the last element in the RingBuf
64 fn back_mut<'a>(&'a mut self) -> Option<&'a mut T> {
65 if self.nelts > 0 { Some(self.get_mut(self.nelts - 1)) } else { None }
66 }
67
68 /// Remove and return the first element in the RingBuf, or None if it is empty
69 fn pop_front(&mut self) -> Option<T> {
blake2-ppc980646a2013-07-17 21:41:5070 let result = self.elts[self.lo].take();
blake2-ppc70523712013-07-10 13:27:1471 if result.is_some() {
72 self.lo = (self.lo + 1u) % self.elts.len();
73 self.nelts -= 1u;
blake2-ppc5d72f3f2013-07-06 03:42:4574 }
Daniel Micay61906612013-02-17 00:43:2975 result
76 }
77
blake2-ppc70523712013-07-10 13:27:1478 /// Remove and return the last element in the RingBuf, or None if it is empty
79 fn pop_back(&mut self) -> Option<T> {
80 if self.nelts > 0 {
81 self.nelts -= 1;
82 let hi = self.raw_index(self.nelts);
blake2-ppc980646a2013-07-17 21:41:5083 self.elts[hi].take()
blake2-ppc70523712013-07-10 13:27:1484 } else {
85 None
86 }
blake2-ppc5d72f3f2013-07-06 03:42:4587 }
88
blake2-ppc70523712013-07-10 13:27:1489 /// Prepend an element to the RingBuf
90 fn push_front(&mut self, t: T) {
blake2-ppc40ce0b72013-07-06 03:42:4591 if self.nelts == self.elts.len() {
blake2-ppc8a326762013-07-06 03:42:4592 grow(self.nelts, &mut self.lo, &mut self.elts);
blake2-ppc40ce0b72013-07-06 03:42:4593 }
Daniel Micayb47e1e92013-02-16 22:55:5594 if self.lo == 0u {
95 self.lo = self.elts.len() - 1u;
96 } else { self.lo -= 1u; }
Daniel Micayb47e1e92013-02-16 22:55:5597 self.elts[self.lo] = Some(t);
98 self.nelts += 1u;
Erick Tryzelaare84576b2013-01-22 16:44:2499 }
Marijn Haverbeke26610db2012-01-11 11:49:33100
blake2-ppc70523712013-07-10 13:27:14101 /// Append an element to the RingBuf
102 fn push_back(&mut self, t: T) {
blake2-ppc5d72f3f2013-07-06 03:42:45103 if self.nelts == self.elts.len() {
blake2-ppc8a326762013-07-06 03:42:45104 grow(self.nelts, &mut self.lo, &mut self.elts);
Graydon Hoare2880ecd2010-09-22 22:44:13105 }
blake2-ppc5d72f3f2013-07-06 03:42:45106 let hi = self.raw_index(self.nelts);
107 self.elts[hi] = Some(t);
Daniel Micayb47e1e92013-02-16 22:55:55108 self.nelts += 1u;
Graydon Hoarece729932011-06-15 18:19:50109 }
blake2-ppc70523712013-07-10 13:27:14110}
Tim Chevalier77de84b2013-05-27 18:47:38111
blake2-ppc70523712013-07-10 13:27:14112impl<T> RingBuf<T> {
113 /// Create an empty RingBuf
114 pub fn new() -> RingBuf<T> {
115 RingBuf::with_capacity(INITIAL_CAPACITY)
116 }
117
118 /// Create an empty RingBuf with space for at least `n` elements.
119 pub fn with_capacity(n: uint) -> RingBuf<T> {
120 RingBuf{nelts: 0, lo: 0,
Michael Darakanandabf1464c2014-02-06 07:34:33121 elts: vec::from_fn(cmp::max(MINIMUM_CAPACITY, n), |_| None)}
blake2-ppc70523712013-07-10 13:27:14122 }
123
124 /// Retrieve an element in the RingBuf by index
125 ///
126 /// Fails if there is no element with the given index
127 pub fn get<'a>(&'a self, i: uint) -> &'a T {
128 let idx = self.raw_index(i);
129 match self.elts[idx] {
Alex Crichtondaf5f5a2013-10-21 20:08:31130 None => fail!(),
blake2-ppc70523712013-07-10 13:27:14131 Some(ref v) => v
132 }
133 }
134
135 /// Retrieve an element in the RingBuf by index
136 ///
137 /// Fails if there is no element with the given index
138 pub fn get_mut<'a>(&'a mut self, i: uint) -> &'a mut T {
139 let idx = self.raw_index(i);
140 match self.elts[idx] {
Alex Crichtondaf5f5a2013-10-21 20:08:31141 None => fail!(),
blake2-ppc70523712013-07-10 13:27:14142 Some(ref mut v) => v
143 }
144 }
145
blake2-ppc57757a82013-09-26 07:19:26146 /// Swap elements at indices `i` and `j`
147 ///
148 /// `i` and `j` may be equal.
149 ///
150 /// Fails if there is no element with the given index
151 pub fn swap(&mut self, i: uint, j: uint) {
152 assert!(i < self.len());
153 assert!(j < self.len());
154 let ri = self.raw_index(i);
155 let rj = self.raw_index(j);
156 self.elts.swap(ri, rj);
157 }
158
blake2-ppc70523712013-07-10 13:27:14159 /// Return index in underlying vec for a given logical element index
160 fn raw_index(&self, idx: uint) -> uint {
161 raw_index(self.lo, self.elts.len(), idx)
162 }
163
164 /// Reserve capacity for exactly `n` elements in the given RingBuf,
Tim Chevalier77de84b2013-05-27 18:47:38165 /// doing nothing if `self`'s capacity is already equal to or greater
166 /// than the requested capacity
167 ///
168 /// # Arguments
169 ///
170 /// * n - The number of elements to reserve space for
David Manescu65f35782014-01-31 13:03:20171 pub fn reserve_exact(&mut self, n: uint) {
172 self.elts.reserve_exact(n);
Tim Chevalier77de84b2013-05-27 18:47:38173 }
174
blake2-ppc70523712013-07-10 13:27:14175 /// Reserve capacity for at least `n` elements in the given RingBuf,
Tim Chevalier77de84b2013-05-27 18:47:38176 /// over-allocating in case the caller needs to reserve additional
177 /// space.
178 ///
179 /// Do nothing if `self`'s capacity is already equal to or greater
180 /// than the requested capacity.
181 ///
182 /// # Arguments
183 ///
184 /// * n - The number of elements to reserve space for
David Manescu65f35782014-01-31 13:03:20185 pub fn reserve(&mut self, n: uint) {
186 self.elts.reserve(n);
Tim Chevalier77de84b2013-05-27 18:47:38187 }
Jed Estep4f7a7422013-06-25 19:08:47188
189 /// Front-to-back iterator.
Palmer Cox3fd8c8b2014-01-15 03:32:24190 pub fn iter<'a>(&'a self) -> Items<'a, T> {
191 Items{index: 0, rindex: self.nelts, lo: self.lo, elts: self.elts}
blake2-ppc3385e792013-07-15 23:13:26192 }
193
194 /// Back-to-front iterator.
Sean Chalmers292ed3e2014-01-23 19:41:57195 pub fn rev_iter<'a>(&'a self) -> Rev<Items<'a, T>> {
196 self.iter().rev()
Jed Estep4f7a7422013-06-25 19:08:47197 }
Corey Richardsonf8ae9b02013-06-26 22:14:35198
Jed Estep4f7a7422013-06-25 19:08:47199 /// Front-to-back iterator which returns mutable values.
Palmer Cox3fd8c8b2014-01-15 03:32:24200 pub fn mut_iter<'a>(&'a mut self) -> MutItems<'a, T> {
Niko Matsakisbc4164d2013-11-16 22:29:39201 let start_index = raw_index(self.lo, self.elts.len(), 0);
202 let end_index = raw_index(self.lo, self.elts.len(), self.nelts);
203
204 // Divide up the array
205 if end_index <= start_index {
206 // Items to iterate goes from:
207 // start_index to self.elts.len()
208 // and then
209 // 0 to end_index
Guillaume Pinot25bb1a42013-12-01 17:19:39210 let (temp, remaining1) = self.elts.mut_split_at(start_index);
211 let (remaining2, _) = temp.mut_split_at(end_index);
Palmer Cox3fd8c8b2014-01-15 03:32:24212 MutItems { remaining1: remaining1,
Niko Matsakisbc4164d2013-11-16 22:29:39213 remaining2: remaining2,
214 nelts: self.nelts }
215 } else {
216 // Items to iterate goes from start_index to end_index:
Guillaume Pinot25bb1a42013-12-01 17:19:39217 let (empty, elts) = self.elts.mut_split_at(0);
Niko Matsakisbc4164d2013-11-16 22:29:39218 let remaining1 = elts.mut_slice(start_index, end_index);
Palmer Cox3fd8c8b2014-01-15 03:32:24219 MutItems { remaining1: remaining1,
Niko Matsakisbc4164d2013-11-16 22:29:39220 remaining2: empty,
221 nelts: self.nelts }
222 }
Jed Estep4f7a7422013-06-25 19:08:47223 }
224
225 /// Back-to-front iterator which returns mutable values.
Sean Chalmers292ed3e2014-01-23 19:41:57226 pub fn mut_rev_iter<'a>(&'a mut self) -> Rev<MutItems<'a, T>> {
227 self.mut_iter().rev()
Jed Estep4f7a7422013-06-25 19:08:47228 }
229}
230
blake2-ppc70523712013-07-10 13:27:14231/// RingBuf iterator
Palmer Cox3fd8c8b2014-01-15 03:32:24232pub struct Items<'a, T> {
blake2-ppc75015c32013-07-06 03:42:45233 priv lo: uint,
blake2-ppc75015c32013-07-06 03:42:45234 priv index: uint,
blake2-ppc3385e792013-07-15 23:13:26235 priv rindex: uint,
Erik Price5731ca32013-12-10 07:16:18236 priv elts: &'a [Option<T>],
Jed Estep4f7a7422013-06-25 19:08:47237}
Niko Matsakisbc4164d2013-11-16 22:29:39238
Palmer Cox3fd8c8b2014-01-15 03:32:24239impl<'a, T> Iterator<&'a T> for Items<'a, T> {
Niko Matsakisbc4164d2013-11-16 22:29:39240 #[inline]
Erik Price5731ca32013-12-10 07:16:18241 fn next(&mut self) -> Option<&'a T> {
Niko Matsakisbc4164d2013-11-16 22:29:39242 if self.index == self.rindex {
243 return None;
244 }
245 let raw_index = raw_index(self.lo, self.elts.len(), self.index);
246 self.index += 1;
247 Some(self.elts[raw_index].get_ref())
248 }
249
250 #[inline]
251 fn size_hint(&self) -> (uint, Option<uint>) {
252 let len = self.rindex - self.index;
253 (len, Some(len))
254 }
255}
256
Palmer Cox3fd8c8b2014-01-15 03:32:24257impl<'a, T> DoubleEndedIterator<&'a T> for Items<'a, T> {
Niko Matsakisbc4164d2013-11-16 22:29:39258 #[inline]
Erik Price5731ca32013-12-10 07:16:18259 fn next_back(&mut self) -> Option<&'a T> {
Niko Matsakisbc4164d2013-11-16 22:29:39260 if self.index == self.rindex {
261 return None;
262 }
263 self.rindex -= 1;
264 let raw_index = raw_index(self.lo, self.elts.len(), self.rindex);
265 Some(self.elts[raw_index].get_ref())
266 }
267}
Jed Estep35314c92013-06-26 15:38:29268
Palmer Cox3fd8c8b2014-01-15 03:32:24269impl<'a, T> ExactSize<&'a T> for Items<'a, T> {}
blake2-ppc7c369ee72013-09-01 16:20:24270
Palmer Cox3fd8c8b2014-01-15 03:32:24271impl<'a, T> RandomAccessIterator<&'a T> for Items<'a, T> {
blake2-ppcf6862132013-07-29 18:16:26272 #[inline]
273 fn indexable(&self) -> uint { self.rindex - self.index }
274
275 #[inline]
Erik Price5731ca32013-12-10 07:16:18276 fn idx(&self, j: uint) -> Option<&'a T> {
blake2-ppcf6862132013-07-29 18:16:26277 if j >= self.indexable() {
278 None
279 } else {
280 let raw_index = raw_index(self.lo, self.elts.len(), self.index + j);
281 Some(self.elts[raw_index].get_ref())
282 }
283 }
284}
285
blake2-ppc70523712013-07-10 13:27:14286/// RingBuf mutable iterator
Palmer Cox3fd8c8b2014-01-15 03:32:24287pub struct MutItems<'a, T> {
Erik Price5731ca32013-12-10 07:16:18288 priv remaining1: &'a mut [Option<T>],
289 priv remaining2: &'a mut [Option<T>],
Niko Matsakisbc4164d2013-11-16 22:29:39290 priv nelts: uint,
Jed Estep4f7a7422013-06-25 19:08:47291}
Niko Matsakisbc4164d2013-11-16 22:29:39292
Palmer Cox3fd8c8b2014-01-15 03:32:24293impl<'a, T> Iterator<&'a mut T> for MutItems<'a, T> {
Niko Matsakisbc4164d2013-11-16 22:29:39294 #[inline]
Erik Price5731ca32013-12-10 07:16:18295 fn next(&mut self) -> Option<&'a mut T> {
Niko Matsakisbc4164d2013-11-16 22:29:39296 if self.nelts == 0 {
297 return None;
298 }
299 let r = if self.remaining1.len() > 0 {
300 &mut self.remaining1
301 } else {
302 assert!(self.remaining2.len() > 0);
303 &mut self.remaining2
304 };
305 self.nelts -= 1;
Nathaniel Hermand451c152014-01-25 17:00:46306 Some(r.mut_shift_ref().unwrap().get_mut_ref())
Niko Matsakisbc4164d2013-11-16 22:29:39307 }
308
309 #[inline]
310 fn size_hint(&self) -> (uint, Option<uint>) {
311 (self.nelts, Some(self.nelts))
312 }
313}
314
Palmer Cox3fd8c8b2014-01-15 03:32:24315impl<'a, T> DoubleEndedIterator<&'a mut T> for MutItems<'a, T> {
Niko Matsakisbc4164d2013-11-16 22:29:39316 #[inline]
Erik Price5731ca32013-12-10 07:16:18317 fn next_back(&mut self) -> Option<&'a mut T> {
Niko Matsakisbc4164d2013-11-16 22:29:39318 if self.nelts == 0 {
319 return None;
320 }
321 let r = if self.remaining2.len() > 0 {
322 &mut self.remaining2
323 } else {
324 assert!(self.remaining1.len() > 0);
325 &mut self.remaining1
326 };
327 self.nelts -= 1;
Nathaniel Herman33960342014-01-25 20:33:31328 Some(r.mut_pop_ref().unwrap().get_mut_ref())
Niko Matsakisbc4164d2013-11-16 22:29:39329 }
330}
Daniel Micayb47e1e92013-02-16 22:55:55331
Palmer Cox3fd8c8b2014-01-15 03:32:24332impl<'a, T> ExactSize<&'a mut T> for MutItems<'a, T> {}
blake2-ppc7c369ee72013-09-01 16:20:24333
Daniel Micayb47e1e92013-02-16 22:55:55334/// Grow is only called on full elts, so nelts is also len(elts), unlike
335/// elsewhere.
blake2-ppc8a326762013-07-06 03:42:45336fn grow<T>(nelts: uint, loptr: &mut uint, elts: &mut ~[Option<T>]) {
Corey Richardsoncc57ca02013-05-19 02:02:45337 assert_eq!(nelts, elts.len());
blake2-ppc8a326762013-07-06 03:42:45338 let lo = *loptr;
339 let newlen = nelts * 2;
blake2-ppc40ce0b72013-07-06 03:42:45340 elts.reserve(newlen);
Daniel Micayb47e1e92013-02-16 22:55:55341
blake2-ppc40ce0b72013-07-06 03:42:45342 /* fill with None */
Daniel Micay100894552013-08-03 16:45:23343 for _ in range(elts.len(), elts.capacity()) {
blake2-ppc40ce0b72013-07-06 03:42:45344 elts.push(None);
Daniel Micayb47e1e92013-02-16 22:55:55345 }
blake2-ppc8a326762013-07-06 03:42:45346
347 /*
348 Move the shortest half into the newly reserved area.
349 lo ---->|
350 nelts ----------->|
351 [o o o|o o o o o]
352 A [. . .|o o o o o o o o|. . . . .]
353 B [o o o|. . . . . . . .|o o o o o]
354 */
355
356 assert!(newlen - nelts/2 >= nelts);
357 if lo <= (nelts - lo) { // A
Daniel Micay100894552013-08-03 16:45:23358 for i in range(0u, lo) {
blake2-ppc8a326762013-07-06 03:42:45359 elts.swap(i, nelts + i);
360 }
361 } else { // B
Daniel Micay100894552013-08-03 16:45:23362 for i in range(lo, nelts) {
blake2-ppc8a326762013-07-06 03:42:45363 elts.swap(i, newlen - nelts + i);
364 }
365 *loptr += newlen - nelts;
blake2-ppc40ce0b72013-07-06 03:42:45366 }
Daniel Micayb47e1e92013-02-16 22:55:55367}
368
blake2-ppc75015c32013-07-06 03:42:45369/// Return index in underlying vec for a given logical element index
370fn raw_index(lo: uint, len: uint, index: uint) -> uint {
371 if lo >= len - index {
372 lo + index - len
373 } else {
374 lo + index
375 }
376}
377
blake2-ppc70523712013-07-10 13:27:14378impl<A: Eq> Eq for RingBuf<A> {
379 fn eq(&self, other: &RingBuf<A>) -> bool {
blake2-ppc10c76982013-07-06 13:27:32380 self.nelts == other.nelts &&
381 self.iter().zip(other.iter()).all(|(a, b)| a.eq(b))
382 }
blake2-ppc70523712013-07-10 13:27:14383 fn ne(&self, other: &RingBuf<A>) -> bool {
blake2-ppc10c76982013-07-06 13:27:32384 !self.eq(other)
385 }
386}
387
Huon Wilson53487a02013-08-13 13:08:14388impl<A> FromIterator<A> for RingBuf<A> {
389 fn from_iterator<T: Iterator<A>>(iterator: &mut T) -> RingBuf<A> {
blake2-ppcf8ae5262013-07-30 00:06:49390 let (lower, _) = iterator.size_hint();
391 let mut deq = RingBuf::with_capacity(lower);
392 deq.extend(iterator);
blake2-ppc08dc72f2013-07-06 03:42:45393 deq
394 }
395}
396
Huon Wilson53487a02013-08-13 13:08:14397impl<A> Extendable<A> for RingBuf<A> {
398 fn extend<T: Iterator<A>>(&mut self, iterator: &mut T) {
Daniel Micay100894552013-08-03 16:45:23399 for elt in *iterator {
blake2-ppcf8ae5262013-07-30 00:06:49400 self.push_back(elt);
401 }
402 }
403}
404
Brian Anderson6e27b272012-01-18 03:05:07405#[cfg(test)]
406mod tests {
Liigo Zhuang53b9d1a2014-02-14 01:49:11407 extern crate test;
408 use self::test::BenchHarness;
HeroesGraved81bb442014-02-03 05:56:49409 use deque::Deque;
Patrick Walton99b33f72013-07-02 19:47:32410 use std::clone::Clone;
Corey Richardson1662bd32013-06-28 22:32:26411 use std::cmp::Eq;
Alex Crichton02882fb2014-02-28 09:23:06412 use std::fmt::Show;
Alex Crichtonf47e4b22014-01-07 06:33:50413 use super::RingBuf;
Patrick Waltonfa5ee932012-12-28 02:24:18414
Brian Anderson6e27b272012-01-18 03:05:07415 #[test]
416 fn test_simple() {
blake2-ppc70523712013-07-10 13:27:14417 let mut d = RingBuf::new();
Corey Richardsoncc57ca02013-05-19 02:02:45418 assert_eq!(d.len(), 0u);
blake2-ppc70523712013-07-10 13:27:14419 d.push_front(17);
420 d.push_front(42);
421 d.push_back(137);
Corey Richardsoncc57ca02013-05-19 02:02:45422 assert_eq!(d.len(), 3u);
blake2-ppc70523712013-07-10 13:27:14423 d.push_back(137);
Corey Richardsoncc57ca02013-05-19 02:02:45424 assert_eq!(d.len(), 4u);
Alex Crichtondaf5f5a2013-10-21 20:08:31425 debug!("{:?}", d.front());
blake2-ppc70523712013-07-10 13:27:14426 assert_eq!(*d.front().unwrap(), 42);
Alex Crichtondaf5f5a2013-10-21 20:08:31427 debug!("{:?}", d.back());
blake2-ppc70523712013-07-10 13:27:14428 assert_eq!(*d.back().unwrap(), 137);
429 let mut i = d.pop_front();
Alex Crichtondaf5f5a2013-10-21 20:08:31430 debug!("{:?}", i);
blake2-ppc70523712013-07-10 13:27:14431 assert_eq!(i, Some(42));
Brian Anderson6e27b272012-01-18 03:05:07432 i = d.pop_back();
Alex Crichtondaf5f5a2013-10-21 20:08:31433 debug!("{:?}", i);
blake2-ppc70523712013-07-10 13:27:14434 assert_eq!(i, Some(137));
Brian Anderson6e27b272012-01-18 03:05:07435 i = d.pop_back();
Alex Crichtondaf5f5a2013-10-21 20:08:31436 debug!("{:?}", i);
blake2-ppc70523712013-07-10 13:27:14437 assert_eq!(i, Some(137));
Brian Anderson6e27b272012-01-18 03:05:07438 i = d.pop_back();
Alex Crichtondaf5f5a2013-10-21 20:08:31439 debug!("{:?}", i);
blake2-ppc70523712013-07-10 13:27:14440 assert_eq!(i, Some(17));
Corey Richardsoncc57ca02013-05-19 02:02:45441 assert_eq!(d.len(), 0u);
blake2-ppc70523712013-07-10 13:27:14442 d.push_back(3);
Corey Richardsoncc57ca02013-05-19 02:02:45443 assert_eq!(d.len(), 1u);
blake2-ppc70523712013-07-10 13:27:14444 d.push_front(2);
Corey Richardsoncc57ca02013-05-19 02:02:45445 assert_eq!(d.len(), 2u);
blake2-ppc70523712013-07-10 13:27:14446 d.push_back(4);
Corey Richardsoncc57ca02013-05-19 02:02:45447 assert_eq!(d.len(), 3u);
blake2-ppc70523712013-07-10 13:27:14448 d.push_front(1);
Corey Richardsoncc57ca02013-05-19 02:02:45449 assert_eq!(d.len(), 4u);
Alex Crichtondaf5f5a2013-10-21 20:08:31450 debug!("{:?}", d.get(0));
451 debug!("{:?}", d.get(1));
452 debug!("{:?}", d.get(2));
453 debug!("{:?}", d.get(3));
Corey Richardsoncc57ca02013-05-19 02:02:45454 assert_eq!(*d.get(0), 1);
455 assert_eq!(*d.get(1), 2);
456 assert_eq!(*d.get(2), 3);
457 assert_eq!(*d.get(3), 4);
Brian Anderson6e27b272012-01-18 03:05:07458 }
459
Kevin Cantuc43426e2012-09-13 05:09:55460 #[test]
461 fn test_boxes() {
462 let a: @int = @5;
463 let b: @int = @72;
464 let c: @int = @64;
465 let d: @int = @175;
466
blake2-ppc70523712013-07-10 13:27:14467 let mut deq = RingBuf::new();
Corey Richardsoncc57ca02013-05-19 02:02:45468 assert_eq!(deq.len(), 0);
blake2-ppc70523712013-07-10 13:27:14469 deq.push_front(a);
470 deq.push_front(b);
471 deq.push_back(c);
Corey Richardsoncc57ca02013-05-19 02:02:45472 assert_eq!(deq.len(), 3);
blake2-ppc70523712013-07-10 13:27:14473 deq.push_back(d);
Corey Richardsoncc57ca02013-05-19 02:02:45474 assert_eq!(deq.len(), 4);
blake2-ppc70523712013-07-10 13:27:14475 assert_eq!(deq.front(), Some(&b));
476 assert_eq!(deq.back(), Some(&d));
477 assert_eq!(deq.pop_front(), Some(b));
478 assert_eq!(deq.pop_back(), Some(d));
479 assert_eq!(deq.pop_back(), Some(c));
480 assert_eq!(deq.pop_back(), Some(a));
Corey Richardsoncc57ca02013-05-19 02:02:45481 assert_eq!(deq.len(), 0);
blake2-ppc70523712013-07-10 13:27:14482 deq.push_back(c);
Corey Richardsoncc57ca02013-05-19 02:02:45483 assert_eq!(deq.len(), 1);
blake2-ppc70523712013-07-10 13:27:14484 deq.push_front(b);
Corey Richardsoncc57ca02013-05-19 02:02:45485 assert_eq!(deq.len(), 2);
blake2-ppc70523712013-07-10 13:27:14486 deq.push_back(d);
Corey Richardsoncc57ca02013-05-19 02:02:45487 assert_eq!(deq.len(), 3);
blake2-ppc70523712013-07-10 13:27:14488 deq.push_front(a);
Corey Richardsoncc57ca02013-05-19 02:02:45489 assert_eq!(deq.len(), 4);
490 assert_eq!(*deq.get(0), a);
491 assert_eq!(*deq.get(1), b);
492 assert_eq!(*deq.get(2), c);
493 assert_eq!(*deq.get(3), d);
Daniel Micay373c0722013-02-17 00:10:10494 }
495
Felix S. Klock IIa636f512013-05-01 23:32:37496 #[cfg(test)]
Alex Crichton02882fb2014-02-28 09:23:06497 fn test_parameterized<T:Clone + Eq + Show>(a: T, b: T, c: T, d: T) {
Patrick Waltondc4bf172013-07-13 04:05:59498 let mut deq = RingBuf::new();
Corey Richardsoncc57ca02013-05-19 02:02:45499 assert_eq!(deq.len(), 0);
Patrick Waltondc4bf172013-07-13 04:05:59500 deq.push_front(a.clone());
501 deq.push_front(b.clone());
502 deq.push_back(c.clone());
Corey Richardsoncc57ca02013-05-19 02:02:45503 assert_eq!(deq.len(), 3);
Patrick Waltondc4bf172013-07-13 04:05:59504 deq.push_back(d.clone());
Corey Richardsoncc57ca02013-05-19 02:02:45505 assert_eq!(deq.len(), 4);
Marvin Löbel0ac7a212013-08-03 23:59:24506 assert_eq!((*deq.front().unwrap()).clone(), b.clone());
507 assert_eq!((*deq.back().unwrap()).clone(), d.clone());
508 assert_eq!(deq.pop_front().unwrap(), b.clone());
509 assert_eq!(deq.pop_back().unwrap(), d.clone());
510 assert_eq!(deq.pop_back().unwrap(), c.clone());
511 assert_eq!(deq.pop_back().unwrap(), a.clone());
Corey Richardsoncc57ca02013-05-19 02:02:45512 assert_eq!(deq.len(), 0);
Patrick Waltondc4bf172013-07-13 04:05:59513 deq.push_back(c.clone());
Corey Richardsoncc57ca02013-05-19 02:02:45514 assert_eq!(deq.len(), 1);
Patrick Waltondc4bf172013-07-13 04:05:59515 deq.push_front(b.clone());
Corey Richardsoncc57ca02013-05-19 02:02:45516 assert_eq!(deq.len(), 2);
Patrick Waltondc4bf172013-07-13 04:05:59517 deq.push_back(d.clone());
Corey Richardsoncc57ca02013-05-19 02:02:45518 assert_eq!(deq.len(), 3);
Patrick Waltondc4bf172013-07-13 04:05:59519 deq.push_front(a.clone());
Corey Richardsoncc57ca02013-05-19 02:02:45520 assert_eq!(deq.len(), 4);
Patrick Walton99b33f72013-07-02 19:47:32521 assert_eq!((*deq.get(0)).clone(), a.clone());
522 assert_eq!((*deq.get(1)).clone(), b.clone());
523 assert_eq!((*deq.get(2)).clone(), c.clone());
524 assert_eq!((*deq.get(3)).clone(), d.clone());
Brian Anderson6e27b272012-01-18 03:05:07525 }
526
blake2-ppc81933ed2013-07-06 03:42:45527 #[test]
blake2-ppc70523712013-07-10 13:27:14528 fn test_push_front_grow() {
529 let mut deq = RingBuf::new();
Daniel Micay100894552013-08-03 16:45:23530 for i in range(0u, 66) {
blake2-ppc70523712013-07-10 13:27:14531 deq.push_front(i);
blake2-ppc81933ed2013-07-06 03:42:45532 }
533 assert_eq!(deq.len(), 66);
534
Daniel Micay100894552013-08-03 16:45:23535 for i in range(0u, 66) {
blake2-ppc81933ed2013-07-06 03:42:45536 assert_eq!(*deq.get(i), 65 - i);
537 }
538
blake2-ppc70523712013-07-10 13:27:14539 let mut deq = RingBuf::new();
Daniel Micay100894552013-08-03 16:45:23540 for i in range(0u, 66) {
blake2-ppc70523712013-07-10 13:27:14541 deq.push_back(i);
blake2-ppc81933ed2013-07-06 03:42:45542 }
543
Daniel Micay100894552013-08-03 16:45:23544 for i in range(0u, 66) {
blake2-ppc81933ed2013-07-06 03:42:45545 assert_eq!(*deq.get(i), i);
546 }
547 }
548
549 #[bench]
550 fn bench_new(b: &mut test::BenchHarness) {
Patrick Walton38efa172013-11-22 03:20:48551 b.iter(|| {
Patrick Walton86939432013-08-08 18:38:10552 let _: RingBuf<u64> = RingBuf::new();
Patrick Walton38efa172013-11-22 03:20:48553 })
blake2-ppc81933ed2013-07-06 03:42:45554 }
555
556 #[bench]
blake2-ppc70523712013-07-10 13:27:14557 fn bench_push_back(b: &mut test::BenchHarness) {
558 let mut deq = RingBuf::new();
Patrick Walton38efa172013-11-22 03:20:48559 b.iter(|| {
blake2-ppc70523712013-07-10 13:27:14560 deq.push_back(0);
Patrick Walton38efa172013-11-22 03:20:48561 })
blake2-ppc81933ed2013-07-06 03:42:45562 }
563
564 #[bench]
blake2-ppc70523712013-07-10 13:27:14565 fn bench_push_front(b: &mut test::BenchHarness) {
566 let mut deq = RingBuf::new();
Patrick Walton38efa172013-11-22 03:20:48567 b.iter(|| {
blake2-ppc70523712013-07-10 13:27:14568 deq.push_front(0);
Patrick Walton38efa172013-11-22 03:20:48569 })
blake2-ppc81933ed2013-07-06 03:42:45570 }
571
572 #[bench]
573 fn bench_grow(b: &mut test::BenchHarness) {
blake2-ppc70523712013-07-10 13:27:14574 let mut deq = RingBuf::new();
Patrick Walton38efa172013-11-22 03:20:48575 b.iter(|| {
Brendan Zabarauskas729060d2014-01-30 00:20:34576 for _ in range(0, 65) {
blake2-ppc70523712013-07-10 13:27:14577 deq.push_front(1);
Brendan Zabarauskas729060d2014-01-30 00:20:34578 }
Patrick Walton38efa172013-11-22 03:20:48579 })
blake2-ppc81933ed2013-07-06 03:42:45580 }
581
Alex Crichton02882fb2014-02-28 09:23:06582 #[deriving(Clone, Eq, Show)]
Patrick Walton99b33f72013-07-02 19:47:32583 enum Taggy {
584 One(int),
585 Two(int, int),
586 Three(int, int, int),
Brian Anderson6e27b272012-01-18 03:05:07587 }
588
Alex Crichton02882fb2014-02-28 09:23:06589 #[deriving(Clone, Eq, Show)]
Patrick Walton99b33f72013-07-02 19:47:32590 enum Taggypar<T> {
591 Onepar(int),
592 Twopar(int, int),
593 Threepar(int, int, int),
594 }
595
Alex Crichton02882fb2014-02-28 09:23:06596 #[deriving(Clone, Eq, Show)]
Erick Tryzelaare84576b2013-01-22 16:44:24597 struct RecCy {
598 x: int,
599 y: int,
Patrick Waltoneb4d39e2013-01-26 00:57:39600 t: Taggy
Patrick Walton9117dcb2012-09-20 01:00:26601 }
Kevin Cantuc43426e2012-09-13 05:09:55602
603 #[test]
604 fn test_param_int() {
605 test_parameterized::<int>(5, 72, 64, 175);
606 }
607
608 #[test]
609 fn test_param_at_int() {
610 test_parameterized::<@int>(@5, @72, @64, @175);
611 }
612
613 #[test]
614 fn test_param_taggy() {
Corey Richardsonf8ae9b02013-06-26 22:14:35615 test_parameterized::<Taggy>(One(1), Two(1, 2), Three(1, 2, 3), Two(17, 42));
Kevin Cantuc43426e2012-09-13 05:09:55616 }
617
618 #[test]
619 fn test_param_taggypar() {
620 test_parameterized::<Taggypar<int>>(Onepar::<int>(1),
Ben Striegela605fd02012-08-11 14:08:42621 Twopar::<int>(1, 2),
622 Threepar::<int>(1, 2, 3),
623 Twopar::<int>(17, 42));
Kevin Cantuc43426e2012-09-13 05:09:55624 }
Brian Anderson6e27b272012-01-18 03:05:07625
Kevin Cantuc43426e2012-09-13 05:09:55626 #[test]
627 fn test_param_reccy() {
Erick Tryzelaare84576b2013-01-22 16:44:24628 let reccy1 = RecCy { x: 1, y: 2, t: One(1) };
629 let reccy2 = RecCy { x: 345, y: 2, t: Two(1, 2) };
630 let reccy3 = RecCy { x: 1, y: 777, t: Three(1, 2, 3) };
631 let reccy4 = RecCy { x: 19, y: 252, t: Two(17, 42) };
Kevin Cantuc43426e2012-09-13 05:09:55632 test_parameterized::<RecCy>(reccy1, reccy2, reccy3, reccy4);
Brian Anderson6e27b272012-01-18 03:05:07633 }
Erick Tryzelaar909d8f02013-03-30 01:02:44634
635 #[test]
blake2-ppc0ff5c172013-07-06 03:42:45636 fn test_with_capacity() {
blake2-ppc70523712013-07-10 13:27:14637 let mut d = RingBuf::with_capacity(0);
638 d.push_back(1);
blake2-ppc0ff5c172013-07-06 03:42:45639 assert_eq!(d.len(), 1);
blake2-ppc70523712013-07-10 13:27:14640 let mut d = RingBuf::with_capacity(50);
641 d.push_back(1);
blake2-ppc0ff5c172013-07-06 03:42:45642 assert_eq!(d.len(), 1);
643 }
644
645 #[test]
David Manescu65f35782014-01-31 13:03:20646 fn test_reserve_exact() {
blake2-ppc70523712013-07-10 13:27:14647 let mut d = RingBuf::new();
648 d.push_back(0u64);
David Manescu65f35782014-01-31 13:03:20649 d.reserve_exact(50);
Huon Wilson32d65592013-06-27 14:40:47650 assert_eq!(d.elts.capacity(), 50);
blake2-ppc70523712013-07-10 13:27:14651 let mut d = RingBuf::new();
652 d.push_back(0u32);
David Manescu65f35782014-01-31 13:03:20653 d.reserve_exact(50);
Huon Wilson32d65592013-06-27 14:40:47654 assert_eq!(d.elts.capacity(), 50);
Tim Chevalier77de84b2013-05-27 18:47:38655 }
656
657 #[test]
David Manescu65f35782014-01-31 13:03:20658 fn test_reserve() {
blake2-ppc70523712013-07-10 13:27:14659 let mut d = RingBuf::new();
660 d.push_back(0u64);
David Manescu65f35782014-01-31 13:03:20661 d.reserve(50);
Huon Wilson32d65592013-06-27 14:40:47662 assert_eq!(d.elts.capacity(), 64);
blake2-ppc70523712013-07-10 13:27:14663 let mut d = RingBuf::new();
664 d.push_back(0u32);
David Manescu65f35782014-01-31 13:03:20665 d.reserve(50);
Huon Wilson32d65592013-06-27 14:40:47666 assert_eq!(d.elts.capacity(), 64);
Tim Chevalier77de84b2013-05-27 18:47:38667 }
668
Jed Estep096fb792013-06-26 14:04:44669 #[test]
blake2-ppc57757a82013-09-26 07:19:26670 fn test_swap() {
671 let mut d: RingBuf<int> = range(0, 5).collect();
672 d.pop_front();
673 d.swap(0, 3);
674 assert_eq!(d.iter().map(|&x|x).collect::<~[int]>(), ~[4, 2, 3, 1]);
675 }
676
677 #[test]
Jed Estep096fb792013-06-26 14:04:44678 fn test_iter() {
blake2-ppc70523712013-07-10 13:27:14679 let mut d = RingBuf::new();
blake2-ppcf88d5322013-07-06 03:42:45680 assert_eq!(d.iter().next(), None);
blake2-ppc9ccf4432013-07-14 20:30:22681 assert_eq!(d.iter().size_hint(), (0, Some(0)));
blake2-ppcf88d5322013-07-06 03:42:45682
Daniel Micay100894552013-08-03 16:45:23683 for i in range(0, 5) {
blake2-ppc70523712013-07-10 13:27:14684 d.push_back(i);
Jed Estep096fb792013-06-26 14:04:44685 }
Corey Richardsonf8ae9b02013-06-26 22:14:35686 assert_eq!(d.iter().collect::<~[&int]>(), ~[&0,&1,&2,&3,&4]);
687
Daniel Micay100894552013-08-03 16:45:23688 for i in range(6, 9) {
blake2-ppc70523712013-07-10 13:27:14689 d.push_front(i);
Jed Estep096fb792013-06-26 14:04:44690 }
Corey Richardsonf8ae9b02013-06-26 22:14:35691 assert_eq!(d.iter().collect::<~[&int]>(), ~[&8,&7,&6,&0,&1,&2,&3,&4]);
blake2-ppc9ccf4432013-07-14 20:30:22692
693 let mut it = d.iter();
694 let mut len = d.len();
695 loop {
696 match it.next() {
697 None => break,
698 _ => { len -= 1; assert_eq!(it.size_hint(), (len, Some(len))) }
699 }
700 }
Jed Estep096fb792013-06-26 14:04:44701 }
702
703 #[test]
704 fn test_rev_iter() {
blake2-ppc70523712013-07-10 13:27:14705 let mut d = RingBuf::new();
blake2-ppcf88d5322013-07-06 03:42:45706 assert_eq!(d.rev_iter().next(), None);
707
Daniel Micay100894552013-08-03 16:45:23708 for i in range(0, 5) {
blake2-ppc70523712013-07-10 13:27:14709 d.push_back(i);
Jed Estep096fb792013-06-26 14:04:44710 }
Corey Richardsonf8ae9b02013-06-26 22:14:35711 assert_eq!(d.rev_iter().collect::<~[&int]>(), ~[&4,&3,&2,&1,&0]);
712
Daniel Micay100894552013-08-03 16:45:23713 for i in range(6, 9) {
blake2-ppc70523712013-07-10 13:27:14714 d.push_front(i);
Jed Estep096fb792013-06-26 14:04:44715 }
Corey Richardsonf8ae9b02013-06-26 22:14:35716 assert_eq!(d.rev_iter().collect::<~[&int]>(), ~[&4,&3,&2,&1,&0,&6,&7,&8]);
Jed Estep096fb792013-06-26 14:04:44717 }
blake2-ppc08dc72f2013-07-06 03:42:45718
719 #[test]
Niko Matsakisbc4164d2013-11-16 22:29:39720 fn test_mut_rev_iter_wrap() {
721 let mut d = RingBuf::with_capacity(3);
722 assert!(d.mut_rev_iter().next().is_none());
723
724 d.push_back(1);
725 d.push_back(2);
726 d.push_back(3);
727 assert_eq!(d.pop_front(), Some(1));
728 d.push_back(4);
729
730 assert_eq!(d.mut_rev_iter().map(|x| *x).collect::<~[int]>(),
731 ~[4, 3, 2]);
732 }
733
734 #[test]
blake2-ppcf88d5322013-07-06 03:42:45735 fn test_mut_iter() {
blake2-ppc70523712013-07-10 13:27:14736 let mut d = RingBuf::new();
blake2-ppcf88d5322013-07-06 03:42:45737 assert!(d.mut_iter().next().is_none());
738
Daniel Micay100894552013-08-03 16:45:23739 for i in range(0u, 3) {
blake2-ppc70523712013-07-10 13:27:14740 d.push_front(i);
blake2-ppcf88d5322013-07-06 03:42:45741 }
742
Daniel Micay100894552013-08-03 16:45:23743 for (i, elt) in d.mut_iter().enumerate() {
blake2-ppcf88d5322013-07-06 03:42:45744 assert_eq!(*elt, 2 - i);
745 *elt = i;
746 }
747
748 {
749 let mut it = d.mut_iter();
750 assert_eq!(*it.next().unwrap(), 0);
751 assert_eq!(*it.next().unwrap(), 1);
752 assert_eq!(*it.next().unwrap(), 2);
753 assert!(it.next().is_none());
754 }
755 }
756
757 #[test]
758 fn test_mut_rev_iter() {
blake2-ppc70523712013-07-10 13:27:14759 let mut d = RingBuf::new();
blake2-ppcf88d5322013-07-06 03:42:45760 assert!(d.mut_rev_iter().next().is_none());
761
Daniel Micay100894552013-08-03 16:45:23762 for i in range(0u, 3) {
blake2-ppc70523712013-07-10 13:27:14763 d.push_front(i);
blake2-ppcf88d5322013-07-06 03:42:45764 }
765
Daniel Micay100894552013-08-03 16:45:23766 for (i, elt) in d.mut_rev_iter().enumerate() {
blake2-ppcf88d5322013-07-06 03:42:45767 assert_eq!(*elt, i);
768 *elt = i;
769 }
770
771 {
772 let mut it = d.mut_rev_iter();
773 assert_eq!(*it.next().unwrap(), 0);
774 assert_eq!(*it.next().unwrap(), 1);
775 assert_eq!(*it.next().unwrap(), 2);
776 assert!(it.next().is_none());
777 }
778 }
779
780 #[test]
blake2-ppc08dc72f2013-07-06 03:42:45781 fn test_from_iterator() {
Daniel Micay6919cf52013-09-08 15:01:16782 use std::iter;
blake2-ppc08dc72f2013-07-06 03:42:45783 let v = ~[1,2,3,4,5,6,7];
Erick Tryzelaar68f40d22013-08-10 03:09:47784 let deq: RingBuf<int> = v.iter().map(|&x| x).collect();
785 let u: ~[int] = deq.iter().map(|&x| x).collect();
blake2-ppc08dc72f2013-07-06 03:42:45786 assert_eq!(u, v);
787
Daniel Micay6919cf52013-09-08 15:01:16788 let mut seq = iter::count(0u, 2).take(256);
blake2-ppc70523712013-07-10 13:27:14789 let deq: RingBuf<uint> = seq.collect();
Daniel Micay100894552013-08-03 16:45:23790 for (i, &x) in deq.iter().enumerate() {
blake2-ppc08dc72f2013-07-06 03:42:45791 assert_eq!(2*i, x);
792 }
793 assert_eq!(deq.len(), 256);
794 }
blake2-ppc10c76982013-07-06 13:27:32795
796 #[test]
797 fn test_clone() {
blake2-ppc70523712013-07-10 13:27:14798 let mut d = RingBuf::new();
799 d.push_front(17);
800 d.push_front(42);
801 d.push_back(137);
802 d.push_back(137);
blake2-ppc10c76982013-07-06 13:27:32803 assert_eq!(d.len(), 4u);
804 let mut e = d.clone();
805 assert_eq!(e.len(), 4u);
806 while !d.is_empty() {
807 assert_eq!(d.pop_back(), e.pop_back());
808 }
809 assert_eq!(d.len(), 0u);
810 assert_eq!(e.len(), 0u);
811 }
812
813 #[test]
814 fn test_eq() {
blake2-ppc70523712013-07-10 13:27:14815 let mut d = RingBuf::new();
Alex Crichton02882fb2014-02-28 09:23:06816 assert!(d == RingBuf::with_capacity(0));
blake2-ppc70523712013-07-10 13:27:14817 d.push_front(137);
818 d.push_front(17);
819 d.push_front(42);
820 d.push_back(137);
821 let mut e = RingBuf::with_capacity(0);
822 e.push_back(42);
823 e.push_back(17);
824 e.push_back(137);
825 e.push_back(137);
Alex Crichton02882fb2014-02-28 09:23:06826 assert!(&e == &d);
blake2-ppc10c76982013-07-06 13:27:32827 e.pop_back();
blake2-ppc70523712013-07-10 13:27:14828 e.push_back(0);
blake2-ppc10c76982013-07-06 13:27:32829 assert!(e != d);
830 e.clear();
Alex Crichton02882fb2014-02-28 09:23:06831 assert!(e == RingBuf::new());
blake2-ppc10c76982013-07-06 13:27:32832 }
Michael Sullivanc854d6e2012-07-03 17:52:32833}