Provide move semantics for TinyPtrVector and for DenseMap's rehash function.
authorBenjamin Kramer <benny.kra@googlemail.com>
Sat, 19 May 2012 13:28:54 +0000 (13:28 +0000)
committerBenjamin Kramer <benny.kra@googlemail.com>
Sat, 19 May 2012 13:28:54 +0000 (13:28 +0000)
This makes DenseMap<..., TinyPtrVector<...>> as cheap as it always should've been!

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@157113 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/ADT/DenseMap.h
include/llvm/ADT/TinyPtrVector.h

index 8d4a19d0919c9f26074c6c7dafb5bb075e68465a..f7ae346253ff0226c315a6cb2f0cde54156d2fab 100644 (file)
@@ -14,6 +14,7 @@
 #ifndef LLVM_ADT_DENSEMAP_H
 #define LLVM_ADT_DENSEMAP_H
 
+#include "llvm/Support/Compiler.h"
 #include "llvm/Support/MathExtras.h"
 #include "llvm/Support/PointerLikeTypeTraits.h"
 #include "llvm/Support/type_traits.h"
@@ -438,8 +439,8 @@ private:
         bool FoundVal = LookupBucketFor(B->first, DestBucket);
         (void)FoundVal; // silence warning.
         assert(!FoundVal && "Key already in new map?");
-        DestBucket->first = B->first;
-        new (&DestBucket->second) ValueT(B->second);
+        DestBucket->first = llvm_move(B->first);
+        new (&DestBucket->second) ValueT(llvm_move(B->second));
 
         // Free the value.
         B->second.~ValueT();
index 5014517c9e05bae4a433bb402b165f8edc85e596..f9b7d559c39efa6e49af0ad2914ac778533b05a6 100644 (file)
 #ifndef LLVM_ADT_TINYPTRVECTOR_H
 #define LLVM_ADT_TINYPTRVECTOR_H
 
+#include "llvm/ADT/ArrayRef.h"
 #include "llvm/ADT/SmallVector.h"
 #include "llvm/ADT/PointerUnion.h"
+#include "llvm/Support/Compiler.h"
 
 namespace llvm {
   
@@ -32,6 +34,11 @@ public:
     if (VecTy *V = Val.template dyn_cast<VecTy*>())
       Val = new VecTy(*V);
   }
+#if LLVM_USE_RVALUE_REFERENCES
+  TinyPtrVector(TinyPtrVector &&RHS) : Val(RHS.Val) {
+    RHS.Val = (EltTy)0;
+  }
+#endif
   ~TinyPtrVector() {
     if (VecTy *V = Val.template dyn_cast<VecTy*>())
       delete V;
@@ -159,6 +166,9 @@ public:
   
 private:
   void operator=(const TinyPtrVector&); // NOT IMPLEMENTED YET.
+#if LLVM_USE_RVALUE_REFERENCES
+  void operator=(TinyPtrVector&&); // NOT IMPLEMENTED YET.
+#endif
 };
 } // end namespace llvm