Advertisement
Guest User

Untitled

a guest
Jan 20th, 2017
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.88 KB | None | 0 0
  1. #pragma once
  2.  
  3. #include <initializer_list>
  4.  
  5. template <typename T>
  6. class MyArray
  7. {
  8. public:
  9.  
  10.     explicit MyArray(size_t sz) {
  11.         head = new T[sz + reserved];
  12.         szUsed = sz;
  13.         szAll = szUsed + reserved;
  14.     }
  15.  
  16.     MyArray(std::initializer_list<T> l) : MyArray( l.size() ) {
  17.         for (int i = 0; i < l.size(); ++i ) {
  18.             *(head + i) = *(l.begin() + i);
  19.             std::cout << "elem (il constructor) " << *(head + i) << std::endl;
  20.         }
  21.     }
  22.  
  23.     MyArray(const MyArray& a) : MyArray(a.szUsed) {
  24.         for (int i = 0; i < a.szUsed; ++i) {
  25.             *(head + i) = *(a.head + i);
  26.             std::cout << "elem (copy constructor) " << *(head + i) << std::endl;
  27.         }
  28.     }
  29.  
  30.     ~MyArray() {
  31.         delete[] head;
  32.     }
  33.  
  34.     template<typename V>
  35.     void push(V&& val) {
  36.         if (szUsed == szAll) {         
  37.             ++szAll;
  38.             T* newHead = new T[szAll];
  39.             for (int i = 0; i < szAll - 1; ++i) {
  40.                 *(newHead + i) = std::move(*(head + i));
  41.             }
  42.             delete[] head;
  43.             head = newHead;
  44.         }
  45.        
  46.         *(head + szUsed) = std::forward<V>(val);
  47.         ++szUsed;
  48.  
  49.         std::cout << "elem " << *(head + szUsed - 1) << " pushed" << std::endl;
  50.     }
  51.  
  52.     T pop() {
  53.         if (szUsed) {
  54.             szUsed--;
  55.             std::cout << "elem " << *(head + szUsed) << " poped" << std::endl;
  56.  
  57.             return *(head + szUsed);
  58.         }
  59.         else
  60.             throw std::out_of_range("MyArray::pop - array is empty");
  61.     }
  62.  
  63.     auto operator=(const MyArray& a) {
  64.         if (szAll < a.szUsed) {
  65.             delete[] head;
  66.             szAll = a.szUsed;
  67.             head = new T[a.szUsed];
  68.         }
  69.  
  70.         szUsed = a.szUsed;
  71.        
  72.         for (int i = 0; i < szUsed; ++i) {
  73.             *(head + i) = *(a.head + i);
  74.         }
  75.     }
  76.  
  77.     auto operator=(MyArray&& a) {
  78.         if (szAll < a.szUsed) {
  79.             delete[] head;
  80.             szAll = a.szUsed;
  81.             head = new T[a.szUsed];
  82.         }
  83.  
  84.         szUsed = a.szUsed;
  85.  
  86.         for (int i = 0; i < szUsed; ++i) {
  87.             *(head + i) = std::move( *(a.head + i) );
  88.         }
  89.     }
  90.  
  91.  
  92. private:
  93.     static const size_t reserved = 10;
  94.  
  95.     T* head = nullptr;
  96.     size_t szAll = 0;
  97.     size_t szUsed = 0;
  98. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement