Advertisement
avr39ripe

PV913AdvancedTemplating

Jun 24th, 2020
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.68 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. template <class ElementType, int size>
  176. class StaticArray
  177. {
  178.     ElementType arr[size]{};
  179. public:
  180.     StaticArray() = default;
  181.     explicit StaticArray(const std::initializer_list<ElementType>& param)
  182.     {
  183.         int i{ 0 };
  184.  
  185.         for (const auto& elem : param)
  186.         {
  187.             if (i < size)
  188.             {
  189.                 arr[i++] = elem;
  190.             }
  191.             else
  192.             {
  193.                 std::cout << "Error! Overinitialisation prevented! :)\n";
  194.                 break;
  195.             }
  196.         }
  197.     };
  198.  
  199.     void operator=(const std::initializer_list<ElementType>& param)
  200.     {
  201.         int i{ 0 };
  202.         int shift{ -1 };
  203.         for (const auto& elem : param)
  204.         {
  205.             if (shift == -1)
  206.             {
  207.                 shift = elem;
  208.                 continue;
  209.             }
  210.  
  211.             if (i+shift < size)
  212.             {
  213.                 arr[shift + i++] = elem;
  214.             }
  215.             else
  216.             {
  217.                 std::cout << "Error! Overassigment prevented! :)\n";
  218.                 break;
  219.             }
  220.         }
  221.     };
  222.     ElementType& operator[](const int idx) { return arr[idx]; }
  223.     const ElementType& operator[](const int idx)const { return arr[idx]; }
  224.     const ElementType* begin() { return arr; };
  225.     const ElementType* end() { return arr + size; };
  226.     ElementType& at(const int idx)
  227.     {
  228.         if ((idx >= 0) and (idx < size))
  229.         {
  230.             return arr[idx];
  231.         }
  232.         std::cout << "Index " << idx << " is out of range 0.." << size;
  233.         exit(0);
  234.     };
  235.  
  236.     int length() const { return size; };
  237.     ElementType* getRawData() { return arr; };
  238. };
  239.  
  240. //template <typename T>
  241. //void printArr(T* arr, int size)
  242. //{
  243. //    for (int i{ 0 }; i < size; ++i)
  244. //    {
  245. //        std::cout << arr[i] << ' ';
  246. //    }
  247. //    std::cout << '\n';
  248. //}
  249.  
  250. template <typename T, int size>
  251. void printArr(T* arr)
  252. {
  253.     for (int i{ 0 }; i < size; ++i)
  254.     {
  255.         std::cout << arr[i] << ' ';
  256.     }
  257.     std::cout << '\n';
  258. }
  259.  
  260. template <typename T, int size>
  261. void printArr(const StaticArray<T, size>& arr)
  262. {
  263.     for (int i{ 0 }; i < arr.length(); ++i)
  264.     {
  265.         std::cout << arr[i] << ' ';
  266.     }
  267.     std::cout << '\n';
  268. }
  269.  
  270. template <int size>
  271. void printArr(const StaticArray<char, size>& arr)
  272. {
  273.     for (int i{ 0 }; i < arr.length(); ++i)
  274.     {
  275.         std::cout << arr[i];
  276.     }
  277.     std::cout << '\n';
  278. }
  279.  
  280. template <typename T>
  281. void printArr(const StaticArray<T, 3>& arr)
  282. {
  283.     std::cout << "Three element array! Small one!\n";
  284.     for (int i{ 0 }; i < arr.length(); ++i)
  285.     {
  286.         std::cout << arr[i] << '\t';
  287.     }
  288.     std::cout << '\n';
  289. }
  290.  
  291. template <class T>
  292. T max(T a, T b) { return a > b ? a : b; };
  293.  
  294. //std::initializer_list<int>
  295.  
  296. int main()
  297. {
  298.     const int arrSize{ 5 };
  299.     int arr[arrSize]{ 1,2,3,4,5 };
  300.     //for (auto& a : arr)
  301.     //{
  302.     //    std::cout << ++a << '\t';
  303.     //}
  304.     //std::cout << '\n';
  305.  
  306.     /*const auto begin{ arr };
  307.     const auto end{ arr + arrSize };
  308.     for (auto elem{begin}; elem < end; ++elem)
  309.     {
  310.         std::cout << *elem << ' ';
  311.     }
  312.     return 0;*/
  313.     //for (const auto& a : arr)
  314.     //{
  315.     //    std::cout << a << '\t';
  316.     //}
  317.     //std::cout << '\n';
  318.     //return 0;
  319.  
  320.     const int arrSizeF{ 8 };
  321.     float arrFloat[arrSizeF]{ 0.1,0.2, 0.3,0.4,0.5,0.6, 0.7, 0.8 };
  322.    
  323.     printArr<int,arrSize>(arr);
  324.     printArr<float, arrSizeF>(arrFloat);
  325.  
  326.     StaticArray<int, arrSize> sArr{12,24,63,74};
  327.     //StaticArray<int, arrSize> sArr;
  328.          
  329.     printArr(sArr);
  330.  
  331.     std::cout << "\nRange-based for goes here...\n";
  332.  
  333.     for (const auto& elem : sArr)
  334.     {
  335.         std::cout << elem << ' ';
  336.     }
  337.  
  338.     std::cout << "\nMagic goes here...\n";
  339.     sArr = { 2, 99,910,911 };
  340.    
  341.    
  342.     for (const auto& elem : sArr)
  343.     {
  344.         std::cout << elem << ' ';
  345.     }
  346.  
  347.     std::cout << '\n';
  348.  
  349.     const int strSize{ 14 };
  350.     StaticArray<char, strSize> str{ 'H', 'e', 'l', 'l', 'o', ' ', 'w','o','r','l','d','!' };
  351.     printArr(str);
  352.  
  353.     const int strSize1{ 3 };
  354.     StaticArray<char, strSize1> str1{ 'A', 'B', 'C' };
  355.     printArr<char>(str1);
  356.  
  357.     StaticArray<int, strSize1> arr1{ 88,99,77 };
  358.     printArr(arr1);
  359.  
  360.     //sArr.length();
  361.  
  362. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement