Skip to content

Commit 298016b

Browse files
committed
Allow Borrow indirection in BTree{Map,Set}::extract_if, like range
1 parent c018ae5 commit 298016b

File tree

4 files changed

+15
-12
lines changed

4 files changed

+15
-12
lines changed

library/alloc/src/collections/btree/map.rs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1437,20 +1437,22 @@ impl<K, V, A: Allocator + Clone> BTreeMap<K, V, A> {
14371437
/// assert_eq!(high.keys().copied().collect::<Vec<_>>(), [4, 5, 6, 7]);
14381438
/// ```
14391439
#[unstable(feature = "btree_extract_if", issue = "70530")]
1440-
pub fn extract_if<F, R>(&mut self, range: R, pred: F) -> ExtractIf<'_, K, V, R, F, A>
1440+
pub fn extract_if<F, R, Q>(&mut self, range: R, pred: F) -> ExtractIf<'_, K, V, R, F, A>
14411441
where
1442-
K: Ord,
1443-
R: RangeBounds<K>,
1442+
K: Borrow<Q>,
1443+
Q: Ord,
1444+
R: RangeBounds<Q>,
14441445
F: FnMut(&K, &mut V) -> bool,
14451446
{
14461447
let (inner, alloc) = self.extract_if_inner(range);
14471448
ExtractIf { pred, inner, alloc }
14481449
}
14491450

1450-
pub(super) fn extract_if_inner<R>(&mut self, range: R) -> (ExtractIfInner<'_, K, V, R>, A)
1451+
pub(super) fn extract_if_inner<R, Q>(&mut self, range: R) -> (ExtractIfInner<'_, K, V, R>, A)
14511452
where
1452-
K: Ord,
1453-
R: RangeBounds<K>,
1453+
K: Borrow<Q>,
1454+
Q: Ord,
1455+
R: RangeBounds<Q>,
14541456
{
14551457
if let Some(root) = self.root.as_mut() {
14561458
let (root, dormant_root) = DormantMutRef::new(root);

library/alloc/src/collections/btree/set.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1220,10 +1220,11 @@ impl<T, A: Allocator + Clone> BTreeSet<T, A> {
12201220
/// assert_eq!(high.into_iter().collect::<Vec<_>>(), [4, 5, 6, 7]);
12211221
/// ```
12221222
#[unstable(feature = "btree_extract_if", issue = "70530")]
1223-
pub fn extract_if<F, R>(&mut self, range: R, pred: F) -> ExtractIf<'_, T, R, F, A>
1223+
pub fn extract_if<F, R, Q>(&mut self, range: R, pred: F) -> ExtractIf<'_, T, R, F, A>
12241224
where
1225-
T: Ord,
1226-
R: RangeBounds<T>,
1225+
T: Borrow<Q>,
1226+
Q: Ord,
1227+
R: RangeBounds<Q>,
12271228
F: FnMut(&T) -> bool,
12281229
{
12291230
let (inner, alloc) = self.map.extract_if_inner(range);

src/tools/miri/tests/pass/btreemap.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ pub fn main() {
5050
test_all_refs(&mut 13, b.values_mut());
5151

5252
// Test forgetting the extractor.
53-
let mut d = b.extract_if(.., |_, i| *i < 30);
53+
let mut d = b.extract_if::<_, std::ops::RangeFull, String>(.., |_, i| *i < 30);
5454
d.next().unwrap();
5555
mem::forget(d);
5656
}

tests/ui/closures/2229_closure_analysis/run_pass/lit-pattern-matching-with-methods.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,14 @@ fn main() {
1414
map.insert("c", ());
1515

1616
{
17-
let mut it = map.extract_if(.., |_, _| true);
17+
let mut it = map.extract_if::<_, std::ops::RangeFull, &str>(.., |_, _| true);
1818
catch_unwind(AssertUnwindSafe(|| while it.next().is_some() {})).unwrap_err();
1919
let result = catch_unwind(AssertUnwindSafe(|| it.next()));
2020
assert!(matches!(result, Ok(None)));
2121
}
2222

2323
{
24-
let mut it = map.extract_if(.., |_, _| true);
24+
let mut it = map.extract_if::<_, std::ops::RangeFull, &str>(.., |_, _| true);
2525
catch_unwind(AssertUnwindSafe(|| while let Some(_) = it.next() {})).unwrap_err();
2626
let result = catch_unwind(AssertUnwindSafe(|| it.next()));
2727
assert!(matches!(result, Ok(None)));

0 commit comments

Comments
 (0)