wip deleter

This commit is contained in:
Steven Dee (Jōshin) 2024-06-19 23:13:00 -07:00
parent df00ae1bca
commit 507ecaa09a
No known key found for this signature in database

View file

@ -45,26 +45,28 @@ struct shared_control
virtual void on_zero_weak() noexcept = 0; virtual void on_zero_weak() noexcept = 0;
}; };
template<typename T> template<typename T, typename D>
struct shared_pointer : shared_control struct shared_pointer : shared_control
{ {
T* p; T* p;
[[no_unique_address]] D d;
static shared_pointer* make(T* const p) static shared_pointer* make(T* const p, auto&& d)
{ {
auto p2 = unique_ptr(p); auto p2 = unique_ptr(p);
auto r = new shared_pointer(p2.release()); auto r = new shared_pointer(p2.release(), ctl::forward<decltype(d)>(d));
return r; return r;
} }
private: private:
explicit constexpr shared_pointer(T* const p) noexcept : p(p) explicit constexpr shared_pointer(T* const p, auto&& d) noexcept
: p(p), d(ctl::forward<decltype(d)>(d))
{ {
} }
void on_zero_shared() noexcept override void on_zero_shared() noexcept override
{ {
delete p; ctl::move(d)(p);
} }
void on_zero_weak() noexcept override void on_zero_weak() noexcept override
@ -118,19 +120,19 @@ struct bad_weak_ptr : ctl::exception
} }
}; };
// TODO(mrdomino): typename D = default_delete<T> template<typename T, typename D = default_delete<T>>
template<typename T>
class shared_ptr class shared_ptr
{ {
public: public:
using element_type = T; // TODO(mrdomino): remove extent? using element_type = T; // TODO(mrdomino): remove extent?
using deleter_type = D;
constexpr shared_ptr(nullptr_t = nullptr) noexcept : p(nullptr), rc(nullptr) constexpr shared_ptr(nullptr_t = nullptr) noexcept : p(nullptr), rc(nullptr)
{ {
} }
explicit shared_ptr(auto* const p) explicit shared_ptr(auto* const p)
: p(p), rc(__::shared_pointer<T>::make(p)) : p(p), rc(__::shared_pointer<T, D>::make(p, D()))
{ {
} }