| Index: base/memory/ref_counted.h
|
| diff --git a/base/memory/ref_counted.h b/base/memory/ref_counted.h
|
| index 219437ed8d82b8b35835a6c3297d5f719f14c277..5f94b4c37ae2eb510176b585b30a9af20e216d32 100644
|
| --- a/base/memory/ref_counted.h
|
| +++ b/base/memory/ref_counted.h
|
| @@ -14,6 +14,7 @@
|
| #ifndef NDEBUG
|
| #include "base/logging.h"
|
| #endif
|
| +#include "base/move.h"
|
| #include "base/threading/thread_collision_warner.h"
|
| #include "build/build_config.h"
|
|
|
| @@ -264,6 +265,7 @@ class RefCountedData
|
| //
|
| template <class T>
|
| class scoped_refptr {
|
| + TYPE_WITH_MOVE_CONSTRUCTOR_FOR_CPP_03(scoped_refptr)
|
| public:
|
| typedef T element_type;
|
|
|
| @@ -286,6 +288,11 @@ class scoped_refptr {
|
| AddRef(ptr_);
|
| }
|
|
|
| + template <typename U>
|
| + scoped_refptr(scoped_refptr<U>&& r) : ptr_(r.get()) {
|
| + r.ptr_ = nullptr;
|
| + }
|
| +
|
| ~scoped_refptr() {
|
| if (ptr_)
|
| Release(ptr_);
|
| @@ -323,6 +330,17 @@ class scoped_refptr {
|
| return *this = r.get();
|
| }
|
|
|
| + scoped_refptr<T>& operator=(scoped_refptr<T>&& r) {
|
| + scoped_refptr<T>(r.Pass()).swap(*this);
|
| + return *this;
|
| + }
|
| +
|
| + template <typename U>
|
| + scoped_refptr<T>& operator=(scoped_refptr<U>&& r) {
|
| + scoped_refptr<T>(r.Pass()).swap(*this);
|
| + return *this;
|
| + }
|
| +
|
| void swap(T** pp) {
|
| T* p = ptr_;
|
| ptr_ = *pp;
|
| @@ -334,6 +352,8 @@ class scoped_refptr {
|
| }
|
|
|
| private:
|
| + template <typename U> friend class scoped_refptr;
|
| +
|
| // Allow scoped_refptr<T> to be used in boolean expressions, but not
|
| // implicitly convertible to a real bool (which is dangerous).
|
| //
|
|
|