[llvm] r202609 - [C++11] Add support for OwningPtr<T> to be converted to and from

Richard Smith richard at metafoo.co.uk
Sat Mar 1 21:55:51 PST 2014


On Sat, Mar 1, 2014 at 7:38 PM, Chandler Carruth <chandlerc at gmail.com>wrote:

> 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) {
>

Why an rvalue reference to a unique_ptr rather than passing the unique_ptr
by value?


> +    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
>  }
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140301/3990bc13/attachment.html>


More information about the llvm-commits mailing list