diff options
| author | HeroesGrave <heroesgrave@gmail.com> | 2014-02-03 18:56:49 +1300 |
|---|---|---|
| committer | HeroesGrave <heroesgrave@gmail.com> | 2014-02-07 19:49:26 +1300 |
| commit | d81bb441dae3bdb6760dcb0dc0fca2aceb561d24 (patch) | |
| tree | b719e6659bde57f21389527ca7f1531683b0245d /src/libcollections/deque.rs | |
| parent | 87fe3ccf09fa16d662427ffdd7a846d72551a27f (diff) | |
| download | rust-d81bb441dae3bdb6760dcb0dc0fca2aceb561d24.tar.gz rust-d81bb441dae3bdb6760dcb0dc0fca2aceb561d24.zip | |
moved collections from libextra into libcollections
Diffstat (limited to 'src/libcollections/deque.rs')
| -rw-r--r-- | src/libcollections/deque.rs | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/src/libcollections/deque.rs b/src/libcollections/deque.rs new file mode 100644 index 00000000000..325f0ee4edb --- /dev/null +++ b/src/libcollections/deque.rs @@ -0,0 +1,122 @@ +// Copyright 2013 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or +// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +//! Container traits for extra + +use std::container::Mutable; + +/// A double-ended sequence that allows querying, insertion and deletion at both ends. +pub trait Deque<T> : Mutable { + /// Provide a reference to the front element, or None if the sequence is empty + fn front<'a>(&'a self) -> Option<&'a T>; + + /// Provide a mutable reference to the front element, or None if the sequence is empty + fn front_mut<'a>(&'a mut self) -> Option<&'a mut T>; + + /// Provide a reference to the back element, or None if the sequence is empty + fn back<'a>(&'a self) -> Option<&'a T>; + + /// Provide a mutable reference to the back element, or None if the sequence is empty + fn back_mut<'a>(&'a mut self) -> Option<&'a mut T>; + + /// Insert an element first in the sequence + fn push_front(&mut self, elt: T); + + /// Insert an element last in the sequence + fn push_back(&mut self, elt: T); + + /// Remove the last element and return it, or None if the sequence is empty + fn pop_back(&mut self) -> Option<T>; + + /// Remove the first element and return it, or None if the sequence is empty + fn pop_front(&mut self) -> Option<T>; +} + +#[cfg(test)] +pub mod bench { + use std::container::MutableMap; + use std::{vec, rand}; + use std::rand::Rng; + use extra::test::BenchHarness; + + pub fn insert_rand_n<M:MutableMap<uint,uint>>(n: uint, + map: &mut M, + bh: &mut BenchHarness) { + // setup + let mut rng = rand::XorShiftRng::new(); + + map.clear(); + for _ in range(0, n) { + map.insert(rng.gen::<uint>() % n, 1); + } + + // measure + bh.iter(|| { + let k = rng.gen::<uint>() % n; + map.insert(k, 1); + map.remove(&k); + }) + } + + pub fn insert_seq_n<M:MutableMap<uint,uint>>(n: uint, + map: &mut M, + bh: &mut BenchHarness) { + // setup + map.clear(); + for i in range(0u, n) { + map.insert(i*2, 1); + } + + // measure + let mut i = 1; + bh.iter(|| { + map.insert(i, 1); + map.remove(&i); + i = (i + 2) % n; + }) + } + + pub fn find_rand_n<M:MutableMap<uint,uint>>(n: uint, + map: &mut M, + bh: &mut BenchHarness) { + // setup + let mut rng = rand::XorShiftRng::new(); + let mut keys = vec::from_fn(n, |_| rng.gen::<uint>() % n); + + for k in keys.iter() { + map.insert(*k, 1); + } + + rng.shuffle_mut(keys); + + // measure + let mut i = 0; + bh.iter(|| { + map.find(&(keys[i])); + i = (i + 1) % n; + }) + } + + pub fn find_seq_n<M:MutableMap<uint,uint>>(n: uint, + map: &mut M, + bh: &mut BenchHarness) { + // setup + for i in range(0u, n) { + map.insert(i, 1); + } + + // measure + let mut i = 0; + bh.iter(|| { + map.find(&i); + i = (i + 1) % n; + }) + } +} |
