Skip to content

Index all the collections #16195

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 5 commits into from
Aug 12, 2014
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 40 additions & 3 deletions src/libcollections/ringbuf.rs
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,8 @@ impl<T> RingBuf<T> {
/// # Example
///
/// ```rust
/// #![allow(deprecated)]
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can these attributes be placed only on the items where they're needed -- looks like the Index implementation? That way we don't accidentally start sneaking in other deprecated items.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh, nevermind, this is in an example. Sorry!

///
/// use std::collections::RingBuf;
///
/// let mut buf = RingBuf::new();
Expand All @@ -147,6 +149,7 @@ impl<T> RingBuf<T> {
/// buf.push(5);
/// assert_eq!(buf.get(1), &4);
/// ```
#[deprecated = "prefer using indexing, e.g., ringbuf[0]"]
pub fn get<'a>(&'a self, i: uint) -> &'a T {
let idx = self.raw_index(i);
match *self.elts.get(idx) {
Expand All @@ -169,7 +172,7 @@ impl<T> RingBuf<T> {
/// buf.push(4);
/// buf.push(5);
/// *buf.get_mut(1) = 7;
/// assert_eq!(buf.get(1), &7);
/// assert_eq!(buf[1], 7);
/// ```
pub fn get_mut<'a>(&'a mut self, i: uint) -> &'a mut T {
let idx = self.raw_index(i);
Expand All @@ -195,8 +198,8 @@ impl<T> RingBuf<T> {
/// buf.push(4);
/// buf.push(5);
/// buf.swap(0, 2);
/// assert_eq!(buf.get(0), &5);
/// assert_eq!(buf.get(2), &3);
/// assert_eq!(buf[0], 5);
/// assert_eq!(buf[2], 3);
/// ```
pub fn swap(&mut self, i: uint, j: uint) {
assert!(i < self.len());
Expand Down Expand Up @@ -467,6 +470,21 @@ impl<S: Writer, A: Hash<S>> Hash<S> for RingBuf<A> {
}
}

impl<A> Index<uint, A> for RingBuf<A> {
#[inline]
fn index<'a>(&'a self, i: &uint) -> &'a A {
self.get(*i)
}
}

// FIXME(#12825) Indexing will always try IndexMut first and that causes issues.
/*impl<A> IndexMut<uint, A> for RingBuf<A> {
#[inline]
fn index_mut<'a>(&'a mut self, index: &uint) -> &'a mut A {
self.get_mut(*index)
}
}*/

impl<A> FromIterator<A> for RingBuf<A> {
fn from_iter<T: Iterator<A>>(iterator: T) -> RingBuf<A> {
let (lower, _) = iterator.size_hint();
Expand Down Expand Up @@ -644,6 +662,25 @@ mod tests {
}
}

#[test]
fn test_index() {
let mut deq = RingBuf::new();
for i in range(1u, 4) {
deq.push_front(i);
}
assert_eq!(deq[1], 2);
}

#[test]
#[should_fail]
fn test_index_out_of_bounds() {
let mut deq = RingBuf::new();
for i in range(1u, 4) {
deq.push_front(i);
}
deq[3];
}

#[bench]
fn bench_new(b: &mut test::Bencher) {
b.iter(|| {
Expand Down
49 changes: 45 additions & 4 deletions src/libcollections/smallintmap.rs
Original file line number Diff line number Diff line change
Expand Up @@ -209,12 +209,15 @@ impl<V> SmallIntMap<V> {
/// # Example
///
/// ```
/// #![allow(deprecated)]
///
/// use std::collections::SmallIntMap;
///
/// let mut map = SmallIntMap::new();
/// map.insert(1, "a");
/// assert_eq!(map.get(&1), &"a");
/// ```
#[deprecated = "prefer using indexing, e.g., map[0]"]
pub fn get<'a>(&'a self, key: &uint) -> &'a V {
self.find(key).expect("key not present")
}
Expand Down Expand Up @@ -330,11 +333,11 @@ impl<V:Clone> SmallIntMap<V> {
///
/// // Key does not exist, will do a simple insert
/// assert!(map.update(1, vec![1i, 2], |old, new| old.append(new.as_slice())));
/// assert_eq!(map.get(&1), &vec![1i, 2]);
/// assert_eq!(map[1], vec![1i, 2]);
///
/// // Key exists, update the value
/// assert!(!map.update(1, vec![3i, 4], |old, new| old.append(new.as_slice())));
/// assert_eq!(map.get(&1), &vec![1i, 2, 3, 4]);
/// assert_eq!(map[1], vec![1i, 2, 3, 4]);
/// ```
pub fn update(&mut self, key: uint, newval: V, ff: |V, V| -> V) -> bool {
self.update_with_key(key, newval, |_k, v, v1| ff(v,v1))
Expand All @@ -354,11 +357,11 @@ impl<V:Clone> SmallIntMap<V> {
///
/// // Key does not exist, will do a simple insert
/// assert!(map.update_with_key(7, 10, |key, old, new| (old + new) % key));
/// assert_eq!(map.get(&7), &10);
/// assert_eq!(map[7], 10);
///
/// // Key exists, update the value
/// assert!(!map.update_with_key(7, 20, |key, old, new| (old + new) % key));
/// assert_eq!(map.get(&7), &2);
/// assert_eq!(map[7], 2);
/// ```
pub fn update_with_key(&mut self,
key: uint,
Expand Down Expand Up @@ -416,6 +419,21 @@ impl<V> Extendable<(uint, V)> for SmallIntMap<V> {
}
}

impl<V> Index<uint, V> for SmallIntMap<V> {
#[inline]
fn index<'a>(&'a self, i: &uint) -> &'a V {
self.get(i)
}
}

// FIXME(#12825) Indexing will always try IndexMut first and that causes issues.
/*impl<V> IndexMut<uint, V> for SmallIntMap<V> {
#[inline]
fn index_mut<'a>(&'a mut self, i: &uint) -> &'a mut V {
self.find_mut(i).expect("key not present")
}
}*/

macro_rules! iterator {
(impl $name:ident -> $elem:ty, $getter:ident) => {
impl<'a, T> Iterator<$elem> for $name<'a, T> {
Expand Down Expand Up @@ -843,6 +861,29 @@ mod test_map {
assert_eq!(map.find(&k), Some(&v));
}
}

#[test]
fn test_index() {
let mut map: SmallIntMap<int> = SmallIntMap::new();

map.insert(1, 2);
map.insert(2, 1);
map.insert(3, 4);

assert_eq!(map[3], 4);
}

#[test]
#[should_fail]
fn test_index_nonexistent() {
let mut map: SmallIntMap<int> = SmallIntMap::new();

map.insert(1, 2);
map.insert(2, 1);
map.insert(3, 4);

map[4];
}
}

#[cfg(test)]
Expand Down
36 changes: 36 additions & 0 deletions src/libcollections/treemap.rs
Original file line number Diff line number Diff line change
Expand Up @@ -237,6 +237,20 @@ impl<K: Ord, V> Default for TreeMap<K,V> {
fn default() -> TreeMap<K, V> { TreeMap::new() }
}

impl<K: Ord, V> Index<K, V> for TreeMap<K, V> {
#[inline]
fn index<'a>(&'a self, i: &K) -> &'a V {
self.find(i).expect("no entry found for key")
}
}

/*impl<K: Ord, V> IndexMut<K, V> for TreeMap<K, V> {
#[inline]
fn index_mut<'a>(&'a mut self, i: &K) -> &'a mut V {
self.find_mut(i).expect("no entry found for key")
}
}*/

impl<K: Ord, V> TreeMap<K, V> {
/// Create an empty `TreeMap`.
///
Expand Down Expand Up @@ -2131,6 +2145,28 @@ mod test_treemap {
}
}

#[test]
fn test_index() {
let mut map: TreeMap<int, int> = TreeMap::new();

map.insert(1, 2);
map.insert(2, 1);
map.insert(3, 4);

assert_eq!(map[2], 1);
}

#[test]
#[should_fail]
fn test_index_nonexistent() {
let mut map: TreeMap<int, int> = TreeMap::new();

map.insert(1, 2);
map.insert(2, 1);
map.insert(3, 4);

map[4];
}
}

#[cfg(test)]
Expand Down
38 changes: 38 additions & 0 deletions src/libcollections/trie.rs
Original file line number Diff line number Diff line change
Expand Up @@ -502,6 +502,21 @@ impl<S: Writer, T: Hash<S>> Hash<S> for TrieMap<T> {
}
}

impl<T> Index<uint, T> for TrieMap<T> {
#[inline]
fn index<'a>(&'a self, i: &uint) -> &'a T {
self.find(i).expect("key not present")
}
}

// FIXME(#12825) Indexing will always try IndexMut first and that causes issues.
/*impl<T> IndexMut<uint, T> for TrieMap<T> {
#[inline]
fn index_mut<'a>(&'a mut self, i: &uint) -> &'a mut T {
self.find_mut(i).expect("key not present")
}
}*/

/// A set implemented as a radix trie.
///
/// # Example
Expand Down Expand Up @@ -1391,6 +1406,29 @@ mod test_map {
assert!(map_str == "{1: a, 2: b}".to_string());
assert_eq!(format!("{}", empty), "{}".to_string());
}

#[test]
fn test_index() {
let mut map = TrieMap::new();

map.insert(1, 2i);
map.insert(2, 1i);
map.insert(3, 4i);

assert_eq!(map[2], 1);
}

#[test]
#[should_fail]
fn test_index_nonexistent() {
let mut map = TrieMap::new();

map.insert(1, 2i);
map.insert(2, 1i);
map.insert(3, 4i);

map[4];
}
}

#[cfg(test)]
Expand Down
12 changes: 6 additions & 6 deletions src/librustdoc/html/format.rs
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,7 @@ fn resolved_path(w: &mut fmt::Formatter, did: ast::DefId, p: &clean::Path,
if ast_util::is_local(did) || cache.inlined.contains(&did) {
Some(("../".repeat(loc.len())).to_string())
} else {
match *cache.extern_locations.get(&did.krate) {
match cache.extern_locations[did.krate] {
render::Remote(ref s) => Some(s.to_string()),
render::Local => {
Some(("../".repeat(loc.len())).to_string())
Expand Down Expand Up @@ -291,11 +291,11 @@ fn primitive_link(f: &mut fmt::Formatter,
needs_termination = true;
}
Some(&cnum) => {
let path = m.paths.get(&ast::DefId {
let path = &m.paths[ast::DefId {
krate: cnum,
node: ast::CRATE_NODE_ID,
});
let loc = match *m.extern_locations.get(&cnum) {
}];
let loc = match m.extern_locations[cnum] {
render::Remote(ref s) => Some(s.to_string()),
render::Local => {
let loc = current_location_key.get().unwrap();
Expand Down Expand Up @@ -343,11 +343,11 @@ impl fmt::Show for clean::Type {
match *self {
clean::TyParamBinder(id) => {
let m = cache_key.get().unwrap();
f.write(m.typarams.get(&ast_util::local_def(id)).as_bytes())
f.write(m.typarams[ast_util::local_def(id)].as_bytes())
}
clean::Generic(did) => {
let m = cache_key.get().unwrap();
f.write(m.typarams.get(&did).as_bytes())
f.write(m.typarams[did].as_bytes())
}
clean::ResolvedPath{ did, ref typarams, ref path } => {
try!(resolved_path(f, did, path, false));
Expand Down
4 changes: 2 additions & 2 deletions src/librustdoc/html/render.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1252,8 +1252,8 @@ impl<'a> Item<'a> {
// located, then we return `None`.
} else {
let cache = cache_key.get().unwrap();
let path = cache.external_paths.get(&self.item.def_id);
let root = match *cache.extern_locations.get(&self.item.def_id.krate) {
let path = &cache.external_paths[self.item.def_id];
let root = match cache.extern_locations[self.item.def_id.krate] {
Remote(ref s) => s.to_string(),
Local => self.cx.root_path.clone(),
Unknown => return None,
Expand Down
2 changes: 1 addition & 1 deletion src/librustdoc/visit_ast.rs
Original file line number Diff line number Diff line change
Expand Up @@ -229,7 +229,7 @@ impl<'a> RustdocVisitor<'a> {
core::Typed(ref tcx) => tcx,
core::NotTyped(_) => return false
};
let def = tcx.def_map.borrow().get(&id).def_id();
let def = (*tcx.def_map.borrow())[id].def_id();
if !ast_util::is_local(def) { return false }
let analysis = match self.analysis {
Some(analysis) => analysis, None => return false
Expand Down
Loading