Auto merge of #27545 - apasel422:btree-range, r=Gankro

This permits collections with `String` keys to be ranged over with
`&str` bounds. The `K` defaults for `Min` and `Max` permit the default
type parameter fallback to work with things like

```rust
use std::collections::{BTreeSet, Bound};
let set = BTreeSet::<String>::new();
set.range(Bound::Included("a"), Bound::Unbounded);
```

Without the defaults, the type of the maximum bound would be
unconstrained.

r? @Gankro
This commit is contained in:
bors 2015-08-06 03:40:42 +00:00
commit 4278b5f03b
3 changed files with 22 additions and 6 deletions

View File

@ -1522,7 +1522,11 @@ impl<K: Ord, V> BTreeMap<K, V> {
/// ``` /// ```
#[unstable(feature = "btree_range", #[unstable(feature = "btree_range",
reason = "matches collection reform specification, waiting for dust to settle")] reason = "matches collection reform specification, waiting for dust to settle")]
pub fn range<'a>(&'a self, min: Bound<&K>, max: Bound<&K>) -> Range<'a, K, V> { pub fn range<Min: ?Sized + Ord = K, Max: ?Sized + Ord = K>(&self, min: Bound<&Min>,
max: Bound<&Max>)
-> Range<K, V> where
K: Borrow<Min> + Borrow<Max>,
{
range_impl!(&self.root, min, max, as_slices_internal, iter, Range, edges, []) range_impl!(&self.root, min, max, as_slices_internal, iter, Range, edges, [])
} }
@ -1542,7 +1546,7 @@ impl<K: Ord, V> BTreeMap<K, V> {
/// let mut map: BTreeMap<&str, i32> = ["Alice", "Bob", "Carol", "Cheryl"].iter() /// let mut map: BTreeMap<&str, i32> = ["Alice", "Bob", "Carol", "Cheryl"].iter()
/// .map(|&s| (s, 0)) /// .map(|&s| (s, 0))
/// .collect(); /// .collect();
/// for (_, balance) in map.range_mut(Included(&"B"), Excluded(&"Cheryl")) { /// for (_, balance) in map.range_mut(Included("B"), Excluded("Cheryl")) {
/// *balance += 100; /// *balance += 100;
/// } /// }
/// for (name, balance) in &map { /// for (name, balance) in &map {
@ -1551,7 +1555,11 @@ impl<K: Ord, V> BTreeMap<K, V> {
/// ``` /// ```
#[unstable(feature = "btree_range", #[unstable(feature = "btree_range",
reason = "matches collection reform specification, waiting for dust to settle")] reason = "matches collection reform specification, waiting for dust to settle")]
pub fn range_mut<'a>(&'a mut self, min: Bound<&K>, max: Bound<&K>) -> RangeMut<'a, K, V> { pub fn range_mut<Min: ?Sized + Ord = K, Max: ?Sized + Ord = K>(&mut self, min: Bound<&Min>,
max: Bound<&Max>)
-> RangeMut<K, V> where
K: Borrow<Min> + Borrow<Max>,
{
range_impl!(&mut self.root, min, max, as_slices_internal_mut, iter_mut, RangeMut, range_impl!(&mut self.root, min, max, as_slices_internal_mut, iter_mut, RangeMut,
edges_mut, [mut]) edges_mut, [mut])
} }

View File

@ -1528,7 +1528,9 @@ macro_rules! node_slice_impl {
} }
/// Returns a sub-slice with elements starting with `min_key`. /// Returns a sub-slice with elements starting with `min_key`.
pub fn slice_from(self, min_key: &K) -> $NodeSlice<'a, K, V> { pub fn slice_from<Q: ?Sized + Ord>(self, min_key: &Q) -> $NodeSlice<'a, K, V> where
K: Borrow<Q>,
{
// _______________ // _______________
// |_1_|_3_|_5_|_7_| // |_1_|_3_|_5_|_7_|
// | | | | | // | | | | |
@ -1556,7 +1558,9 @@ macro_rules! node_slice_impl {
} }
/// Returns a sub-slice with elements up to and including `max_key`. /// Returns a sub-slice with elements up to and including `max_key`.
pub fn slice_to(self, max_key: &K) -> $NodeSlice<'a, K, V> { pub fn slice_to<Q: ?Sized + Ord>(self, max_key: &Q) -> $NodeSlice<'a, K, V> where
K: Borrow<Q>,
{
// _______________ // _______________
// |_1_|_3_|_5_|_7_| // |_1_|_3_|_5_|_7_|
// | | | | | // | | | | |

View File

@ -158,7 +158,11 @@ impl<T: Ord> BTreeSet<T> {
/// ``` /// ```
#[unstable(feature = "btree_range", #[unstable(feature = "btree_range",
reason = "matches collection reform specification, waiting for dust to settle")] reason = "matches collection reform specification, waiting for dust to settle")]
pub fn range<'a>(&'a self, min: Bound<&T>, max: Bound<&T>) -> Range<'a, T> { pub fn range<'a, Min: ?Sized + Ord = T, Max: ?Sized + Ord = T>(&'a self, min: Bound<&Min>,
max: Bound<&Max>)
-> Range<'a, T> where
T: Borrow<Min> + Borrow<Max>,
{
fn first<A, B>((a, _): (A, B)) -> A { a } fn first<A, B>((a, _): (A, B)) -> A { a }
let first: fn((&'a T, &'a ())) -> &'a T = first; // coerce to fn pointer let first: fn((&'a T, &'a ())) -> &'a T = first; // coerce to fn pointer