1 //////////////////////////////////////////////////////////////////////////////
3 // (C) Copyright Ion Gaztanaga 2009.
4 // Distributed under the Boost Software License, Version 1.0.
5 // (See accompanying file LICENSE_1_0.txt or copy at
6 // http://www.boost.org/LICENSE_1_0.txt)
8 // See http://www.boost.org/libs/move for documentation.
10 //////////////////////////////////////////////////////////////////////////////
11 #include <boost/move/detail/config_begin.hpp>
12 #include <boost/move/utility_core.hpp>
14 //[clone_ptr_base_derived
17 BOOST_COPYABLE_AND_MOVABLE(Base)
22 Base(const Base &/*x*/) {/**/} // Copy ctor
24 Base(BOOST_RV_REF(Base) /*x*/) {/**/} // Move ctor
26 Base& operator=(BOOST_RV_REF(Base) /*x*/)
27 {/**/ return *this;} // Move assign
29 Base& operator=(BOOST_COPY_ASSIGN_REF(Base) /*x*/)
30 {/**/ return *this;} // Copy assign
32 virtual Base *clone() const
33 { return new Base(*this); }
40 BOOST_COPYABLE_AND_MOVABLE(Member)
45 // Compiler-generated copy constructor...
47 Member(BOOST_RV_REF(Member)) {/**/} // Move ctor
49 Member &operator=(BOOST_RV_REF(Member)) // Move assign
52 Member &operator=(BOOST_COPY_ASSIGN_REF(Member)) // Copy assign
56 class Derived : public Base
58 BOOST_COPYABLE_AND_MOVABLE(Derived)
64 // Compiler-generated copy constructor...
66 Derived(BOOST_RV_REF(Derived) x) // Move ctor
67 : Base(boost::move(static_cast<Base&>(x))),
68 mem_(boost::move(x.mem_)) { }
70 Derived& operator=(BOOST_RV_REF(Derived) x) // Move assign
72 Base::operator=(boost::move(static_cast<Base&>(x)));
73 mem_ = boost::move(x.mem_);
77 Derived& operator=(BOOST_COPY_ASSIGN_REF(Derived) x) // Copy assign
79 Base::operator=(static_cast<const Base&>(x));
92 // Mark this class copyable and movable
93 BOOST_COPYABLE_AND_MOVABLE(clone_ptr)
98 explicit clone_ptr(T* p = 0) : ptr(p) {}
101 ~clone_ptr() { delete ptr; }
103 clone_ptr(const clone_ptr& p) // Copy constructor (as usual)
104 : ptr(p.ptr ? p.ptr->clone() : 0) {}
106 clone_ptr& operator=(BOOST_COPY_ASSIGN_REF(clone_ptr) p) // Copy assignment
109 T *tmp_p = p.ptr ? p.ptr->clone() : 0;
117 clone_ptr(BOOST_RV_REF(clone_ptr) p) //Move constructor
118 : ptr(p.ptr) { p.ptr = 0; }
120 clone_ptr& operator=(BOOST_RV_REF(clone_ptr) p) //Move assignment
136 clone_ptr<Base> p1(new Derived());
138 clone_ptr<Base> p2 = p1; // p2 and p1 each own their own pointer
143 clone_ptr<Base> p1(new Derived());
145 clone_ptr<Base> p2 = boost::move(p1); // p2 now owns the pointer instead of p1
146 p2 = clone_ptr<Base>(new Derived()); // temporary is moved to p2
149 //[clone_ptr_move_derived
151 Derived d2(boost::move(d));
157 #include <boost/move/detail/config_end.hpp>