20#ifndef KERNEL_UTILITIES_VECTOR_H
21#define KERNEL_UTILITIES_VECTOR_H
23#include "pedigree/kernel/compiler.h"
24#include "pedigree/kernel/processor/types.h"
25#include "pedigree/kernel/utilities/utility.h"
68 typename pedigree_std::remove_pointer<T_>::type operator*()
const {
73 return value == other.value;
97 const T& operator[](
size_t index)
const;
109 template <
class... Args>
111 reserve(m_Count + 1,
true);
115 if ((m_Start + m_Count + 1) > m_Size) {
116 pedigree_std::copy(m_Data, m_Data + m_Start, m_Count);
120 m_Data[m_Start + m_Count++] = T(pedigree_std::forward<Args>(args)...);
138 void setAt(
size_t idx,
const T& value);
145 void insert(
size_t index,
const T& value);
158 ReverseIterator
erase(ReverseIterator iter);
163 return m_Data + m_Start;
168 return m_Data + m_Start;
173 return m_Data + m_Start + m_Count;
178 return m_Data + m_Start + m_Count;
181 ReverseIterator rbegin() {
182 return ReverseIterator{.value = m_Data + m_Start + m_Count - 1};
184 ConstReverseIterator rbegin()
const {
185 return ConstReverseIterator{.value = m_Data + m_Start + m_Count - 1};
187 ReverseIterator rend() {
188 return ReverseIterator{.value = m_Data + m_Start - 1};
190 ConstReverseIterator rend()
const {
191 return ConstReverseIterator{.value = m_Data + m_Start - 1};
200 bool tryReserve(
size_t size,
bool copy =
true);
207 void reserve(
size_t size,
bool copy,
bool free);
220 static const int m_ReserveFactor = 2;
250 static T outofbounds = T();
251 if (index >= m_Count)
253 return m_Data[m_Start + index];
258 static const T outofbounds = T();
259 if (index >= m_Count)
261 return m_Data[m_Start + index];
276 reserve(m_Count + 1,
true);
280 if ((m_Start + m_Count + 1) > m_Size) {
281 pedigree_std::copy(m_Data, m_Data + m_Start, m_Count);
285 m_Data[m_Start + m_Count++] = value;
290 reserve(m_Count + 1,
true);
294 if ((m_Start + m_Count + 1) > m_Size) {
295 pedigree_std::copy(m_Data, m_Data + m_Start, m_Count);
299 m_Data[m_Start + m_Count++] = pedigree_std::move(value);
309 return m_Data[m_Start + m_Count];
314 const T* oldData = m_Data;
316 reserve(m_Count + 1,
true,
false);
318 if (m_Start && (m_Data == oldData)) {
320 m_Data[m_Start] = value;
322 pedigree_std::copy(&m_Data[1], m_Data, m_Count);
329 if (m_Data != oldData) {
336 const T* oldData = m_Data;
338 reserve(m_Count + 1,
true,
false);
340 if (m_Start && (m_Data == oldData)) {
342 m_Data[m_Start] = pedigree_std::move(value);
344 pedigree_std::copy(&m_Data[1], m_Data, m_Count);
345 m_Data[0] = pedigree_std::move(value);
351 if (m_Data != oldData) {
362 T ret = m_Data[m_Start];
374 m_Data[m_Start + idx] = value;
392 }
else if (index >= m_Count) {
396 T* base = m_Data + m_Start;
397 pedigree_std::copy(base + index, base + index + 1, m_Count - index - 1);
403 erase(
static_cast<size_t>(iter - begin()));
409 erase(
static_cast<size_t>(iter.value - (m_Data + m_Start)));
419 reserve(x.size(),
false);
420 pedigree_std::copy(m_Data, x.begin(), x.m_Count);
427 if (size <= m_Size) {
430 const size_t maximum = ~size_t{0} /
sizeof(T);
431 if (size > maximum) {
434 if (m_Size <= maximum / m_ReserveFactor && size < m_Size * m_ReserveFactor) {
435 size = m_Size * m_ReserveFactor;
437 T* replacement =
new T[size];
441 if (copy && m_Count) {
442 pedigree_std::copy(replacement, m_Data + m_Start, m_Count);
445 m_Data = replacement;
454 reserve(size, copy,
true);
459 if (size <= m_Size) {
461 }
else if (size < (m_Size * m_ReserveFactor)) {
463 size = m_Size * m_ReserveFactor;
467 m_Data =
new T[size];
469 if ((copy ==
true) && m_Count) {
470 pedigree_std::copy(m_Data, tmp + m_Start, m_Count);
484 else if (a < begin() || a >= end())
486 else if (b < begin() || b >= end())
497 if (index >= m_Count) {
500 }
else if (index == 0) {
505 reserve(m_Count + 1,
true);
507 pedigree_std::copy(m_Data + m_Start + index + 1, m_Data + m_Start + index, m_Count - index);
509 m_Data[m_Start + index] = value;
527 const size_t size = m_Size, count = m_Count, start = m_Start;
529 m_Size = other.m_Size;
530 m_Count = other.m_Count;
531 m_Start = other.m_Start;
532 m_Data = other.m_Data;
534 other.m_Count = count;
535 other.m_Start = start;
An iterator applicable for many data structures.
A vector / dynamic array.
void swap(Vector &other) noexcept
void createBack(Args &&... args)
ConstIterator end() const
ConstIterator begin() const
T operator--(T &x, int)
Global postdecrement operator for types with overloaded predecrement operator.
Vector & operator=(const Vector &x)
void assign(const Vector &x)
T & operator[](size_t index)
ReverseIterator erase(ReverseIterator iter)
void setAt(size_t idx, const T &value)
T operator++(T &x, int)
Global postincrement operator for types with overloaded preincrement operator.
void insert(size_t index, const T &value)
void reserve(size_t size, bool copy)
void pushFront(T &&value)
void pushFront(const T &value)
void reserve(size_t size, bool copy, bool free)
void pushBack(const T &value)
void clear(bool freeMem=false)
Iterator erase(Iterator iter)
void swap(Iterator a, Iterator b)
bool operator==(const Iterator< originalT, Struct, FunctionPrev, FunctionNext, T1 > &x1, const Iterator< originalT, Struct, FunctionPrev, FunctionNext, T2 > &x2)