Guest User

Untitled

a guest
Jun 18th, 2018
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.09 KB | None | 0 0
  1. template<class T>
  2. class Reference {
  3. T* _pointer;
  4. size_t _count;
  5.  
  6. public:
  7.  
  8. Reference(T* pointer) {
  9. pointer = pointer;
  10. _count = 1;
  11. }
  12.  
  13. ~Reference() {
  14. delete _pointer;
  15. }
  16.  
  17. void retain() {
  18. _count++;
  19. }
  20.  
  21. bool release() {
  22. _count--;
  23. return _count == 0;
  24. }
  25.  
  26. size_t count() {
  27. return _count;
  28. }
  29.  
  30. };
  31.  
  32.  
  33. template <class T>
  34. class StrongPointer {
  35. Reference<T>* _reference;
  36.  
  37. public:
  38. StrongPointer() {
  39. _reference = NULL;
  40. }
  41.  
  42. StrongPointer(T* pointer) {
  43. _reference = new Reference<T>(pointer);
  44. }
  45.  
  46. ~StrongPointer() {
  47. release();
  48. }
  49.  
  50. void operator=(const StrongPointer<T>& other) {
  51. assert(_reference != other._reference);
  52.  
  53. release();
  54.  
  55. _reference = other._reference;
  56. _reference->retain();
  57. }
  58.  
  59. void operator=(T* pointer) {
  60. release();
  61. _reference = new Reference<T>(pointer);
  62. }
  63.  
  64. void release() {
  65. if (_reference && _reference->release()) {
  66. delete _reference;
  67. _reference = NULL;
  68. }
  69. }
  70.  
  71. };
Add Comment
Please, Sign In to add comment