Advertisement
Guest User

Untitled

a guest
Oct 19th, 2019
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.25 KB | None | 0 0
  1.  
  2. template <typename T>
  3. class SharedPtr {
  4. private:
  5. T* data;
  6. int* count;
  7.  
  8. public:
  9. SharedPtr() : data(nullptr), count(new int(0)) {
  10. }
  11.  
  12. SharedPtr(T* ptr) : data(ptr), count(new int(1)) {
  13. }
  14.  
  15. SharedPtr(const SharedPtr& other)
  16. : data(other.data), count(other.count) {
  17. (*count)++;
  18. }
  19.  
  20. SharedPtr(SharedPtr&& other)
  21. : data(other.data), count(other.count) {
  22. }
  23.  
  24. SharedPtr& operator=(const SharedPtr& other) {
  25. if (data != other.data) {
  26. (*count)--;
  27. if (*count == 0) {
  28. delete data;
  29. delete count;
  30. }
  31. data = other.data;
  32. count = other.count;
  33. (*count)++;
  34. }
  35. return *this;
  36. }
  37.  
  38. SharedPtr& operator=(T* other) {
  39. if (data != other) {
  40. (*count)--;
  41. if (*count == 0) {
  42. delete data;
  43. delete count;
  44. }
  45. data = other.data;
  46. count = new int(0);
  47. (*count)++;
  48. }
  49. return *this;
  50. }
  51.  
  52. SharedPtr& operator=(SharedPtr&& other) {
  53. if (data != other.data) {
  54. (*count)--;
  55. if (*count == 0) {
  56. delete data;
  57. delete count;
  58. }
  59. data = other.data;
  60. count = other.count;
  61. other.data = nullptr;
  62. other.count = nullptr;
  63. }
  64. return *this;
  65. }
  66.  
  67. T* get() const noexcept {
  68. return data;
  69. }
  70.  
  71. ~SharedPtr() {
  72. (*count)--;
  73. if ((*count) == 0) {
  74. delete count;
  75. delete data;
  76. }
  77. }
  78.  
  79. T& operator*() const {
  80. return *data;
  81. }
  82.  
  83. T& operator*() {
  84. return *data;
  85. }
  86.  
  87. T* operator->() const {
  88. return data;
  89. }
  90.  
  91. void reset(T* ptr) {
  92. (*count--);
  93. if ((*count) == 0) {
  94. delete data;
  95. delete count;
  96. }
  97. count = new int(1);
  98. data = ptr;
  99. }
  100.  
  101. void swap(SharedPtr& other) {
  102. std::swap(data, other.data);
  103. std::swap(count, other.count);
  104. }
  105.  
  106. explicit operator bool() const {
  107. return data != nullptr;
  108. }
  109. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement