22 #ifndef COMMON_ARRAY_H 23 #define COMMON_ARRAY_H 25 #include "common/scummsys.h" 26 #include "common/algorithm.h" 27 #include "common/textconsole.h" 28 #include "common/memory.h" 59 typedef value_type &reference;
60 typedef const value_type &const_reference;
70 constexpr
Array() : _capacity(0), _size(0), _storage(nullptr) {}
76 explicit Array(size_type count) : _size(count) {
81 for (size_type i = 0; i < count; ++i)
82 new ((
void *)&storage[i]) T();
88 Array(size_type count,
const T &value) : _size(count) {
96 Array(
const Array<T> &array) : _capacity(array._size), _size(array._size), _storage(nullptr) {
106 Array(
Array<T> &&old) : _capacity(old._capacity), _size(old._size), _storage(old._storage) {
107 old._storage =
nullptr;
120 Array(std::initializer_list<T> list) : _size(list.
size()) {
130 Array(
const T2 *array, size_type n) {
139 _capacity = _size = 0;
143 template<
class... TArgs>
144 void emplace(const_iterator pos, TArgs&&... args) {
145 assert(pos >= _storage && pos <= _storage + _size);
147 const size_type index =
static_cast<size_type
>(pos -
_storage);
149 if (_size != _capacity && index == _size) {
151 new (_storage + index) T(Common::forward<TArgs>(args)...);
162 new (_storage + index) T(Common::forward<TArgs>(args)...);
175 template<
class... TArgs>
177 emplace(
begin() + _size, Common::forward<TArgs>(args)...);
194 _size += array.
size();
204 _storage[
_size].~T();
232 return _storage[_size-1];
238 return _storage[_size-1];
243 assert(idx <= _size);
244 insert_aux(_storage + idx, &element, &element + 1);
249 assert(idx <= _size);
256 void insert(iterator pos,
const T &element) {
264 move(_storage + idx + 1, _storage + _size, _storage + idx);
267 _storage[
_size].~T();
276 return _storage[idx];
282 return _storage[idx];
304 _capacity = old._capacity;
306 _storage = old._storage;
308 old._storage =
nullptr;
330 move(pos + 1, _storage + _size, pos);
333 _storage[
_size].~T();
338 iterator
erase(iterator first, iterator last) {
339 move(last, _storage + _size, first);
341 int count = (last - first);
345 for (uint idx = _size; idx < (_size + count); ++idx)
360 if (_size != other.
_size)
362 for (size_type i = 0; i <
_size; ++i) {
363 if (_storage[i] != other.
_storage[i])
371 return !(*
this == other);
381 return _storage +
_size;
390 const_iterator
end()
const {
391 return _storage +
_size;
398 if (newCapacity <= _capacity)
417 for (size_type i = newSize; i <
_size; ++i)
419 for (size_type i = _size; i < newSize; ++i)
420 new ((
void *)&storage[i]) T();
427 void resize(size_type newSize,
const T value) {
432 for (size_type i = newSize; i <
_size; ++i)
443 void assign(const_iterator first, const_iterator last) {
444 resize(distance(first, last));
446 while (first != last)
450 void swap(
Array &arr) {
462 while (capa < capacity)
469 _capacity = capacity;
471 _storage = (T *)malloc(
sizeof(T) * capacity);
473 ::error(
"Common::Array: failure to allocate %u bytes", capacity * (size_type)
sizeof(T));
481 for (size_type i = 0; i < elements; ++i)
499 iterator
insert_aux(iterator pos, const_iterator first, const_iterator last) {
500 assert(_storage <= pos && pos <= _storage + _size);
501 assert(first <= last);
502 const size_type n = last - first;
504 const size_type idx = pos -
_storage;
505 if (_size + n > _capacity || (_storage <= first && first <= _storage + _size)) {
523 }
else if (idx + n <= _size) {
532 copy(first, last, pos);
540 copy(first, first + (_size - idx), pos);
558 template<
class T,
typename CompareArgType = const
void *>
561 typedef int (*Comparator)(CompareArgType, CompareArgType);
566 _comparator = comparator;
578 T *where = bsearchMin(element);
589 void insert_at(size_type idx,
const T &element);
593 void insert(iterator pos,
const T &element);
602 T *bsearchMin(CompareArgType key) {
603 uint start_ = 0, end_ = this->
_size;
606 while (start_ < end_) {
607 uint mid = start_ + (end_ - start_) / 2;
609 result = this->_comparator(key, this->
_storage[mid]);
619 Comparator _comparator;
void push_back(const Array< T > &array)
Definition: array.h:191
bool operator==(const Array< T > &other) const
Definition: array.h:357
T * _storage
Definition: array.h:67
bool operator!=(const Array< T > &other) const
Definition: array.h:370
void insert_at(size_type idx, const T &element)
Definition: array.h:242
const_iterator begin() const
Definition: array.h:385
iterator insert_aux(iterator pos, const_iterator first, const_iterator last)
Definition: array.h:499
T * data()
Definition: array.h:213
const T * data() const
Definition: array.h:208
void insert_at(size_type idx, const Array< T > &array)
Definition: array.h:248
const T & operator[](size_type idx) const
Definition: array.h:280
void clear()
Definition: array.h:321
iterator end()
Definition: array.h:380
iterator begin()
Definition: array.h:375
T & operator[](size_type idx)
Definition: array.h:274
T * iterator
Definition: array.h:54
Array< T > & operator=(const Array< T > &array)
Definition: array.h:286
void SWAP(T &a, T &b)
Definition: util.h:84
T & front()
Definition: array.h:218
Array(size_type count)
Definition: array.h:76
Array & operator=(Array< T > &&old)
Definition: array.h:299
static size_type roundUpCapacity(size_type capacity)
Definition: array.h:460
Type * uninitialized_move(In first, In last, Type *dst)
Definition: memory.h:71
const T & front() const
Definition: array.h:224
const_iterator end() const
Definition: array.h:390
Out copy(In first, In last, Out dst)
Definition: algorithm.h:52
bool empty() const
Definition: array.h:352
void push_back(const T &element)
Definition: array.h:181
size_type _size
Definition: array.h:66
const T * const_iterator
Definition: array.h:55
void reserve(size_type newCapacity)
Definition: array.h:397
Type * uninitialized_copy(In first, In last, Type *dst)
Definition: memory.h:59
Definition: algorithm.h:29
void pop_back()
Definition: array.h:200
Array(size_type count, const T &value)
Definition: array.h:88
void resize(size_type newSize, const T value)
Definition: array.h:427
void freeStorage(T *storage, const size_type elements)
Definition: array.h:480
size_type size() const
Definition: array.h:316
Out move(In first, In last, Out dst)
Definition: algorithm.h:109
Out move_backward(In first, In last, Out dst)
Definition: algorithm.h:124
void NORETURN_PRE error(MSVC_PRINTF const char *s,...) GCC_PRINTF(1
void push_back(T &&element)
Definition: array.h:186
iterator erase(iterator first, iterator last)
Definition: array.h:338
void resize(size_type newSize)
Definition: array.h:412
T remove_at(size_type idx)
Definition: array.h:261
Array(const Array< T > &array)
Definition: array.h:96
size_type _capacity
Definition: array.h:65
uint size_type
Definition: array.h:62
void allocCapacity(size_type capacity)
Definition: array.h:468
void assign(const_iterator first, const_iterator last)
Definition: array.h:443
void emplace_back(TArgs &&...args)
Definition: array.h:176
T value_type
Definition: array.h:57
const T & back() const
Definition: array.h:236
Array(const T2 *array, size_type n)
Definition: array.h:130
void insert(const T &element)
Definition: array.h:572
void insert(iterator pos, const T &element)
Definition: array.h:256
Array(std::initializer_list< T > list)
Definition: array.h:120
Array(Array< T > &&old)
Definition: array.h:106
void emplace(const_iterator pos, TArgs &&... args)
Definition: array.h:144
iterator erase(iterator pos)
Definition: array.h:329
T & back()
Definition: array.h:230
void uninitialized_fill_n(Type *dst, size_t n, const Value &x)
Definition: memory.h:94