diff --git a/include/dsn/utility/autoref_ptr.h b/include/dsn/utility/autoref_ptr.h index c525574cb6..a08ebc6ee4 100644 --- a/include/dsn/utility/autoref_ptr.h +++ b/include/dsn/utility/autoref_ptr.h @@ -37,6 +37,8 @@ #include #include +#include +#include namespace dsn { class ref_counter @@ -106,13 +108,6 @@ class ref_ptr _obj->add_ref(); } - template - ref_ptr(U *obj) : _obj(obj) - { - if (nullptr != _obj) - _obj->add_ref(); - } - ref_ptr(const ref_ptr &r) { _obj = r.get(); @@ -120,7 +115,8 @@ class ref_ptr _obj->add_ref(); } - template + template ::value>::type> ref_ptr(const ref_ptr &r) { _obj = r.get(); @@ -130,8 +126,9 @@ class ref_ptr ref_ptr(ref_ptr &&r) : _obj(r._obj) { r._obj = nullptr; } - template - ref_ptr(ref_ptr &&r) : _obj(r._obj) + template ::value>::type> + ref_ptr(ref_ptr &&r) noexcept : _obj(r._obj) { r._obj = nullptr; } @@ -143,72 +140,24 @@ class ref_ptr } } - ref_ptr &operator=(T *obj) - { - if (_obj == obj) - return *this; - - if (nullptr != _obj) { - _obj->release_ref(); - } - - _obj = obj; - - if (obj != nullptr) { - _obj->add_ref(); - } + ref_ptr &operator=(T *obj) { return *this = ref_ptr(obj); } - return *this; - } - - template - ref_ptr &operator=(U *obj) + ref_ptr &operator=(ref_ptr r) noexcept { - if (_obj == obj) - return *this; - if (nullptr != _obj) { - _obj->release_ref(); - } - _obj = obj; - if (_obj != nullptr) { - _obj->add_ref(); - } + swap(r); return *this; } - ref_ptr &operator=(const ref_ptr &obj) { return operator=(obj._obj); } - - template - ref_ptr &operator=(const ref_ptr &obj) + template ::value>::type> + ref_ptr &operator=(ref_ptr r) noexcept { - return operator=(obj._obj); - } - - ref_ptr &operator=(ref_ptr &&obj) - { - if (this == &obj) { - return *this; - } - - if (nullptr != _obj) { - _obj->release_ref(); - } - - _obj = obj._obj; - obj._obj = nullptr; + ref_ptr p(r); + swap(p); return *this; } - template - ref_ptr &operator=(ref_ptr &&obj) - { - if (nullptr != _obj) { - _obj->release_ref(); - } - _obj = obj._obj; - obj._obj = nullptr; - return *this; - } + void swap(ref_ptr &r) noexcept { std::swap(_obj, r._obj); } T *get() const { return _obj; }