aboutsummaryrefslogtreecommitdiff
path: root/include/cru/common/SelfResolvable.hpp
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2022-02-08 16:53:51 +0800
committercrupest <crupest@outlook.com>2022-02-08 16:53:51 +0800
commit74bb9cd27242b9320f99ff4d2b50c3051576cc14 (patch)
tree744bac5799c593d1d6f81e7b09581bea626f2cde /include/cru/common/SelfResolvable.hpp
parentb90c398de829d1ba5329651d75bae82f5e4085fe (diff)
downloadcru-74bb9cd27242b9320f99ff4d2b50c3051576cc14.tar.gz
cru-74bb9cd27242b9320f99ff4d2b50c3051576cc14.tar.bz2
cru-74bb9cd27242b9320f99ff4d2b50c3051576cc14.zip
...
Diffstat (limited to 'include/cru/common/SelfResolvable.hpp')
-rw-r--r--include/cru/common/SelfResolvable.hpp69
1 files changed, 0 insertions, 69 deletions
diff --git a/include/cru/common/SelfResolvable.hpp b/include/cru/common/SelfResolvable.hpp
deleted file mode 100644
index eaa4ce34..00000000
--- a/include/cru/common/SelfResolvable.hpp
+++ /dev/null
@@ -1,69 +0,0 @@
-#pragma once
-#include "PreConfig.hpp"
-
-#include <memory>
-#include <type_traits>
-
-namespace cru {
-template <typename T>
-class SelfResolvable;
-
-template <typename T>
-class ObjectResolver {
- friend SelfResolvable<T>;
-
- private:
- ObjectResolver(const std::shared_ptr<T*>& resolver) : resolver_(resolver) {}
-
- public:
- ObjectResolver(const ObjectResolver&) = default;
- ObjectResolver& operator=(const ObjectResolver&) = default;
- ObjectResolver(ObjectResolver&&) = default;
- ObjectResolver& operator=(ObjectResolver&&) = default;
- ~ObjectResolver() = default;
-
- T* Resolve() const {
- // resolver_ is null only when this has been moved.
- // You shouldn't resolve a moved resolver. So assert it.
- Expects(resolver_);
- return *resolver_;
- }
-
- private:
- std::shared_ptr<T*> resolver_;
-};
-
-template <typename T>
-class SelfResolvable {
- public:
- SelfResolvable() : resolver_(new T*(static_cast<T*>(this))) {}
- SelfResolvable(const SelfResolvable&) = delete;
- SelfResolvable& operator=(const SelfResolvable&) = delete;
-
- // 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_); }
-
- private:
- std::shared_ptr<T*> resolver_;
-};
-} // namespace cru