Advertisement
avr39ripe

Pv913DynArrayTemplateStart

Jun 17th, 2020
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.29 KB | None | 0 0
  1. #include <iostream>
  2. #include <chrono>
  3.  
  4.  
  5. class String
  6. {
  7.     char* str;
  8.     uint32_t size;
  9. public:
  10.     String(const char* strP)
  11.         : str{ new char[strlen(strP) + 1] }, size{ strlen(strP) }
  12.     {
  13.         strcpy_s(str, size + 1, strP);
  14.     };
  15.  
  16.     ~String() { delete[] str; };
  17.  
  18.     String& operator=(const char* strP)
  19.     {
  20.         delete[] str;
  21.         str = new char[strlen(strP) + 1];
  22.         size = strlen(strP);
  23.         strcpy_s(str, size + 1, strP);
  24.         return *this;
  25.     };
  26.  
  27.     friend std::ostream& operator<<(std::ostream& out, const String& rhs)
  28.     {
  29.         out << rhs.str;
  30.         return out;
  31.     }
  32. };
  33.  
  34.  
  35. class Number
  36. {
  37.     int num;
  38. public:
  39.     Number(int numP) : num{ numP } { std::cout << "Number constructed for " << this << " with value " << num << '\n'; }
  40.     Number() : Number{ 0 } {};
  41.     Number& operator=(const int rhs) { num = rhs; std::cout << "Number assigned for " << this << " with value " << num << '\n'; return *this; }
  42.     friend std::ostream& operator<<(std::ostream& out, const Number& rhs)
  43.     {
  44.         out << "Number: " << rhs.num;
  45.         return out;
  46.     }
  47.     ~Number() { std::cout << "Number destructed for " << this << " with value " << num << '\n'; };
  48. };
  49.  
  50. class TestNum
  51. {
  52.     Number num;
  53.     int _initNum(int max) { return rand() % max; };
  54. public:
  55.     TestNum() { num = _initNum(11);  std::cout << "TestNum constructed for " << this << '\n'; };
  56.     ~TestNum() { std::cout << "TestNum destructed for " << this << '\n'; }
  57. };
  58.  
  59. template <class ElementType>
  60. class DynArray
  61. {
  62.     ElementType* arr;
  63.     int size;
  64. public:
  65.     DynArray(int pSize) : arr{ new ElementType[pSize] {} }, size{ pSize } {std::cout << "DynArr constructed for " << size << " elements, for " << this << '\n'; };
  66.     DynArray() : DynArray(5) {};
  67.     //COPY
  68.     DynArray(const DynArray& obj);
  69.     DynArray& operator=(const DynArray& obj);
  70.     //MOVE
  71.     DynArray(DynArray&& obj);
  72.     DynArray& operator=(DynArray&& obj);
  73.  
  74.     const ElementType& getElem(int idx) const { return arr[idx]; };
  75.     void setElem(int idx, const ElementType& val) { arr[idx] = val; };
  76.  
  77.     ElementType& operator[](const int idx) { return arr[idx]; };
  78.     const ElementType& operator[](const int idx) const { return arr[idx]; };
  79.    
  80.     ElementType& operator[](const char idx) {return arr[toupper(idx) - 'A']; };
  81.     const ElementType& operator[](const char idx) const { return arr[toupper(idx) - 'A']; };
  82.  
  83.     void print();
  84.     void randomize();
  85.     ~DynArray()
  86.     {
  87.         if (arr)
  88.         {
  89.             std::cout << "this->arr = " << this->arr << '\n';
  90.             delete[] arr;
  91.         };
  92.         std::cout << "DynArr destructed for " << size << " elements, for " << this << '\n';
  93.     };
  94. };
  95.  
  96. template <class ElementType>
  97. void DynArray<ElementType>::print()
  98. {
  99.     for (int i{ 0 }; i < size and arr; ++i)
  100.     {
  101.         std::cout << arr[i] << ' ';
  102.     }
  103.     std::cout << '\n';
  104. }
  105.  
  106. template <class ElementType>
  107. void DynArray<ElementType>::randomize()
  108. {
  109.     for (int i{ 0 }; i < size; ++i)
  110.     {
  111.         arr[i] = rand() % 10;
  112.     }
  113. }
  114.  
  115. template <class ElementType>
  116. DynArray<ElementType>::DynArray(const DynArray<ElementType>& obj)
  117.     : arr{ new ElementType[obj.size] {} }, size{ obj.size }
  118. {
  119.     for (int i{ 0 }; i < size; ++i)
  120.     {
  121.         arr[i] = obj.arr[i];
  122.     };
  123.  
  124.     std::cout << "DynArr COPY constructed for " << size << " elements, for " << this << '\n';
  125. };
  126.  
  127.  
  128. template <class ElementType>
  129. DynArray<ElementType>::DynArray(DynArray<ElementType>&& obj)
  130.     : arr{ obj.arr }, size{ obj.size }
  131. {
  132.     obj.arr = nullptr;
  133.     obj.size = 0;
  134.  
  135.     std::cout << "DynArr MOVE constructed for " << size << " elements, for " << this << '\n';
  136. };
  137.  
  138. template <class ElementType>
  139. DynArray<ElementType>& DynArray<ElementType>::operator=(DynArray<ElementType>&& obj)
  140. {
  141.     if (this == &obj)
  142.     {
  143.         std::cout << "DynArr self assign in MOVE PREVENTED! for " << this << '\n';
  144.         return *this;
  145.     }
  146.  
  147.     delete[] arr;
  148.  
  149.     arr = obj.arr;
  150.     size = obj.size;
  151.  
  152.     obj.arr = nullptr;
  153.     obj.size = 0;
  154.  
  155.     std::cout << "DynArr MOVE assigned for " << size << " elements, for " << this << '\n';
  156.     return *this;
  157. };
  158.  
  159. template <class ElementType>
  160. void printDynArrEl(DynArray<ElementType>& arr, int idx)
  161. {
  162.     std::cout << arr.getElem(idx) << ' ';
  163. }
  164.  
  165. template <class ElementType>
  166. DynArray<ElementType> mkArray(int size)
  167. {
  168.     DynArray<ElementType> arrInternal{ size };
  169.     arrInternal.randomize();
  170.     return arrInternal;
  171. }
  172.  
  173. int max(int a, int b)
  174. {
  175.     return a > b ? a : b;
  176. }
  177.  
  178. void rvalDemo(int& num)
  179. {
  180.     std::cout << "L-Value version!!! " << num << '\n';
  181. }
  182.  
  183. void rvalDemo(int&& num)
  184. {
  185.     std::cout << "R-Value version!!! " << num << '\n';
  186. }
  187.  
  188. int main()
  189. {
  190.     DynArray<float> fArr{ 6 };
  191.     fArr[0] = 36.6;
  192.     fArr[1] = 37.0;
  193.     fArr[4] = 38.6;
  194.     fArr[5] = 42.0;
  195.     fArr.print();
  196.  
  197.     //DynArray<int> master{ 6 };
  198.     //master.randomize();
  199.     //master.print();
  200.  
  201.     //std::cout << '\n';
  202.     //    
  203.     //const DynArray<int> arr{ master };
  204.     //
  205.     //////arr.setElem(0, 11);
  206.     ////std::cout << arr.getElem(0) << '\n';
  207.     ////std::cout << arr[0] << '\n';
  208.  
  209.     ////arr[0] = 12;
  210.     //std::cout << arr[0] << '\n';
  211.     //std::cout << arr.getElem(0) << '\n';
  212.     //std::cout << arr['b'] << '\n';
  213.  
  214.     //return 0;
  215.    
  216. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement