diff --git a/src/libcollections/borrow.rs b/src/libcollections/borrow.rs index 8e8fc0bedec6a..d7242b9077556 100644 --- a/src/libcollections/borrow.rs +++ b/src/libcollections/borrow.rs @@ -21,7 +21,7 @@ use core::ops::Deref; use core::option::Option; use fmt; -use alloc::{rc, arc}; +use alloc::{boxed, rc, arc}; use self::Cow::*; @@ -116,6 +116,14 @@ impl<'a, T: ?Sized> BorrowMut for &'a mut T { fn borrow_mut(&mut self) -> &mut T { &mut **self } } +impl Borrow for boxed::Box { + fn borrow(&self) -> &T { &**self } +} + +impl BorrowMut for boxed::Box { + fn borrow_mut(&mut self) -> &mut T { &mut **self } +} + impl Borrow for rc::Rc { fn borrow(&self) -> &T { &**self } } diff --git a/src/libcollectionstest/btree/map.rs b/src/libcollectionstest/btree/map.rs index e617e194d300a..62b46433da957 100644 --- a/src/libcollectionstest/btree/map.rs +++ b/src/libcollectionstest/btree/map.rs @@ -12,6 +12,7 @@ use std::collections::BTreeMap; use std::collections::Bound::{Excluded, Included, Unbounded, self}; use std::collections::btree_map::Entry::{Occupied, Vacant}; use std::iter::range_inclusive; +use std::rc::Rc; #[test] fn test_basic_large() { @@ -198,6 +199,34 @@ fn test_range() { } } +#[test] +fn test_borrow() { + // make sure these compile -- using the Borrow trait + { + let mut map = BTreeMap::new(); + map.insert("0".to_string(), 1); + assert_eq!(map["0"], 1); + } + + { + let mut map = BTreeMap::new(); + map.insert(Box::new(0), 1); + assert_eq!(map[&0], 1); + } + + { + let mut map = BTreeMap::new(); + map.insert(Box::new([0, 1]) as Box<[i32]>, 1); + assert_eq!(map[&[0, 1][..]], 1); + } + + { + let mut map = BTreeMap::new(); + map.insert(Rc::new(0), 1); + assert_eq!(map[&0], 1); + } +} + #[test] fn test_entry(){ let xs = [(1, 10), (2, 20), (3, 30), (4, 40), (5, 50), (6, 60)];