#pragma once
template<typename TR>
class joker_shared_ptr
{
private:
TR * ptr;
size_t * count;
public:
constexpr joker_shared_ptr(/* args */)noexcept{ }
constexpr joker_shared_ptr(std::nullptr_t )noexcept { }
explicit joker_shared_ptr(TR * ptr):ptr(ptr),count(new size_t(1)){ }
~joker_shared_ptr()
{
if(count != nullptr && (*count) > 1)
{
(*count) -- ;
return;
}
if(count != nullptr )
delete count;
if(ptr != nullptr )
delete ptr;
}
joker_shared_ptr(const joker_shared_ptr &other)noexcept:ptr(other.ptr),count(other.count)
{
if(count != nullptr)
{
(*count)++;
}
}
joker_shared_ptr& operator=(const joker_shared_ptr & other)noexcept
{
if (this->get() == other.get()) {
return *this;
}
if(count != nullptr)
{
(*count)--;
if(*count == 0)
{
delete count;
if(ptr != nullptr)
delete ptr;
}
}
count = other.count;
ptr = other.ptr;
if(count != nullptr && ptr != nullptr)
{
(*count)++;
}
return *this;
}
size_t use_count() const noexcept
{
if( count != nullptr)
{
return *count;
}
else
{
return 0;
}
}
TR* get()const noexcept
{
return ptr;
}
TR& operator*() const noexcept
{
return *ptr;
}
};
#if 0
template<typename TR>
joker_shared_ptr<TR>& joker_shared_ptr<TR>::operator=(const joker_shared_ptr & other)noexcept
{
if(count != nullptr)
{
(*count)--;
if(*count == 0)
{
delete count;
if(ptr != nullptr)
delete ptr;
}
}
count = other.count;
ptr = other.ptr;
if(count != nullptr && ptr != nullptr)
{
(*count)++;
}
return *this;
}
#endif