Chromium Code Reviews| Index: base/memory/ref_counted.h |
| diff --git a/base/memory/ref_counted.h b/base/memory/ref_counted.h |
| index 219437ed8d82b8b35835a6c3297d5f719f14c277..7320dee6779daf5dfe8248faac04d0748234ee92 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,12 @@ class scoped_refptr { |
| return *this = r.get(); |
| } |
| + template <typename U> |
| + scoped_refptr<T>& operator=(scoped_refptr<U>&& r) { |
| + scoped_refptr<T>(r.Pass()).swap(*this); |
|
danakj
2015/04/10 19:44:24
This is:
temp.ptr_ = r.ptr_;
r.ptr_ = nullptr;
T*
Kibeom Kim (inactive)
2015/04/12 07:35:14
Yeah you're right. it also needs |if (ptr_) Releas
|
| + return *this; |
| + } |
| + |
| void swap(T** pp) { |
| T* p = ptr_; |
| ptr_ = *pp; |
| @@ -334,6 +347,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). |
| // |