nochnoikoshmar1

main.cpp

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