22 #ifndef AGS_STD_VECTOR_H 23 #define AGS_STD_VECTOR_H 25 #include "ags/lib/std/type_traits.h" 26 #include "ags/lib/std/utility.h" 27 #include "common/scummsys.h" 28 #include "common/algorithm.h" 29 #include "common/memory.h" 34 template<
class In,
class Type>
35 Type *uninitialized_move(In first, In last,
Type *dst) {
36 while (first != last) {
37 Type &t = *
new ((
void *)dst++)
Type();
71 return (*_owner)[_index];
80 return _owner == rhs._owner && _index == rhs._index;
83 return !operator==(rhs);
97 const T operator*()
const {
98 return (*_owner)[_index];
107 return _owner == rhs._owner && _index == rhs._index;
110 return !operator==(rhs);
113 return _index > rhs._index;
124 explicit vector(size_type count) : _size(count) {
126 for (size_type i = 0; i < count; ++i)
127 new ((
void *)&_storage[i]) T();
133 vector(size_type count,
const T &value) : _size(count) {
151 vector(
vector<T> &&old) : _capacity(old._capacity), _size(old._size), _storage(old._storage) {
152 old._storage =
nullptr;
186 _capacity = _size = 0;
191 if (_size + 1 <= _capacity)
192 new ((
void *)&_storage[_size++]) T(element);
197 template<
class... Args>
198 void emplace_back(Args... args) {
207 _size += array.
size();
212 void insert(
const T &element) {
219 void insert(iterator position, const_iterator first, const_iterator last) {
220 int destIndex = position - this->
begin();
221 for (; first != last; ++first) {
231 _storage[
_size].~T();
259 return _storage[_size - 1];
265 return _storage[_size - 1];
270 assert(idx <= _size);
271 insert_aux(_storage + idx, &element, &element + 1);
276 assert(idx <= _size);
283 void insert(iterator pos,
const T &element) {
290 T tmp = _storage[idx];
291 Common::copy(_storage + idx + 1, _storage + _size, _storage + idx);
294 _storage[
_size].~T();
300 T &at(
size_t index) {
301 return (*
this)[index];
303 const T &at(
size_t index)
const {
304 return (*
this)[index];
310 return _storage[idx];
316 return _storage[idx];
338 _capacity = old._capacity;
340 _storage = old._storage;
342 old._storage =
nullptr;
367 _storage[
_size].~T();
371 iterator
erase(iterator first, iterator last) {
372 Common::copy(last, this->_storage + this->_size, first);
374 int count = (last - first);
375 this->_size -= count;
378 for (uint idx = this->_size; idx < (this->_size + count); ++idx)
379 this->_storage[idx].~T();
387 void remove(T element) {
388 for (uint i = 0; i < this->
size(); ++i) {
389 if (this->
operator[](i) == element) {
405 if (_size != other.
_size)
407 for (size_type i = 0; i <
_size; ++i) {
408 if (_storage[i] != other.
_storage[i])
416 return !(*
this == other);
426 return _storage +
_size;
435 const_iterator
end()
const {
436 return _storage +
_size;
452 size_t count = it -
begin();
453 for (
size_t ctr = 0; ctr < count; ++ctr) {
460 const_iterator cbegin() {
461 return this->
begin();
463 const_iterator cend() {
466 reverse_iterator rbegin() {
467 return reverse_iterator(
this, (
int)
size() - 1);
469 reverse_iterator rend() {
470 return reverse_iterator(
this, -1);
472 const_reverse_iterator rbegin()
const {
473 return const_reverse_iterator(
this, (
int)
size() - 1);
475 const_reverse_iterator rend()
const {
476 return const_reverse_iterator(
this, -1);
478 const_reverse_iterator crbegin()
const {
479 return const_reverse_iterator(
this, (
int)
size() - 1);
481 const_reverse_iterator crend()
const {
482 return const_reverse_iterator(
this, -1);
489 if (newCapacity <= _capacity)
497 uninitialized_move(oldStorage, oldStorage + _size, _storage);
505 for (size_type i = newSize; i <
_size; ++i)
507 for (size_type i = _size; i < newSize; ++i)
508 new ((
void *)&_storage[i]) T();
512 void resize(
size_t newSize,
const T elem) {
513 size_t oldSize =
size();
515 for (
size_t idx = oldSize; idx < newSize; ++idx)
516 this->
operator[](idx) = elem;
522 void assign(const_iterator first, const_iterator last) {
523 resize(distance(first, last));
525 while (first != last)
535 while (capa < capacity)
542 _capacity = capacity;
544 _storage = (T *)malloc(
sizeof(T) * capacity);
546 ::error(
"Common::vector: failure to allocate %u bytes", capacity * (size_type)
sizeof(T));
554 for (size_type i = 0; i < elements; ++i)
572 iterator
insert_aux(iterator pos, const_iterator first, const_iterator last) {
573 assert(_storage <= pos && pos <= _storage + _size);
574 assert(first <= last);
575 const size_type n = last - first;
577 const size_type idx = pos -
_storage;
578 if (_size + n > _capacity || (_storage <= first && first <= _storage + _size)) {
596 }
else if (idx + n <= _size) {
uint size_type
Definition: vector.h:52
void push_back(const vector< T > &array)
Definition: vector.h:204
vector(vector< T > &&old)
Definition: vector.h:151
void insert(iterator position, const_iterator first, const_iterator last)
Definition: vector.h:219
void allocCapacity(size_type capacity)
Definition: vector.h:541
vector(const vector< T > &array)
Definition: vector.h:141
bool operator!=(const vector< T > &other) const
Definition: vector.h:415
const T * const_iterator
Definition: vector.h:48
void reserve(size_type newCapacity)
Definition: vector.h:488
void freeStorage(T *storage, const size_type elements)
Definition: vector.h:553
const_iterator end() const
Definition: vector.h:435
T * data()
Definition: vector.h:240
void insert(iterator pos, const T &element)
Definition: vector.h:283
const_iterator begin() const
Definition: vector.h:430
void SWAP(T &a, T &b)
Definition: util.h:82
bool empty() const
Definition: vector.h:397
vector(size_type count)
Definition: vector.h:124
void rotate(iterator it)
Definition: vector.h:450
void insert_at(size_type idx, const T &element)
Definition: vector.h:269
Type
Definition: system.h:121
size_type size() const
Definition: vector.h:350
T remove_at(size_type idx)
Definition: vector.h:288
vector< T > & operator=(const vector< T > &array)
Definition: vector.h:320
Out copy(In first, In last, Out dst)
Definition: algorithm.h:52
T & front()
Definition: vector.h:245
vector & operator=(vector< T > &&old)
Definition: vector.h:333
const T & front() const
Definition: vector.h:251
iterator begin()
Definition: vector.h:420
const T & back() const
Definition: vector.h:263
size_type _size
Definition: vector.h:56
T value_type
Definition: vector.h:50
void resize(size_type newSize)
Definition: vector.h:503
T & back()
Definition: vector.h:257
constexpr remove_reference_t< T > && move(T &&t) noexcept
Definition: util.h:209
Type * uninitialized_copy(In first, In last, Type *dst)
Definition: memory.h:59
bool operator==(const vector< T > &other) const
Definition: vector.h:402
void push_back(const T &element)
Definition: vector.h:190
const T & operator[](size_type idx) const
Definition: vector.h:314
void assign(const_iterator first, const_iterator last)
Definition: vector.h:522
void insert_at(size_type idx, const vector< T > &array)
Definition: vector.h:275
vector(::std::initializer_list< T > list)
Definition: vector.h:167
void NORETURN_PRE error(MSVC_PRINTF const char *s,...) GCC_PRINTF(1
vector(size_type count, const T &value)
Definition: vector.h:133
iterator erase(iterator pos)
Definition: vector.h:363
void clear()
Definition: vector.h:355
iterator end()
Definition: vector.h:425
T & operator[](size_type idx)
Definition: vector.h:308
vector(const T2 *array, size_type n)
Definition: vector.h:177
T * iterator
Definition: vector.h:47
void pop_back()
Definition: vector.h:227
static size_type roundUpCapacity(size_type capacity)
Definition: vector.h:533
iterator insert_aux(iterator pos, const_iterator first, const_iterator last)
Definition: vector.h:572
Out copy_backward(In first, In last, Out dst)
Definition: algorithm.h:67
size_type _capacity
Definition: vector.h:55
void uninitialized_fill_n(Type *dst, size_t n, const Value &x)
Definition: memory.h:82
T * _storage
Definition: vector.h:57
const T * data() const
Definition: vector.h:235