aboutsummaryrefslogtreecommitdiff
path: root/include/cru/common/SelfResolvable.hpp
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2021-03-24 19:14:19 +0800
committercrupest <crupest@outlook.com>2021-03-24 19:14:19 +0800
commit7f15a1ff9a2007e119798053083a0a87d042990a (patch)
treecb35c01a7eaee867376d959b96c9bbd15df939e5 /include/cru/common/SelfResolvable.hpp
parent74956951ee663012df0c3fe4ebe29799cb2f7732 (diff)
parent7703063a5816b089483e78ccd74bb9902ccfbea8 (diff)
downloadcru-7f15a1ff9a2007e119798053083a0a87d042990a.tar.gz
cru-7f15a1ff9a2007e119798053083a0a87d042990a.tar.bz2
cru-7f15a1ff9a2007e119798053083a0a87d042990a.zip
Merge branch 'master' of https://github.com/crupest/CruUI
Diffstat (limited to 'include/cru/common/SelfResolvable.hpp')
-rw-r--r--include/cru/common/SelfResolvable.hpp24
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_); }