diff --git a/src/lib/p.hpp b/src/lib/p.hpp index 83c2088e5..d88a51717 100644 --- a/src/lib/p.hpp +++ b/src/lib/p.hpp @@ -81,14 +81,16 @@ namespace lib { template P (Y* p, D d) : BASE(p,d){} P (P const& r) : BASE(r) {} + P (P const&& rr) : BASE(rr) {} template P (shared_ptr const& r) : BASE(r) {} template explicit P (weak_ptr const& wr) : BASE(wr) {} - template explicit P (std::auto_ptr & ar) : BASE(ar) {} + template explicit P (std::auto_ptr && ar) : BASE(std::move(ar)) {} P& operator= (P const& r) { BASE::operator= (r); return *this; } + P& operator= (P const&& rr) { BASE::operator= (rr); return *this; } template P& operator=(shared_ptr const& sr) { BASE::operator= (sr); return *this; } - template P& operator=(std::auto_ptr & ar) { BASE::operator= (ar); return *this; } + template P& operator=(std::auto_ptr && ar) { BASE::operator= (std::move(ar)); return *this; } TAR* get() const { return dynamic_cast (BASE::get()); } TAR& operator*() const { return *get(); } diff --git a/tests/library/custom-shared-ptr-test.cpp b/tests/library/custom-shared-ptr-test.cpp index 265c4d6b2..0ffdc9c61 100644 --- a/tests/library/custom-shared-ptr-test.cpp +++ b/tests/library/custom-shared-ptr-test.cpp @@ -76,6 +76,7 @@ namespace test{ { check_refcounting (); check_shared_ownership (); + check_ownership_transfer (); check_type_relations (); check_ordering (); } @@ -116,14 +117,9 @@ namespace test{ void check_shared_ownership () { - std::auto_ptr au (new X(22)); - CHECK (au.get()); - - P pX (au); - CHECK (!au.get()); + P pX (new X(22)); CHECK (pX); CHECK (1 == pX.use_count()); - CHECK (22 == pX->x_); weak_ptr wX (pX); CHECK (wX.lock()); @@ -167,6 +163,33 @@ namespace test{ } + void + check_ownership_transfer () + { + std::auto_ptr au (new X(23)); + CHECK (au.get()); + + P pX (std::move(au)); + CHECK (!au.get()); + CHECK (pX); + CHECK (1 == pX.use_count()); + CHECK (23 == pX->x_); + + au.reset (new X(21)); + CHECK (au.get()); + + pX.reset(); + CHECK (!pX); + CHECK (0 == pX.use_count()); + + pX = std::move(au); + CHECK (!au.get()); + CHECK (pX); + CHECK (1 == pX.use_count()); + CHECK (21 == pX->x_); + } + + /** @test building type relationships on smart-ptrs */ void check_type_relations ()