Skip to content

Commit 9001b1e

Browse files
committed
Implement clone_from for BTree collections
1 parent f1cf95e commit 9001b1e

File tree

1 file changed

+29
-0
lines changed
  • src/liballoc/collections/btree

1 file changed

+29
-0
lines changed

src/liballoc/collections/btree/map.rs

+29
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,35 @@ impl<K: Clone + Ord, V: Clone> Clone for BTreeMap<K, V> {
206206
clone_subtree(self.root.as_ref())
207207
}
208208
}
209+
210+
fn clone_from(&mut self, other: &Self) {
211+
if let Some(key) = {
212+
if self.len() > other.len() {
213+
let diff = self.len() - other.len();
214+
if diff <= other.len() {
215+
self.iter().nth_back(diff - 1).map(|pair| (*pair.0).clone())
216+
} else {
217+
self.iter().nth(other.len()).map(|pair| (*pair.0).clone())
218+
}
219+
} else {
220+
None
221+
}
222+
} {
223+
self.split_off(&key);
224+
}
225+
let mut siter = self.range_mut(..);
226+
let mut oiter = other.iter();
227+
while siter.front != siter.back {
228+
if let Some((ok, ov)) = oiter.next() {
229+
let (sk, sv) = unsafe { siter.next_unchecked() };
230+
sk.clone_from(ok);
231+
sv.clone_from(ov);
232+
} else {
233+
break ;
234+
}
235+
}
236+
self.extend(oiter.map(|(k, v)| ((*k).clone(), (*v).clone())));
237+
}
209238
}
210239

211240
impl<K, Q: ?Sized> super::Recover<Q> for BTreeMap<K, ()>

0 commit comments

Comments
 (0)