avr39-ripe

moveSemantics

Dec 2nd, 2019
230
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.51 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. #define NOTHING 0
  4. #define MOVE    1
  5. #define DEEP_COPY   2
  6. #define MOVE_RVAL   3
  7.  
  8. #define METHOD NOTHING
  9.  
  10. class Entity
  11. {
  12.     int num;
  13. public:
  14.     Entity(int n = 0)  : num{n} { std::cout << "Entity constructed\n";};
  15.     ~Entity() {std::cout << "Entity destructed\n";}
  16.     void print() { std::cout << "Entity = " << num << "\n";};
  17. };
  18.  
  19. class SmartPtr
  20. {
  21.     Entity* ptr;
  22. public:
  23.     SmartPtr(Entity* eptr = nullptr) : ptr{eptr} {};
  24. #if METHOD == MOVE
  25.     SmartPtr(SmartPtr& sPtr);
  26.     SmartPtr& operator=(SmartPtr& sPtr);
  27. #endif
  28. #if METHOD == MOVE_RVAL
  29.     SmartPtr(SmartPtr&& sPtr);
  30.     SmartPtr& operator=(SmartPtr&& sPtr);
  31. #endif
  32. #if METHOD == DEEP_COPY
  33.     SmartPtr(const SmartPtr& sPtr);
  34.     SmartPtr& operator=(const SmartPtr& sPtr);
  35. #endif
  36.     Entity& operator*() {return *ptr;};
  37.     Entity* operator->() {return ptr;};
  38.     bool isEmpty() { return ptr == nullptr;};
  39.     ~SmartPtr() { delete ptr; };
  40. };
  41.  
  42. #if METHOD == MOVE
  43. SmartPtr::SmartPtr(SmartPtr& sPtr) // Move
  44. : ptr{sPtr.ptr}
  45. {
  46.     sPtr.ptr = nullptr;
  47. }
  48.  
  49. SmartPtr& SmartPtr::operator =(SmartPtr& sPtr) // Move
  50. {
  51.     if ( this == &sPtr) { return *this; };
  52.  
  53.     delete ptr;
  54.     ptr = sPtr.ptr;
  55.     sPtr.ptr = nullptr;
  56.  
  57.     return *this;
  58. }
  59. #endif
  60.  
  61. #if METHOD == MOVE_RVAL
  62. SmartPtr::SmartPtr(SmartPtr&& sPtr) // Move rvalue
  63. : ptr{sPtr.ptr}
  64. {
  65.     sPtr.ptr = nullptr;
  66. }
  67.  
  68. SmartPtr& SmartPtr::operator =(SmartPtr&& sPtr) // Move rvalue
  69. {
  70.     if ( this == &sPtr) { return *this; };
  71.  
  72.     delete ptr;
  73.     ptr = sPtr.ptr;
  74.     sPtr.ptr = nullptr;
  75.  
  76.     return *this;
  77. }
  78. #endif
  79.  
  80. #if METHOD == DEEP_COPY
  81. SmartPtr::SmartPtr(const SmartPtr& sPtr) // Deep copy
  82. : ptr{new Entity}
  83. {
  84.     *ptr = *sPtr.ptr;
  85. }
  86.  
  87. SmartPtr& SmartPtr::operator =(const SmartPtr& sPtr) // Deep copy
  88. {
  89.     if ( this == &sPtr) { return *this; };
  90.  
  91.     delete ptr;
  92.     ptr = new Entity;
  93.     *ptr = *sPtr.ptr;
  94.  
  95.     return *this;
  96. }
  97. #endif
  98.  
  99. SmartPtr generateEntity()
  100. {
  101.     SmartPtr sPtr{new Entity{33}};
  102.     return sPtr;
  103. }
  104.  
  105. int main()
  106. {
  107.     SmartPtr ePtr{new Entity{42}};
  108.     ePtr->print();
  109.     std::cout <<"ePtr.isEmpty: " << ePtr.isEmpty() << '\n';
  110.  
  111. #if METHOD == DEEP_COPY || METHOD == MOVE || METHOD == NOTHING
  112.     SmartPtr ePtr1{ePtr};
  113.     ePtr1->print();
  114.     std::cout <<"ePtr.isEmpty: " << ePtr.isEmpty() << '\n';
  115. #endif
  116.  
  117. #if METHOD == MOVE_RVAL
  118.     SmartPtr ePtr1{std::move(ePtr)};
  119.     ePtr1->print();
  120.     std::cout <<"ePtr.isEmpty: " << ePtr.isEmpty() << '\n';
  121. #endif
  122.  
  123. #if METHOD == MOVE || METHOD == DEEP_COPY || METHOD == MOVE_RVAL
  124.     SmartPtr ePtr2 = generateEntity();
  125.     ePtr2->print();
  126.     std::cout <<"ePtr2.isEmpty: " << ePtr2.isEmpty() << '\n';
  127. #endif
  128.  
  129. }
Advertisement
Add Comment
Please, Sign In to add comment