[llvm] r202609 - [C++11] Add support for OwningPtr<T> to be converted to and from
Chandler Carruth
chandlerc at gmail.com
Sat Mar 1 19:38:32 PST 2014
Author: chandlerc
Date: Sat Mar 1 21:38:32 2014
New Revision: 202609
URL: http://llvm.org/viewvc/llvm-project?rev=202609&view=rev
Log:
[C++11] Add support for OwningPtr<T> to be converted to and from
std::unique_ptr<T>.
Patch by Ahmed Charles!
Modified:
llvm/trunk/include/llvm/ADT/OwningPtr.h
llvm/trunk/unittests/ADT/OwningPtrTest.cpp
Modified: llvm/trunk/include/llvm/ADT/OwningPtr.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/OwningPtr.h?rev=202609&r1=202608&r2=202609&view=diff
==============================================================================
--- llvm/trunk/include/llvm/ADT/OwningPtr.h (original)
+++ llvm/trunk/include/llvm/ADT/OwningPtr.h Sat Mar 1 21:38:32 2014
@@ -17,6 +17,7 @@
#include "llvm/Support/Compiler.h"
#include <cassert>
#include <cstddef>
+#include <memory>
namespace llvm {
@@ -39,6 +40,17 @@ public:
return *this;
}
+ OwningPtr(std::unique_ptr<T> &&Other) : Ptr(Other.release()) {}
+
+ OwningPtr &operator=(std::unique_ptr<T> &&Other) {
+ reset(Other.release());
+ return *this;
+ }
+
+#if LLVM_HAS_RVALUE_REFERENCE_THIS
+ operator std::unique_ptr<T>() && { return std::unique_ptr<T>(take()); }
+#endif
+
~OwningPtr() {
delete Ptr;
}
@@ -61,6 +73,8 @@ public:
return Tmp;
}
+ std::unique_ptr<T> take_unique() { return std::unique_ptr<T>(take()); }
+
T &operator*() const {
assert(Ptr && "Cannot dereference null pointer");
return *Ptr;
Modified: llvm/trunk/unittests/ADT/OwningPtrTest.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/ADT/OwningPtrTest.cpp?rev=202609&r1=202608&r2=202609&view=diff
==============================================================================
--- llvm/trunk/unittests/ADT/OwningPtrTest.cpp (original)
+++ llvm/trunk/unittests/ADT/OwningPtrTest.cpp Sat Mar 1 21:38:32 2014
@@ -174,4 +174,82 @@ TEST_F(OwningPtrTest, Swap) {
EXPECT_EQ(2u, TrackDestructor::Destructions);
}
+TEST_F(OwningPtrTest, UniqueToOwningConstruction) {
+ TrackDestructor::ResetCounts();
+ {
+ std::unique_ptr<TrackDestructor> A(new TrackDestructor(3));
+ OwningPtr<TrackDestructor> B = std::move(A);
+ EXPECT_FALSE(A);
+ EXPECT_TRUE(!A);
+ EXPECT_FALSE(A.get());
+ EXPECT_TRUE((bool)B);
+ EXPECT_FALSE(!B);
+ EXPECT_TRUE(B.get());
+ EXPECT_TRUE(B.isValid());
+ EXPECT_EQ(3, (*B).val);
+ EXPECT_EQ(3, B->val);
+ EXPECT_EQ(0u, TrackDestructor::Destructions);
+ }
+ EXPECT_EQ(1u, TrackDestructor::Destructions);
+}
+
+TEST_F(OwningPtrTest, UniqueToOwningAssignment) {
+ TrackDestructor::ResetCounts();
+ {
+ std::unique_ptr<TrackDestructor> A(new TrackDestructor(3));
+ OwningPtr<TrackDestructor> B(new TrackDestructor(4));
+ B = std::move(A);
+ EXPECT_FALSE(A);
+ EXPECT_TRUE(!A);
+ EXPECT_FALSE(A.get());
+ EXPECT_TRUE((bool)B);
+ EXPECT_FALSE(!B);
+ EXPECT_TRUE(B.get());
+ EXPECT_TRUE(B.isValid());
+ EXPECT_EQ(3, (*B).val);
+ EXPECT_EQ(3, B->val);
+ EXPECT_EQ(1u, TrackDestructor::Destructions);
+ }
+ EXPECT_EQ(2u, TrackDestructor::Destructions);
+}
+
+TEST_F(OwningPtrTest, TakeUniqueConstruction) {
+ TrackDestructor::ResetCounts();
+ {
+ OwningPtr<TrackDestructor> A(new TrackDestructor(3));
+ std::unique_ptr<TrackDestructor> B = A.take_unique();
+ EXPECT_FALSE(A);
+ EXPECT_TRUE(!A);
+ EXPECT_FALSE(A.get());
+ EXPECT_FALSE(A.isValid());
+ EXPECT_TRUE((bool)B);
+ EXPECT_FALSE(!B);
+ EXPECT_TRUE(B.get());
+ EXPECT_EQ(3, (*B).val);
+ EXPECT_EQ(3, B->val);
+ EXPECT_EQ(0u, TrackDestructor::Destructions);
+ }
+ EXPECT_EQ(1u, TrackDestructor::Destructions);
+}
+
+#if LLVM_HAS_RVALUE_REFERENCE_THIS
+TEST_F(OwningPtrTest, OwningToUniqueConstruction) {
+ TrackDestructor::ResetCounts();
+ {
+ OwningPtr<TrackDestructor> A(new TrackDestructor(3));
+ std::unique_ptr<TrackDestructor> B = std::move(A);
+ EXPECT_FALSE(A);
+ EXPECT_TRUE(!A);
+ EXPECT_FALSE(A.get());
+ EXPECT_FALSE(A.isValid());
+ EXPECT_TRUE((bool)B);
+ EXPECT_FALSE(!B);
+ EXPECT_TRUE(B.get());
+ EXPECT_EQ(3, (*B).val);
+ EXPECT_EQ(3, B->val);
+ EXPECT_EQ(0u, TrackDestructor::Destructions);
+ }
+ EXPECT_EQ(1u, TrackDestructor::Destructions);
+}
+#endif
}
More information about the llvm-commits
mailing list