Advertisement
markyrocks

Simple SmartPointer demo

Aug 7th, 2021
224
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.10 KB | None | 0 0
  1. template <typename T>
  2. class SMARTPOINTER {
  3. public:
  4.     T* ptr;
  5. private: size_t size;
  6. public:
  7.     SMARTPOINTER() :size{1}{
  8.         ptr = new T[1];
  9.     }
  10.     SMARTPOINTER(size_t Size) {
  11.         ptr = new T[Size];
  12.         size = Size;
  13.     }
  14.     SMARTPOINTER(T* p, size_t Size) {
  15.         ptr = (T*)realloc(p, Size * sizeof(T));
  16.     }
  17.     SMARTPOINTER(SMARTPOINTER& s) {
  18.         this->copy(s);
  19.     }
  20.     ~SMARTPOINTER() {
  21.         delete[] ptr;
  22.     }
  23.     void resize(size_t Size) {
  24.         auto a = (T*)realloc(ptr, sizeof(T) * Size);
  25.         if (a) { ptr = a; }
  26.         size = Size;
  27.     }
  28.     T& operator[](size_t index) {
  29.         return ptr[index];
  30.     }
  31.     T& operator*() {
  32.         return *ptr;
  33.     }
  34.     bool operator==(T t) {
  35.         return *ptr == t ? true : false;
  36.     }
  37.     bool operator!=(T t) {
  38.         return *ptr != t ? true : false;
  39.     }
  40.     bool operator ==(T* t) {
  41.         return ptr == t ? true : false;
  42.     }
  43.     bool operator !=(T* t) {
  44.         return ptr != t ? true : false;
  45.     }
  46.     bool operator==(SMARTPOINTER& other) {
  47.         if (ptr == other.ptr) {
  48.             return true;
  49.         }
  50.         return false;
  51.     }
  52.     bool operator!=(SMARTPOINTER& other) {
  53.         if (ptr != other.ptr) {
  54.             return true;
  55.         }
  56.         return false;
  57.     }
  58.     void operator=(T* t) {
  59.         delete[] ptr;
  60.         ptr = t;
  61.     }
  62.     void operator=(SMARTPOINTER& other) {
  63.         this->copy(other);
  64.     }
  65.     void operator=(T t) {
  66.         *ptr = t;
  67.     }
  68.     friend ostream& operator<<(ostream& o, SMARTPOINTER& sp) {
  69.         for (auto i = 0; i < sp.Size(); i++) {
  70.             o << sp.ptr[i] << '\n';
  71.         }
  72.         return o;
  73.     }
  74.     size_t Size() {
  75.         return size;
  76.     }
  77.  
  78. private:
  79.  
  80.     void copy(SMARTPOINTER& s) {
  81.         this->resize(s.Size());
  82.         memcpy_s(ptr, size* sizeof(T), s.ptr, s.size*sizeof(T));
  83.     }
  84.     SMARTPOINTER& copy() {
  85.         SMARTPOINTER<T> s;
  86.         s.resize(size);
  87.         memcpy_s(s.ptr, s.size*sizeof(T), ptr, size*sizeof(T));
  88.         return s;
  89.     }
  90.  
  91. };
  92.  
  93. int main() {
  94.  
  95.     SMARTPOINTER<int> a;
  96.     SMARTPOINTER<int> b;
  97.     *a = 1;
  98.     a.resize(5);
  99.    
  100.     for (int i = 1; i < 5; i++) {
  101.         a[i] = i + 10;
  102.     }
  103.     b = a;
  104.     for (int i = 0; i < b.Size(); i++) {
  105.         cout << b[i] << "\n";
  106.     }
  107.     SMARTPOINTER<int> c;
  108.     int* d = new int[1];
  109.     *d = 8;
  110.     c = d;
  111.     cout << *c<<"\n";
  112.  
  113.     b.resize(20);
  114.     for (int i = 0; i < b.Size(); i++) {
  115.         b[i] = i + 25 + i * i;
  116.     }
  117.     cout << b;
  118. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement