Advertisement
avr39ripe

PV913RangeBasedForBasics

Jun 24th, 2020
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.85 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.  
  176. template <class ElementType, int size>
  177. class StaticArray
  178. {
  179.     ElementType arr[size];
  180. public:
  181.     StaticArray(const std::initializer_list<ElementType>& param)
  182.     {
  183.         std::cout << "WOW! std::initializer_list is here!\n";
  184.         int i{ 0 };
  185.  
  186.         for (const auto& elem : param)
  187.         {
  188.             //std::cout << elem << ' ';
  189.             arr[i++] = elem;
  190.         }
  191.         std::cout << '\n';
  192.  
  193.     };
  194.  
  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. template <class T>
  242. T max(T a, T b) { return a > b ? a : b; };
  243.  
  244. //std::initializer_list<int>
  245.  
  246. int main()
  247. {
  248.     const int arrSize{ 5 };
  249.     int arr[arrSize]{ 1,2,3,4,5 };
  250.  
  251.     //for (auto& a : arr)
  252.     //{
  253.     //    std::cout << ++a << '\t';
  254.     //}
  255.     //std::cout << '\n';
  256.  
  257.     const auto begin{ arr };
  258.     const auto end{ arr + arrSize };
  259.     for (auto elem{begin}; elem < end; ++elem)
  260.     {
  261.         std::cout << *elem << ' ';
  262.     }
  263.  
  264.     //for (const auto& a : arr)
  265.     //{
  266.     //    std::cout << a << '\t';
  267.     //}
  268.     //std::cout << '\n';
  269.     //return 0;
  270.  
  271.     const int arrSizeF{ 8 };
  272.     float arrFloat[arrSizeF]{ 0.1,0.2, 0.3,0.4,0.5,0.6, 0.7, 0.8 };
  273.    
  274.     printArr<int,arrSize>(arr);
  275.     printArr<float, arrSizeF>(arrFloat);
  276.  
  277.     StaticArray<int, arrSize> sArr{12,24,63,74,95};
  278.     printArr(sArr);
  279.  
  280.     for (const auto& elem : sArr)
  281.     {
  282.         std::cout << elem << ' ';
  283.     }
  284.  
  285.     //sArr.length();
  286. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement