|
3 | 3 | #pragma once
|
4 | 4 |
|
5 | 5 | #include <memory>
|
| 6 | +#include <utility> |
6 | 7 |
|
7 | 8 | namespace bmstu {
|
8 | 9 | template<typename Z>
|
9 | 10 | class raw_memory {
|
10 |
| - public: // NOLINT |
| 11 | + public: // NOLINT |
11 | 12 | raw_memory() = default;
|
12 | 13 |
|
13 | 14 | explicit raw_memory(size_t size): buffer_(allocate_(size)), capacity_(size) {
|
14 | 15 | }
|
15 | 16 |
|
16 |
| - ~raw_memory() { deallocate_(buffer_); } |
| 17 | + ~raw_memory() { |
| 18 | + deallocate_(buffer_); |
| 19 | + capacity_ = 0; |
| 20 | + } |
17 | 21 |
|
18 | 22 | raw_memory(const raw_memory& other) = delete;
|
| 23 | + |
19 | 24 | // мы не хотим копировать указатель на память одну и ту же, вдруг один удалится указатель, а второй - нет, будет UB.
|
20 | 25 |
|
21 | 26 | raw_memory& operator=(const raw_memory& other) = delete;
|
@@ -44,17 +49,36 @@ class raw_memory {
|
44 | 49 | }
|
45 | 50 |
|
46 | 51 | const Z& operator[](size_t index) const noexcept {
|
47 |
| - assert(index < capacity_); |
48 |
| - return const_cast<raw_memory>(*this)[index]; |
| 52 | + return const_cast<raw_memory &>(*this)[index]; |
49 | 53 | // todo: возможно нужен raw_memory&
|
50 | 54 | }
|
51 | 55 |
|
52 |
| - private: // NOLINT |
53 |
| - void swap_(raw_memory other) noexcept { |
54 |
| - std::swap(buffer_, other.buffer_); |
55 |
| - std::swap(capacity_, other.capacity_); |
| 56 | + Z* operator+(size_t offset) noexcept { |
| 57 | + assert(offset <= capacity_); // = потому что мы хотим еще и end хранить, |
| 58 | + return buffer_ + offset; |
| 59 | + } |
| 60 | + |
| 61 | + const Z* operator+(size_t offset) const noexcept { |
| 62 | + return const_cast<raw_memory &>(*this) + offset; |
56 | 63 | }
|
57 | 64 |
|
| 65 | + size_t capacity() const { |
| 66 | + return capacity_; |
| 67 | + } |
| 68 | + |
| 69 | + Z* buffer() { |
| 70 | + return buffer_; |
| 71 | + } |
| 72 | + |
| 73 | + const Z* buffer() const { |
| 74 | + return buffer_; |
| 75 | + } |
| 76 | + |
| 77 | + void swap(raw_memory other) noexcept { |
| 78 | + std::swap(buffer_, other.buffer_); |
| 79 | + std::swap(capacity_, other.capacity_); |
| 80 | + } // todo: возможно в прайват надо |
| 81 | + private: // NOLINT |
58 | 82 | // нужны методы, которые аллоцируют и деаллоцируют сырую память.
|
59 | 83 | static Z* allocate_(size_t size) {
|
60 | 84 | return size != 0
|
|
0 commit comments