Advertisement
avr39ripe

PV913NonTypeTemplateParam

Jun 23rd, 2020
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.05 KB | None | 0 0
  1. #include <iostream>
  2. #include <chrono>
  3.  
  4.  
  5.  
  6. class String
  7. {
  8.     char* str;
  9.     uint32_t size;
  10. public:
  11.     String(const char* strP)
  12.         : str{ new char[strlen(strP) + 1] }, size{ strlen(strP) }
  13.     {
  14.         strcpy_s(str, size + 1, strP);
  15.     };
  16.  
  17.     ~String() { delete[] str; };
  18.  
  19.     String& operator=(const char* strP)
  20.     {
  21.         delete[] str;
  22.         str = new char[strlen(strP) + 1];
  23.         size = strlen(strP);
  24.         strcpy_s(str, size + 1, strP);
  25.         return *this;
  26.     };
  27.  
  28.     friend std::ostream& operator<<(std::ostream& out, const String& rhs)
  29.     {
  30.         out << rhs.str;
  31.         return out;
  32.     }
  33. };
  34.  
  35.  
  36. class Number
  37. {
  38.     int num;
  39. public:
  40.     Number(int numP) : num{ numP } { std::cout << "Number constructed for " << this << " with value " << num << '\n'; }
  41.     Number() : Number{ 0 } {};
  42.     Number& operator=(const int rhs) { num = rhs; std::cout << "Number assigned for " << this << " with value " << num << '\n'; return *this; }
  43.     friend std::ostream& operator<<(std::ostream& out, const Number& rhs)
  44.     {
  45.         out << "Number: " << rhs.num;
  46.         return out;
  47.     }
  48.     ~Number() { std::cout << "Number destructed for " << this << " with value " << num << '\n'; };
  49. };
  50.  
  51. class TestNum
  52. {
  53.     Number num;
  54.     int _initNum(int max) { return rand() % max; };
  55. public:
  56.     TestNum() { num = _initNum(11);  std::cout << "TestNum constructed for " << this << '\n'; };
  57.     ~TestNum() { std::cout << "TestNum destructed for " << this << '\n'; }
  58. };
  59.  
  60. template <class ElementType>
  61. class DynArray
  62. {
  63.     ElementType* arr;
  64.     int size;
  65. public:
  66.     DynArray(int pSize) : arr{ new ElementType[pSize] {} }, size{ pSize } {std::cout << "DynArr constructed for " << size << " elements, for " << this << '\n'; };
  67.     DynArray() : DynArray(5) {};
  68.     //COPY
  69.     DynArray(const DynArray& obj);
  70.     DynArray& operator=(const DynArray& obj);
  71.     //MOVE
  72.     DynArray(DynArray&& obj);
  73.     DynArray& operator=(DynArray&& obj);
  74.  
  75.     const ElementType& getElem(int idx) const { return arr[idx]; };
  76.     void setElem(int idx, const ElementType& val) { arr[idx] = val; };
  77.  
  78.     ElementType& operator[](const int idx) { return arr[idx]; };
  79.     const ElementType& operator[](const int idx) const { return arr[idx]; };
  80.  
  81.     ElementType& operator[](const char idx) { return arr[toupper(idx) - 'A']; };
  82.     const ElementType& operator[](const char idx) const { return arr[toupper(idx) - 'A']; };
  83.  
  84.     void print();
  85.     void randomize();
  86.     ~DynArray()
  87.     {
  88.         if (arr)
  89.         {
  90.             std::cout << "this->arr = " << this->arr << '\n';
  91.             delete[] arr;
  92.         };
  93.         std::cout << "DynArr destructed for " << size << " elements, for " << this << '\n';
  94.     };
  95. };
  96.  
  97. template <class ElementType>
  98. void DynArray<ElementType>::print()
  99. {
  100.     for (int i{ 0 }; i < size and arr; ++i)
  101.     {
  102.         std::cout << arr[i] << ' ';
  103.     }
  104.     std::cout << '\n';
  105. }
  106.  
  107. template <class ElementType>
  108. void DynArray<ElementType>::randomize()
  109. {
  110.     for (int i{ 0 }; i < size; ++i)
  111.     {
  112.         arr[i] = rand() % 10;
  113.     }
  114. }
  115.  
  116.  
  117. template <class ElementType>
  118. DynArray<ElementType>::DynArray(const DynArray<ElementType>& obj)
  119.     : arr{ new ElementType[obj.size] {} }, size{ obj.size }
  120. {
  121.     for (int i{ 0 }; i < size; ++i)
  122.     {
  123.         arr[i] = obj.arr[i];
  124.     };
  125.  
  126.     std::cout << "DynArr COPY constructed for " << size << " elements, for " << this << '\n';
  127. };
  128.  
  129.  
  130. template <class ElementType>
  131. DynArray<ElementType>::DynArray(DynArray<ElementType>&& obj)
  132.     : arr{ obj.arr }, size{ obj.size }
  133. {
  134.     obj.arr = nullptr;
  135.     obj.size = 0;
  136.  
  137.     std::cout << "DynArr MOVE constructed for " << size << " elements, for " << this << '\n';
  138. };
  139.  
  140. template <class ElementType>
  141. DynArray<ElementType>& DynArray<ElementType>::operator=(DynArray<ElementType>&& obj)
  142. {
  143.     if (this == &obj)
  144.     {
  145.         std::cout << "DynArr self assign in MOVE PREVENTED! for " << this << '\n';
  146.         return *this;
  147.     }
  148.  
  149.     delete[] arr;
  150.  
  151.     arr = obj.arr;
  152.     size = obj.size;
  153.  
  154.     obj.arr = nullptr;
  155.     obj.size = 0;
  156.  
  157.     std::cout << "DynArr MOVE assigned for " << size << " elements, for " << this << '\n';
  158.     return *this;
  159. };
  160.  
  161. template <class ElementType>
  162. void printDynArrEl(DynArray<ElementType>& arr, int idx)
  163. {
  164.     std::cout << arr.getElem(idx) << ' ';
  165. }
  166.  
  167. template <class ElementType>
  168. DynArray<ElementType> mkArray(int size)
  169. {
  170.     DynArray<ElementType> arrInternal{ size };
  171.     arrInternal.randomize();
  172.     return arrInternal;
  173. }
  174.  
  175. int max(int a, int b)
  176. {
  177.     return a > b ? a : b;
  178. }
  179.  
  180. void rvalDemo(int& num)
  181. {
  182.     std::cout << "L-Value version!!! " << num << '\n';
  183. }
  184.  
  185. void rvalDemo(int&& num)
  186. {
  187.     std::cout << "R-Value version!!! " << num << '\n';
  188. }
  189.  
  190. template <class ElementType, int size>
  191. class StaticArray
  192. {
  193.     ElementType arr[size];
  194. public:
  195.     ElementType& operator[](const int idx) { return arr[idx]; }
  196.     const ElementType& operator[](const int idx)const { return arr[idx]; }
  197.     ElementType& at(const int idx)
  198.     {
  199.         if ((idx >= 0) and (idx < size))
  200.         {
  201.             return arr[idx];
  202.         }
  203.         std::cout << "Index " << idx << " is out of range 0.." << size;
  204.         exit(0);
  205.     };
  206.  
  207.     int length() const { return size; };
  208.     ElementType* getRawData() { return arr; };
  209. };
  210.  
  211. //template <typename T>
  212. //void printArr(T* arr, int size)
  213. //{
  214. //    for (int i{ 0 }; i < size; ++i)
  215. //    {
  216. //        std::cout << arr[i] << ' ';
  217. //    }
  218. //    std::cout << '\n';
  219. //}
  220.  
  221. template <typename T, int size>
  222. void printArr(T* arr)
  223. {
  224.     for (int i{ 0 }; i < size; ++i)
  225.     {
  226.         std::cout << arr[i] << ' ';
  227.     }
  228.     std::cout << '\n';
  229. }
  230.  
  231. template <typename T, int size>
  232. void printArr(const StaticArray<T, size>& arr)
  233. {
  234.     for (int i{ 0 }; i < arr.length(); ++i)
  235.     {
  236.         std::cout << arr[i] << ' ';
  237.     }
  238.     std::cout << '\n';
  239. }
  240.  
  241. int main()
  242. {
  243.     const int arrSize{ 5 };
  244.     int arr[arrSize]{1,2,3,4,5};
  245.  
  246.     const int arrSizeF{ 8 };
  247.     float arrFloat[arrSizeF]{ 0.1,0.2, 0.3,0.4,0.5,0.6, 0.7, 0.8 };
  248.  
  249.     printArr<int, arrSize>(arr);
  250.     printArr<float, arrSizeF>(arrFloat);
  251.    
  252.     StaticArray<int, arrSize> sArr{};
  253.  
  254.    
  255.     StaticArray<int, 5> sArr1{};
  256.     StaticArray<char, 30> sArr2{};
  257.  
  258.     printArr(sArr);
  259.  
  260.     //sArr.length();
  261.  
  262.  
  263.  
  264.     //char* name1{ new char[14]{"Sasha"} };
  265.     //char* name2{ name1 };
  266.     //name1 = nullptr;
  267.  
  268.  
  269.     //strcpy_s(name2, 14, name1);
  270.  
  271.     //delete[] name1;
  272.  
  273.     //std::cout << name2 << '\n';
  274.  
  275.     //return 0;
  276.  
  277.     //DynArray<float> fArr{ 6 };
  278.     //fArr[0] = 36.6;
  279.     //fArr[1] = 37.0;
  280.     //fArr[4] = 38.6;
  281.     //fArr[5] = 42.0;
  282.     //fArr.print();
  283.  
  284.     //DynArray<int> master{ 6 };
  285.     //master.randomize();
  286.     //master.print();
  287.  
  288.     //std::cout << '\n';
  289.     //    
  290.     //const DynArray<int> arr{ master };
  291.     //
  292.     //////arr.setElem(0, 11);
  293.     ////std::cout << arr.getElem(0) << '\n';
  294.     ////std::cout << arr[0] << '\n';
  295.  
  296.     ////arr[0] = 12;
  297.     //std::cout << arr[0] << '\n';
  298.     //std::cout << arr.getElem(0) << '\n';
  299.     //std::cout << arr['b'] << '\n';
  300.  
  301.     //return 0;
  302.  
  303. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement