diff options
| author | bors <bors@rust-lang.org> | 2020-05-14 23:22:47 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2020-05-14 23:22:47 +0000 |
| commit | 85f0da67ff31923955f7fb107fb097835bb3b6ff (patch) | |
| tree | 341c7d6dbfebd78f1864d5d5048ea3b33c44e30d /src/liballoc/collections | |
| parent | a74d1862d4d87a56244958416fd05976c58ca1a8 (diff) | |
| parent | cb2703945ca3c6c9664a5a9ec606430cb79ba2c8 (diff) | |
| download | rust-85f0da67ff31923955f7fb107fb097835bb3b6ff.tar.gz rust-85f0da67ff31923955f7fb107fb097835bb3b6ff.zip | |
Auto merge of #71321 - matthewjasper:alloc-min-spec, r=sfackler
Use min_specialization in liballoc - Remove a type parameter from `[A]RcFromIter`. - Remove an implementation of `[A]RcFromIter` that didn't actually specialize anything. - Remove unused implementation of `IsZero` for `Option<&mut T>`. - Change specializations of `[A]RcEqIdent` to use a marker trait version of `Eq`. - Remove `BTreeClone`. I couldn't find a way to make this work with `min_specialization`. - Add `rustc_unsafe_specialization_marker` to `Copy` and `TrustedLen`. After this only libcore is the only standard library crate using `feature(specialization)`. cc #31844
Diffstat (limited to 'src/liballoc/collections')
| -rw-r--r-- | src/liballoc/collections/btree/map.rs | 53 |
1 files changed, 0 insertions, 53 deletions
diff --git a/src/liballoc/collections/btree/map.rs b/src/liballoc/collections/btree/map.rs index 113df80d0c2..c6cb39b1bf5 100644 --- a/src/liballoc/collections/btree/map.rs +++ b/src/liballoc/collections/btree/map.rs @@ -215,59 +215,6 @@ impl<K: Clone, V: Clone> Clone for BTreeMap<K, V> { clone_subtree(self.root.as_ref().unwrap().as_ref()) } } - - fn clone_from(&mut self, other: &Self) { - BTreeClone::clone_from(self, other); - } -} - -trait BTreeClone { - fn clone_from(&mut self, other: &Self); -} - -impl<K: Clone, V: Clone> BTreeClone for BTreeMap<K, V> { - default fn clone_from(&mut self, other: &Self) { - *self = other.clone(); - } -} - -impl<K: Clone + Ord, V: Clone> BTreeClone for BTreeMap<K, V> { - fn clone_from(&mut self, other: &Self) { - // This truncates `self` to `other.len()` by calling `split_off` on - // the first key after `other.len()` elements if it exists. - let split_off_key = if self.len() > other.len() { - let diff = self.len() - other.len(); - if diff <= other.len() { - self.iter().nth_back(diff - 1).map(|pair| (*pair.0).clone()) - } else { - self.iter().nth(other.len()).map(|pair| (*pair.0).clone()) - } - } else { - None - }; - if let Some(key) = split_off_key { - self.split_off(&key); - } - - let mut siter = self.range_mut(..); - let mut oiter = other.iter(); - // After truncation, `self` is at most as long as `other` so this loop - // replaces every key-value pair in `self`. Since `oiter` is in sorted - // order and the structure of the `BTreeMap` stays the same, - // the BTree invariants are maintained at the end of the loop. - while !siter.is_empty() { - if let Some((ok, ov)) = oiter.next() { - // SAFETY: This is safe because `siter` is nonempty. - let (sk, sv) = unsafe { siter.next_unchecked() }; - sk.clone_from(ok); - sv.clone_from(ov); - } else { - break; - } - } - // If `other` is longer than `self`, the remaining elements are inserted. - self.extend(oiter.map(|(k, v)| ((*k).clone(), (*v).clone()))); - } } impl<K, Q: ?Sized> super::Recover<Q> for BTreeMap<K, ()> |
