Voxia OS v0.0.1
Hobby Project Operating System Targeting x86-64
Loading...
Searching...
No Matches
vector.hpp
Go to the documentation of this file.
1#ifndef __LIBK__VECTOR_HPP_
2#define __LIBK__VECTOR_HPP_
3
4#include <memory/kalloc.h>
5#include <type.h>
6#include <vector.h>
7#include <str.h>
8
9// vector untuk c++
10template <typename T> class Vector {
11 public:
15
17 destroy();
18 }
19
20 // Nonaktifkan copy untuk menghindari double-free
21 Vector(const Vector&) = delete;
22 Vector& operator=(const Vector&) = delete;
23
27 Vector(Vector&& other) noexcept
28 : data_(other.data_), size_(other.size_),
29 capacity_(other.capacity_) {
30 other.data_ = nullptr;
31 other.size_ = 0;
32 other.capacity_ = 0;
33 }
34
38 Vector& operator=(Vector&& other) noexcept {
39 if (this != &other) {
40 destroy();
41 data_ = other.data_;
42 size_ = other.size_;
43 capacity_ = other.capacity_;
44 other.data_ = nullptr;
45 other.size_ = 0;
46 other.capacity_ = 0;
47 }
48 return *this;
49 }
50
52 T& operator[](size_t index) {
53 return data_[index];
54 }
55
57 const T& operator[](size_t index) const {
58 return data_[index];
59 }
60
62 T& front() {
63 return data_[0];
64 }
65
67 T& back() {
68 return data_[size_ - 1];
69 }
70
72 T* data() {
73 return data_;
74 }
75
77 const T* data() const {
78 return data_;
79 }
80
82 size_t size() const {
83 return size_;
84 }
85
87 size_t capacity() const {
88 return capacity_;
89 }
90
92 bool empty() const {
93 return size_ == 0;
94 }
95
100 void push_back(const T& val) {
101 if (size_ >= capacity_)
103 data_[size_++] = val;
104 }
105
109 void push_back(T&& val) {
110 if (size_ >= capacity_)
112 data_[size_++] = static_cast<T&&>(val);
113 }
114
124 T* pop_back() {
125 if (size_ == 0)
126 return nullptr;
127 return &data_[--size_];
128 }
129
134 void clear() {
135 size_ = 0;
136 }
137
142 void reserve(size_t new_cap) {
143 if (new_cap <= capacity_)
144 return;
145
146 T* new_data = static_cast<T*>(kalloc(new_cap * sizeof(T)));
147
148 if (data_) {
149 memcopy(new_data, data_, capacity_ * sizeof(T));
150 kfree(data_, capacity_ * sizeof(T));
151 }
152
153 data_ = new_data;
154 capacity_ = new_cap;
155 }
156
157 T* begin() {
158 return data_;
159 }
160 T* end() {
161 return data_ + size_;
162 }
163
164 const T* begin() const {
165 return data_;
166 }
167 const T* end() const {
168 return data_ + size_;
169 }
170
171 private:
173 size_t size_;
174 size_t capacity_;
175
180 size_t new_cap = capacity_ ? capacity_ * 2 : 4;
181 reserve(new_cap);
182 }
183
187 void destroy() {
188 if (data_) {
189 kfree(data_, capacity_ * sizeof(T));
190 data_ = nullptr;
191 size_ = 0;
192 capacity_ = 0;
193 }
194 }
195};
196
197#endif // __LIBK__VECTOR_HPP_
T & front()
Elemen pertama.
Definition vector.hpp:62
T * data_
Definition vector.hpp:172
void push_back(T &&val)
Tambah elemen ke akhir (move).
Definition vector.hpp:109
T & operator[](size_t index)
Akses elemen by index (tanpa bounds check).
Definition vector.hpp:52
void clear()
Reset ukuran ke 0 tanpa membebaskan memori.
Definition vector.hpp:134
Vector()
Definition vector.hpp:12
const T * begin() const
Definition vector.hpp:164
T * begin()
Definition vector.hpp:157
size_t capacity_
Definition vector.hpp:174
void destroy()
Bebaskan memori — menggantikan macro vector_destroy().
Definition vector.hpp:187
Vector(Vector &&other) noexcept
Move constructor.
Definition vector.hpp:27
const T & operator[](size_t index) const
Akses elemen by index — const overload.
Definition vector.hpp:57
T * data()
Pointer raw ke data internal.
Definition vector.hpp:72
const T * end() const
Definition vector.hpp:167
T & back()
Elemen terakhir.
Definition vector.hpp:67
size_t size_
Definition vector.hpp:173
size_t capacity() const
Kapasitas buffer saat ini.
Definition vector.hpp:87
void push_back(const T &val)
Tambah elemen ke akhir (copy).
Definition vector.hpp:100
T * pop_back()
Hapus elemen terakhir dan kembalikan nilainya.
Definition vector.hpp:124
size_t size() const
Jumlah elemen aktif.
Definition vector.hpp:82
Vector(const Vector &)=delete
void reserve(size_t new_cap)
Pastikan kapasitas minimal new_cap elemen.
Definition vector.hpp:142
T * end()
Definition vector.hpp:160
Vector & operator=(const Vector &)=delete
void expand_capacity()
Dobel kapasitas — menggantikan macro vector_expand_capacity().
Definition vector.hpp:179
Vector & operator=(Vector &&other) noexcept
Move assignment.
Definition vector.hpp:38
bool empty() const
True jika tidak ada elemen.
Definition vector.hpp:92
const T * data() const
Pointer raw ke data internal — const.
Definition vector.hpp:77
~Vector()
Definition vector.hpp:16
void kfree(void *ptr, size_t size)
void * kalloc(size_t size)
void memcopy(void *dest, void *src, size_t size)
#define nullptr
Definition type.h:77
#define VECTOR_MINIMUM_ITEM
Definition vector.h:9