-
Notifications
You must be signed in to change notification settings - Fork 0
/
array_ptr.h
72 lines (59 loc) · 1.97 KB
/
array_ptr.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <cassert>
#include <cstdlib>
template <typename Type>
class ArrayPtr {
public:
// Инициализирует ArrayPtr нулевым указателем
ArrayPtr() = default;
// Создаёт в куче массив из size элементов типа Type.
// Если size == 0, поле raw_ptr_ должно быть равно nullptr
explicit ArrayPtr(size_t size) {
if (size == 0) {
raw_ptr_ = nullptr;
} else {
raw_ptr_ = new Type[size];
}
}
// Конструктор из сырого указателя, хранящего адрес массива в куче либо nullptr
explicit ArrayPtr(Type* raw_ptr) noexcept {
raw_ptr_ = raw_ptr;
}
// Запрещаем копирование
ArrayPtr(const ArrayPtr&) = delete;
~ArrayPtr() {
delete[] raw_ptr_;
}
// Запрещаем присваивание
ArrayPtr& operator=(const ArrayPtr&) = delete;
// Прекращает владением массивом в памяти, возвращает значение адреса массива
// После вызова метода указатель на массив должен стать обнулиться
[[nodiscard]] Type* Release() noexcept {
Type* pointer_to_return = raw_ptr_;
raw_ptr_ = nullptr;
return pointer_to_return;
}
// Возвращает ссылку на элемент массива с индексом index
Type& operator[](size_t index) noexcept {
return raw_ptr_[index];
}
// Возвращает константную ссылку на элемент массива с индексом index
const Type& operator[](size_t index) const noexcept {
return raw_ptr_[index];
}
// Возвращает true, если указатель ненулевой, и false в противном случае
explicit operator bool() const {
return !(raw_ptr_ == nullptr);
}
// Возвращает значение сырого указателя, хранящего адрес начала массива
Type* Get() const noexcept {
return raw_ptr_;
}
// Обменивается значениям указателя на массив с объектом other
void swap(ArrayPtr& other) noexcept {
Type* tmp_pointer = raw_ptr_;
raw_ptr_ = other.raw_ptr_;
other.raw_ptr_ = tmp_pointer;
}
private:
Type* raw_ptr_ = nullptr;
};