From d90f19f897ff41b1bb67e027f722453200179653 Mon Sep 17 00:00:00 2001 From: Pagwin Date: Fri, 13 Dec 2024 22:23:04 -0500 Subject: [PATCH] more inheritence fuckery --- SharedPtr.hpp | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/SharedPtr.hpp b/SharedPtr.hpp index d119ae6..6f3de5b 100644 --- a/SharedPtr.hpp +++ b/SharedPtr.hpp @@ -17,22 +17,20 @@ template struct Base { T *ptr; Base(T *ptr) : ptr{ptr} {} template Base(Base const &ptr) : ptr{ptr.ptr} {} - template operator U() { return U(*this); } public: virtual T &operator*() { return *ptr; } virtual T *operator->() { return ptr; } virtual ~Base() = default; }; -template class Derived : public Base { - static_assert(std::is_base_of_v); +template class MyDerived : public Base { U *ptr; public: - Derived(Base b) : Derived{*dynamic_cast *>(&b)} {} + MyDerived(U *ptr) : Base{ptr} { this->ptr = ptr; } U &operator*() { return *ptr; } U *operator->() { return ptr; } - virtual ~Derived() { delete this->ptr; } + virtual ~MyDerived() { delete this->ptr; } }; template class SharedPtr { public: @@ -43,11 +41,12 @@ public: SharedPtr() : ptr{nullptr}, count{new std::atomic{0}} {} template explicit SharedPtr(U *ptr) - : ptr{static_cast *>(new Derived{ptr})}, - count{new std::atomic{ptr ? 1 : 0}} {} - SharedPtr(const SharedPtr &p) : ptr{p.ptr} {} + : ptr{static_cast *>(new MyDerived{ptr})}, + count{new std::atomic{ + static_cast(ptr ? 1 : 0)}} {} + SharedPtr(const SharedPtr &p) : ptr{p.ptr}, count{p.count} {} template - SharedPtr(const SharedPtr &p) : ptr(Base(*p.ptr)), count{p.count} { + SharedPtr(const SharedPtr &p) : ptr(p.ptr), count{p.count} { (*count)++; } SharedPtr(SharedPtr &&p) : ptr{p.ptr} { p.ptr = nullptr; } @@ -60,12 +59,13 @@ public: return *this; } template SharedPtr &operator=(const SharedPtr &ptr) { - this->ptr = new Derived{Base(ptr.ptr)}; + this->ptr = new MyDerived{Base(*ptr.ptr)}; return *this; } SharedPtr &operator=(SharedPtr &&p) { ptr = p.ptr; p.ptr = nullptr; + return *this; } template SharedPtr &operator=(SharedPtr &&p) { ptr = p.ptr; @@ -84,20 +84,20 @@ public: } } void reset() { this->ptr = nullptr; } - template void reset(U *p) { this->ptr = new Derived{p}; } + template void reset(U *p) { this->ptr = new MyDerived{p}; } T *get() const { return this->ptr->ptr; } T &operator*() const { return this->ptr->operator*(); } T *operator->() const { return this->ptr->operator->(); } explicit operator bool() const { return this->ptr->ptr != nullptr; } - template - friend SharedPtr static_pointer_cast(const SharedPtr &sp) { - todo(""); - } - template - friend SharedPtr dynamic_pointer_cast(const SharedPtr &sp) { - todo(""); - } }; +template +SharedPtr static_pointer_cast(const SharedPtr &sp) { + todo(""); +} +template +SharedPtr dynamic_pointer_cast(const SharedPtr &sp) { + todo(""); +} template bool operator==(const SharedPtr &lhs, const SharedPtr &rhs) { return lhs.get() == rhs.get();