aboutsummaryrefslogtreecommitdiff
path: root/include/cru/common/SelfResolvable.h
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2023-12-30 01:43:18 +0800
committercrupest <crupest@outlook.com>2023-12-30 14:11:23 +0800
commitc4641cadc0070b38f4efec740023a9300a7602d1 (patch)
treee9bb34d284445923217bea479ee4bc5a4a78b029 /include/cru/common/SelfResolvable.h
parentf7a40005ec854131629acac8d03aed0e8a5da415 (diff)
downloadcru-c4641cadc0070b38f4efec740023a9300a7602d1.tar.gz
cru-c4641cadc0070b38f4efec740023a9300a7602d1.tar.bz2
cru-c4641cadc0070b38f4efec740023a9300a7602d1.zip
Fix bugs and write unit tests for SelfResolvable.
Diffstat (limited to 'include/cru/common/SelfResolvable.h')
-rw-r--r--include/cru/common/SelfResolvable.h11
1 files changed, 6 insertions, 5 deletions
diff --git a/include/cru/common/SelfResolvable.h b/include/cru/common/SelfResolvable.h
index 5a609340..c0ca9326 100644
--- a/include/cru/common/SelfResolvable.h
+++ b/include/cru/common/SelfResolvable.h
@@ -28,8 +28,6 @@ class ObjectResolver {
return *this->shared_object_ptr_;
}
- explicit operator bool() const { return this->IsValid(); }
-
private:
void SetResolvedObject(T* o) {
assert(IsValid());
@@ -43,14 +41,14 @@ class ObjectResolver {
template <typename T>
class SelfResolvable {
public:
- SelfResolvable() : resolver_(static_cast<T*>(this)) {}
+ SelfResolvable() : resolver_(CastToSubClass()) {}
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_)) {
- this->resolver_.SetResolvedObject(this);
+ this->resolver_.SetResolvedObject(CastToSubClass());
}
// Old resolvers for this object will resolve to nullptr.
@@ -58,7 +56,7 @@ class SelfResolvable {
SelfResolvable& operator=(SelfResolvable&& other) {
if (this != &other) {
this->resolver_ = std::move(other.resolver_);
- this->resolver_.SetResolvedObject(this);
+ this->resolver_.SetResolvedObject(CastToSubClass());
}
return *this;
}
@@ -72,6 +70,9 @@ class SelfResolvable {
ObjectResolver<T> CreateResolver() { return resolver_; }
private:
+ T* CastToSubClass() { return static_cast<T*>(this); }
+
+ private:
ObjectResolver<T> resolver_;
};
} // namespace cru