nochnoikoshmar1

Untitled

May 23rd, 2023
137
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.23 KB | None | 0 0
  1. #include "simple_vector.h"
  2. using namespace std;
  3.  
  4. class X {
  5. public:
  6.     X()
  7.         : X(5) {
  8.     }
  9.     X(size_t num)
  10.         : x_(num) {
  11.     }
  12.     X(const X& other) = delete;
  13.     X& operator=(const X& other) = delete;
  14.     X(X&& other) {
  15.         x_ = exchange(other.x_, 0);
  16.     }
  17.     X& operator=(X&& other) {
  18.         x_ = exchange(other.x_, 0);
  19.         return *this;
  20.     }
  21.     size_t GetX() const {
  22.         return x_;
  23.     }
  24.  
  25. private:
  26.     size_t x_;
  27. };
  28.  
  29. SimpleVector<int> GenerateVector(size_t size) {
  30.     SimpleVector<int> v(size);
  31.     iota(v.begin(), v.end(), 1);
  32.     return v;
  33. }
  34.  
  35. void TestTemporaryObjConstructor() {
  36.     const size_t size = 1000000;
  37.     cout << "Test with temporary object, copy elision" << endl;
  38.     SimpleVector<int> moved_vector(GenerateVector(size));
  39.     assert(moved_vector.GetSize() == size);
  40.     cout << "Done!" << endl << endl;
  41. }
  42.  
  43. void TestTemporaryObjOperator() {
  44.     const size_t size = 1000000;
  45.     cout << "Test with temporary object, operator=" << endl;
  46.     SimpleVector<int> moved_vector;
  47.     assert(moved_vector.GetSize() == 0);
  48.     moved_vector = GenerateVector(size);
  49.     assert(moved_vector.GetSize() == size);
  50.     cout << "Done!" << endl << endl;
  51. }
  52.  
  53. void TestNamedMoveConstructor() {
  54.     const size_t size = 1000000;
  55.     cout << "Test with named object, move constructor" << endl;
  56.     SimpleVector<int> vector_to_move(GenerateVector(size));
  57.     assert(vector_to_move.GetSize() == size);
  58.  
  59.     SimpleVector<int> moved_vector(move(vector_to_move));
  60.     assert(moved_vector.GetSize() == size);
  61.     assert(vector_to_move.GetSize() == 0);
  62.     cout << "Done!" << endl << endl;
  63. }
  64.  
  65. void TestNamedMoveOperator() {
  66.     const size_t size = 1000000;
  67.     cout << "Test with named object, operator=" << endl;
  68.     SimpleVector<int> vector_to_move(GenerateVector(size));
  69.     assert(vector_to_move.GetSize() == size);
  70.  
  71.     SimpleVector<int> moved_vector = move(vector_to_move);
  72.     assert(moved_vector.GetSize() == size);
  73.     assert(vector_to_move.GetSize() == 0);
  74.     cout << "Done!" << endl << endl;
  75. }
  76.  
  77. void TestNoncopiableMoveConstructor() {
  78.     const size_t size = 5;
  79.     cout << "Test noncopiable object, move constructor" << endl;
  80.     SimpleVector<X> vector_to_move;
  81.     for (size_t i = 0; i < size; ++i) {
  82.         vector_to_move.PushBack(X(i));
  83.     }
  84.  
  85.     SimpleVector<X> moved_vector = move(vector_to_move);
  86.     assert(moved_vector.GetSize() == size);
  87.     assert(vector_to_move.GetSize() == 0);
  88.  
  89.     for (size_t i = 0; i < size; ++i) {
  90.         assert(moved_vector[i].GetX() == i);
  91.     }
  92.     cout << "Done!" << endl << endl;
  93. }
  94.  
  95. void TestNoncopiablePushBack() {
  96.     const size_t size = 5;
  97.     cout << "Test noncopiable push back" << endl;
  98.     SimpleVector<X> v;
  99.     for (size_t i = 0; i < size; ++i) {
  100.         v.PushBack(X(i));
  101.     }
  102.  
  103.     assert(v.GetSize() == size);
  104.  
  105.     for (size_t i = 0; i < size; ++i) {
  106.         assert(v[i].GetX() == i);
  107.     }
  108.     cout << "Done!" << endl << endl;
  109. }
  110.  
  111. void TestNoncopiableInsert() {
  112.     const size_t size = 5;
  113.     cout << "Test noncopiable insert" << endl;
  114.     SimpleVector<X> v;
  115.     for (size_t i = 0; i < size; ++i) {
  116.         v.PushBack(X(i));
  117.     }
  118.  
  119.     // в начало
  120.     v.Insert(v.begin(), X(size + 1));
  121.     assert(v.GetSize() == size + 1);
  122.     assert(v.begin()->GetX() == size + 1);
  123.     // в конец
  124.     v.Insert(v.end(), X(size + 2));
  125.     assert(v.GetSize() == size + 2);
  126.     assert((v.end() - 1)->GetX() == size + 2);
  127.     // в середину
  128.     v.Insert(v.begin() + 3, X(size + 3));
  129.     assert(v.GetSize() == size + 3);
  130.     assert((v.begin() + 3)->GetX() == size + 3);
  131.     cout << "Done!" << endl << endl;
  132. }
  133.  
  134. void TestNoncopiableErase() {
  135.     const size_t size = 3;
  136.     cout << "Test noncopiable erase" << endl;
  137.     SimpleVector<X> v;
  138.     for (size_t i = 0; i < size; ++i) {
  139.         v.PushBack(X(i));
  140.     }
  141.  
  142.     auto it = v.Erase(v.begin());
  143.     assert(it->GetX() == 1);
  144.     cout << "Done!" << endl << endl;
  145. }
  146.  
  147. int main() {
  148.     TestTemporaryObjConstructor();
  149.     TestTemporaryObjOperator();
  150.     TestNamedMoveConstructor();
  151.     TestNamedMoveOperator();
  152.     TestNoncopiableMoveConstructor();
  153.     TestNoncopiablePushBack();
  154.     TestNoncopiableInsert();
  155.     TestNoncopiableErase();
  156.     return 0;
  157. }
Tags: main.cpp
Advertisement
Add Comment
Please, Sign In to add comment