#ifndef INTRUSIVE_PTR_H
#define INTRUSIVE_PTR_H
#include <algorithm>
template<typename T>
class vs_intrusive_ptr {
private:
T *obj;
public:
vs_intrusive_ptr(T *ptr = nullptr, bool add_ref = false) noexcept {
obj = ptr;
if (add_ref && obj)
obj->add_ref();
}
vs_intrusive_ptr(const vs_intrusive_ptr &ptr) noexcept {
obj = ptr.obj;
if (obj)
obj->add_ref();
}
vs_intrusive_ptr(vs_intrusive_ptr &&ptr) noexcept {
obj = ptr.obj;
ptr.obj = nullptr;
}
~vs_intrusive_ptr() noexcept {
if (obj)
obj->release();
}
vs_intrusive_ptr &operator=(vs_intrusive_ptr const &ptr) noexcept {
if (obj)
obj->release();
obj = ptr.obj;
if (obj)
obj->add_ref();
return *this;
}
T *operator->() const noexcept {
return obj;
}
T &operator*() const noexcept {
return *obj;
}
operator bool() const noexcept {
return !!obj;
}
T *get() const noexcept {
return obj;
}
void reset() noexcept {
if (obj) {
obj->release();
obj = nullptr;
}
}
void swap(vs_intrusive_ptr &ptr) noexcept {
std::swap(obj, ptr.obj);
}
};
#endif