about summary refs log tree commit diff
path: root/src/liballoc
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2018-07-02 08:28:12 +0000
committerbors <bors@rust-lang.org>2018-07-02 08:28:12 +0000
commita96c88e80fce9d1950aa4700bdeacee35cb9ac02 (patch)
tree1c8472b7b9377b516bba8703f7dd869b42d10cb5 /src/liballoc
parenta53bd20fae43cb35d394d7823aacdf52ccbd19cb (diff)
parentf46f05bae8d81246f1ad93ccee051a13c9be393e (diff)
downloadrust-a96c88e80fce9d1950aa4700bdeacee35cb9ac02.tar.gz
rust-a96c88e80fce9d1950aa4700bdeacee35cb9ac02.zip
Auto merge of #51893 - nnethercote:BTreeMap-clone-noalloc, r=nnethercote
Make `BTreeMap::clone()` not allocate when cloning an empty tree.

r? @Gankro

CC @porglezomp
Diffstat (limited to 'src/liballoc')
-rw-r--r--src/liballoc/collections/btree/map.rs11
1 files changed, 10 insertions, 1 deletions
diff --git a/src/liballoc/collections/btree/map.rs b/src/liballoc/collections/btree/map.rs
index e6e454446e2..2aad3149bb2 100644
--- a/src/liballoc/collections/btree/map.rs
+++ b/src/liballoc/collections/btree/map.rs
@@ -213,7 +213,16 @@ impl<K: Clone, V: Clone> Clone for BTreeMap<K, V> {
             }
         }
 
-        clone_subtree(self.root.as_ref())
+        if self.len() == 0 {
+            // Ideally we'd call `BTreeMap::new` here, but that has the `K:
+            // Ord` constraint, which this method lacks.
+            BTreeMap {
+                root: node::Root::shared_empty_root(),
+                length: 0,
+            }
+        } else {
+            clone_subtree(self.root.as_ref())
+        }
     }
 }