template<class T>
class SharedPtr{
public:
SharedPtr()
: m_ptr(nullptr)
, m_count_(new size_t)
{
}
SharedPtr(T *ptr)
: m_ptr(ptr)
, m_count_(new size_t)
{
*m_count_ = 1;
}
~SharedPtr(){
--(*m_count_);
if(*m_count_ == 0){
delete m_ptr;
delete m_count_;
m_ptr = nullptr;
m_count_ = nullptr;
}
}
SharedPtr(const SharedPtr& ptr){
m_count_ = ptr.m_count_;
m_ptr = ptr.m_ptr;
++(*m_count_);
}
void operator=(const SharedPtr& ptr){
SharedPtr(std::move(ptr));
}
SharedPtr(SharedPtr && ptr)
: m_ptr(ptr.m_ptr)
, m_count_(ptr.m_count_)
{
++(*m_count_);
}
void operator=(SharedPtr && ptr){
SharedPtr(std::move(ptr));
}
T & operator*(){
return *m_ptr;
}
T* operator->(){
return m_ptr;
}
operator bool(){
return m_ptr == nullptr;
}
T *get(){
return m_ptr;
}
size_t use_count(){
return *m_count_ ;
}
bool unique(){
return *m_count_ == 1;
}
void swap(SharedPtr & ptr){
std::swap(*this, ptr);
}
private:
size_t *m_count_;
T *m_ptr;
};