Advertisement
pavel_777

array_ptr.h

Oct 31st, 2023
426
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.83 KB | None | 0 0
  1. #pragma once
  2.  
  3. #include <cstdlib>
  4. #include <vector>
  5.  
  6. template <typename Type>
  7. class ArrayPtr
  8. {
  9. public:
  10.     // Инициализирует ArrayPtr нулевым указателем
  11.     ArrayPtr() = default;
  12.  
  13.     // Создаёт в куче массив из size элементов типа Type.
  14.     // Если size == 0, поле raw_ptr_ должно быть равно nullptr
  15.     explicit ArrayPtr(size_t size) {
  16.         if (size) {raw_ptr_ = new Type[size];}
  17.     }
  18.  
  19.     // Конструктор из сырого указателя, хранящего адрес массива в куче либо nullptr
  20.     explicit ArrayPtr(Type* raw_ptr) noexcept
  21.         : raw_ptr_(raw_ptr){
  22.     }
  23.  
  24.     // Запрещаем копирование
  25.     ArrayPtr(const ArrayPtr&) = delete;
  26.  
  27.     ArrayPtr(ArrayPtr &&other)
  28.     {
  29.         raw_ptr_ = other.raw_ptr_;
  30.         other.raw_ptr_ = nullptr;
  31.     }
  32.  
  33.     ~ArrayPtr() {
  34.         delete[] raw_ptr_;
  35.     }
  36.  
  37.     // Запрещаем присваивание
  38.     ArrayPtr& operator=(const ArrayPtr&) = delete;
  39.  
  40.     ArrayPtr &operator=(ArrayPtr &&other)
  41.     {
  42.         if (this == &other)
  43.         {
  44.             return *this;
  45.         }
  46.  
  47.         delete[] raw_ptr_;
  48.         raw_ptr_ = other.raw_ptr_;
  49.         other.raw_ptr_ = nullptr;
  50.         return *this;
  51.     }
  52.  
  53.     // Прекращает владением массивом в памяти, возвращает значение адреса массива
  54.     // После вызова метода указатель на массив должен обнулиться
  55.     [[nodiscard]] Type* Release() noexcept {
  56.         auto* temp = raw_ptr_;
  57.         raw_ptr_ = nullptr;
  58.         return temp;
  59.     }
  60.  
  61.     // Возвращает ссылку на элемент массива с индексом index
  62.     Type& operator[](size_t index) noexcept {
  63.         return *(raw_ptr_ + index);
  64.     }
  65.  
  66.     // Возвращает константную ссылку на элемент массива с индексом index
  67.     const Type& operator[](size_t index) const noexcept {
  68.         const Type& new_i = *(raw_ptr_ + index);
  69.         return new_i;
  70.     }
  71.  
  72.     // Возвращает true, если указатель ненулевой, и false в противном случае
  73.     explicit operator bool() const {
  74.         return (raw_ptr_);
  75.     }
  76.  
  77.     // Возвращает значение сырого указателя, хранящего адрес начала массива
  78.     Type* Get() const noexcept {
  79.         return raw_ptr_;
  80.     }
  81.  
  82.     // Обменивается значениям указателя на массив с объектом other
  83.     void swap(ArrayPtr& other) noexcept {
  84.         std::swap(this->raw_ptr_, other.raw_ptr_);
  85.     }
  86.  
  87. private:
  88.     Type *raw_ptr_ = nullptr;
  89. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement