diff options
| author | crupest <crupest@outlook.com> | 2020-12-02 19:19:22 +0800 |
|---|---|---|
| committer | crupest <crupest@outlook.com> | 2020-12-02 19:19:22 +0800 |
| commit | 145cfd5b82d76e0c937eceda707aa22427899943 (patch) | |
| tree | ab98708eea0e0ba7b965e20927303e49a8d9ae23 /include/cru/common/SelfResolvable.hpp | |
| parent | 0fb7a0e0b2b9e04ca414b1e47c69cc854c79831b (diff) | |
| download | cru-145cfd5b82d76e0c937eceda707aa22427899943.tar.gz cru-145cfd5b82d76e0c937eceda707aa22427899943.tar.bz2 cru-145cfd5b82d76e0c937eceda707aa22427899943.zip | |
...
Diffstat (limited to 'include/cru/common/SelfResolvable.hpp')
| -rw-r--r-- | include/cru/common/SelfResolvable.hpp | 24 |
1 files changed, 21 insertions, 3 deletions
diff --git a/include/cru/common/SelfResolvable.hpp b/include/cru/common/SelfResolvable.hpp index 94f3ae87..eaa4ce34 100644 --- a/include/cru/common/SelfResolvable.hpp +++ b/include/cru/common/SelfResolvable.hpp @@ -39,9 +39,27 @@ class SelfResolvable { SelfResolvable() : resolver_(new T*(static_cast<T*>(this))) {} SelfResolvable(const SelfResolvable&) = delete; SelfResolvable& operator=(const SelfResolvable&) = delete; - SelfResolvable(SelfResolvable&&) = delete; - SelfResolvable& operator=(SelfResolvable&&) = delete; - virtual ~SelfResolvable() { (*resolver_) = nullptr; } + + // Resolvers to old object will resolve to new object. + SelfResolvable(SelfResolvable&& other) + : resolver_(std::move(other.resolver_)) { + (*resolver_) = static_cast<T*>(this); + } + + // Old resolvers for this object will resolve to nullptr. + // Other's resolvers will now resolve to this. + SelfResolvable& operator=(SelfResolvable&& other) { + if (this != &other) { + (*resolver_) = nullptr; + resolver_ = std::move(other.resolver_); + (*resolver_) = static_cast<T*>(this); + } + return *this; + } + + virtual ~SelfResolvable() { + if (resolver_ != nullptr) (*resolver_) = nullptr; + } ObjectResolver<T> CreateResolver() { return ObjectResolver<T>(resolver_); } |
