mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-08-04 08:50:27 +00:00
wip deleter
This commit is contained in:
parent
df00ae1bca
commit
507ecaa09a
1 changed files with 10 additions and 8 deletions
|
@ -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()))
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue