Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- template<typename T>
- class SharedPtr {
- T * p;
- int *cnt;
- public:
- SharedPtr() {
- p = nullptr;
- }
- SharedPtr(T * other) {
- p = other;
- cnt = new int;
- *cnt = 1;
- }
- SharedPtr(const SharedPtr& other) {
- p = other.p;
- cnt = other.cnt;
- ++(*cnt);
- }
- SharedPtr(SharedPtr&& other) {
- p = std::move(other.p);
- other.p = nullptr;
- cnt = std::move(other.cnt);
- other.cnt = nullptr;
- }
- SharedPtr& operator = (T * other) {
- T* d = p;
- if (p != nullptr) {
- *(--cnt);
- }
- p = other;
- cnt = new int;
- *cnt = 1;
- if (d != nullptr) {
- delete d;
- }
- return *this;
- }
- SharedPtr& operator = (const SharedPtr& other) {
- T* d = p;
- if (p != nullptr) {
- *(--cnt);
- }
- p = other.p;
- cnt = other.cnt;
- ++(*cnt);
- if (d != nullptr) {
- delete d;
- }
- return *this;
- }
- SharedPtr& operator = (SharedPtr&& other) {
- T* d = p;
- if (p != nullptr) {
- *(--cnt);
- }
- p = std::move(other.p);
- cnt = std::move(other.cnt);
- other.p = nullptr;
- other.cnt = nullptr;
- if (d != nullptr) {
- delete d;
- }
- return *this;
- }
- ~SharedPtr() {
- if (p != nullptr) {
- *(--cnt);
- if (cnt == 0) {
- delete p;
- }
- }
- }
- T& operator * () const {
- return *p;
- }
- T& operator * () {
- return *p;
- }
- T* operator -> () const {
- return p;
- }
- void reset(T* other) {
- T* d = p;
- if (p != nullptr) {
- *(--cnt);
- }
- p = other;
- cnt = new int;
- *cnt = 1;
- if (d != nullptr) {
- delete d;
- }
- }
- void swap(SharedPtr& other) {
- std::swap(p, other.p);
- std::swap(cnt, other.cnt);
- }
- T* get() const {
- return p;
- }
- explicit operator bool() const {
- if (p != nullptr) {
- return true;
- }
- return false;
- }
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement