This commit fixes all of the fallout of the previous commit which is an attempt to refine privacy. There were a few unfortunate leaks which now must be plugged, and the most horrible one is the current `shouldnt_be_public` module now inside `std::rt`. I think that this either needs a slight reorganization of the runtime, or otherwise it needs to just wait for the external users of these modules to get replaced with their `rt` implementations. Other fixes involve making things pub which should be pub, and otherwise updating error messages that now reference privacy instead of referencing an "unresolved name" (yay!).
122 lines
3.7 KiB
Rust
122 lines
3.7 KiB
Rust
// 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 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
|
|
do 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;
|
|
do 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;
|
|
do 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;
|
|
do bh.iter {
|
|
map.find(&i);
|
|
i = (i + 1) % n;
|
|
}
|
|
}
|
|
}
|