67 return iterator(ptr + offset, offset);
69 bool operator==(
iterator it) {
return ptr == it.getPtr(); }
70 bool operator<(
iterator it) {
return ptr < it.getPtr(); }
71 bool operator<=(
iterator it) {
return ptr <= it.getPtr(); }
72 bool operator>(
iterator it) {
return ptr > it.getPtr(); }
73 bool operator>=(
iterator it) {
return ptr >= it.getPtr(); }
74 bool operator!=(
iterator it) {
return ptr != it.getPtr(); }
75 T &operator*() {
return *ptr; }
76 T *operator->() {
return ptr; }
77 T *getPtr() {
return ptr; }
78 size_t pos() {
return pos_; }
79 size_t operator-(
iterator it) {
return (ptr - it.getPtr()); }
82#ifdef USE_INITIALIZER_LIST
85 Vector(std::initializer_list<T> iniList) {
86 resize(iniList.size());
88 for (
auto &obj : iniList) {
97 setAllocator(allocator);
98 resize_internal(len,
false,
false);
104 setAllocator(allocator);
109 setAllocator(allocator);
111 for (
int j = 0; j < size; j++) {
131 this->p_allocator = copyFrom.p_allocator;
132 resize_internal(copyFrom.size(),
false);
133 for (
int j = 0; j < copyFrom.size(); j++) {
134 p_data[j] = copyFrom[j];
136 this->len = copyFrom.size();
140 template <
typename TT,
int N>
142 resize_internal(N,
false);
143 for (
int j = 0; j < N; j++) {
151 resize_internal(copyFrom.size(),
false);
152 for (
int j = 0; j < copyFrom.size(); j++) {
153 p_data[j] = copyFrom[j];
155 this->len = copyFrom.size();
161 this->p_allocator = &allocator;
162 this->len = to - from;
163 resize_internal(this->len,
false);
164 for (
size_t j = 0; j < this->len; j++) {
172 void setAllocator(
Allocator &allocator) {
173 p_allocator = &allocator;
176 void clear() { len = 0; }
178 int size() {
return len; }
180 bool empty() {
return size() == 0; }
182 void push_back(T &&value) {
183 resize_internal(len + 1,
true);
188 void push_back(T &value) {
189 resize_internal(len + 1,
true);
194 void push_front(T &value) {
195 resize_internal(len + 1,
true);
197 for (
int j = len; j >= 0; j--) {
198 p_data[j + 1] = p_data[j];
204 void push_front(T &&value) {
205 resize_internal(len + 1,
true);
207 for (
int j = len; j >= 0; j--) {
208 p_data[j + 1] = p_data[j];
220 void pop_front() { erase(0); }
222 void assign(iterator v1, iterator v2) {
223 size_t newLen = v2 - v1;
224 resize_internal(newLen,
false);
227 for (
auto ptr = v1; ptr != v2; ptr++) {
228 p_data[pos++] = *ptr;
232 void assign(
size_t number, T value) {
233 resize_internal(number,
false);
235 for (
int j = 0; j < number; j++) {
240 void swap(Vector<T> &in) {
243 int bufferLenCpy = bufferLen;
248 bufferLen = in.bufferLen;
252 in.bufferLen = bufferLenCpy;
255 T &operator[](
int index) {
256 assert(p_data !=
nullptr);
258 return p_data[index];
261 T &operator[](
const int index)
const {
263 return p_data[index];
266 bool resize(
int newSize, T value) {
267 if (resize(newSize)) {
268 for (
int j = 0; j < newSize; j++) {
276 void shrink_to_fit() { resize_internal(this->len,
true,
true); }
278 int capacity() {
return this->bufferLen; }
280 bool resize(
int newSize) {
281 int oldSize = this->len;
282 resize_internal(newSize,
true);
284 return this->len != oldSize;
287 iterator begin() {
return iterator(p_data, 0); }
289 T &back() {
return *iterator(p_data + (len - 1), len - 1); }
291 iterator end() {
return iterator(p_data + len, len); }
294 void erase(iterator it) {
return erase(it.pos()); }
297 void erase(
int pos) {
299 int lenToEnd = len - pos - 1;
303 memmove((
void *)&p_data[pos], (
void *)(&p_data[pos + 1]),
304 lenToEnd *
sizeof(T));
307#if defined(NO_INPLACE_INIT_SUPPORT)
308 p_data[len - 1] = T();
310 new (&(p_data[len - 1])) T();
316 T *data() {
return p_data; }
318 operator bool()
const {
return p_data !=
nullptr; }
321 for (
int j = 0; j < size(); j++) {
322 if (p_data[j] == obj)
return j;
327 bool contains(T obj){
328 return indexOf(obj) >= 0;
332 void swap(T &other) {
334 int temp_blen = bufferLen;
336 T *temp_data = p_data;
338 bufferLen = other.bufferLen;
340 p_data = other.p_data;
342 other.bufferLen = temp_blen;
343 other.len = temp_len;
344 other.p_data = temp_data;
350 deleteArray(p_data, size());
358 Allocator *p_allocator = &DefaultAllocator;
360 void resize_internal(
int newSize,
bool copy,
bool shrink =
false) {
361 if (newSize <= 0)
return;
362 if (newSize > bufferLen || this->p_data ==
nullptr || shrink) {
364 int oldBufferLen = this->bufferLen;
365 p_data = newArray(newSize);
366 assert(p_data !=
nullptr);
367 this->bufferLen = newSize;
368 if (oldData !=
nullptr) {
369 if (copy && this->len > 0) {
371 memmove((
void*)p_data, (
void*)oldData, len *
sizeof(T));
373 memset((
void*)oldData, 0, len *
sizeof(T));
376 cleanup(oldData, newSize, oldBufferLen);
378 deleteArray(oldData, oldBufferLen);
383 T *newArray(
int newSize) {
386 data = p_allocator->createArray<T>(newSize);
388 data =
new T[newSize];
393 void deleteArray(T *oldData,
int oldBufferLen) {
395 p_allocator->removeArray(oldData, oldBufferLen);
402 void cleanup(T *data,
int from,
int to) {
403 for (
int j = from; j < to; j++) {