8#include <initializer_list>
21template <
class T,
class Allocator = tenno::allocator<T>>
class vector
29 using pointer =
typename Allocator::pointer;
34 : _size(0), _capacity(0), _data(nullptr),
39 const T &value,
const Allocator &alloc = Allocator())
40 : _size(count), _capacity(count), _data(_allocator.allocate(count)),
49 : _size(count), _capacity(count), _data(_allocator.allocate(count)),
55 : _size(other._size), _capacity(other._capacity),
56 _data(_allocator.allocate(other._size)), _allocator(other._allocator)
58 for (
size_type i = 0; i < other._size; ++i)
60 _data[i] = other._data[i];
65 : _size(other._size), _capacity(other._capacity),
66 _data(_allocator.allocate(other._size)), _allocator(alloc)
68 for (
size_type i = 0; i < other._size; ++i)
70 _data[i] = other._data[i];
75 : _size(other._size), _capacity(other._capacity), _data(other._data),
76 _allocator(other._allocator)
79 other._data =
nullptr;
83 : _size(other._size), _capacity(other._capacity), _data(other._data),
87 other._data =
nullptr;
89 vector(std::initializer_list<T> init,
const Allocator &alloc = Allocator())
90 : _size(init.
size()), _capacity(init.
size()),
91 _data(_allocator.allocate(init.
size())), _allocator(alloc)
94 for (
auto it = init.begin(); it != init.end(); ++it)
103 if (_data ==
nullptr)
105 _allocator.deallocate(_data, _size);
112 _allocator.deallocate(_data, _capacity);
114 _capacity = other._size;
115 _allocator = other._allocator;
116 _data = _allocator.allocate(_size);
119 _data[i] = other._data[i];
129 _allocator.deallocate(_data, _capacity);
131 _capacity = other._capacity;
133 _allocator = other._allocator;
136 other._data =
nullptr;
144 _allocator.deallocate(_data, _capacity);
145 _size = ilist.size();
146 _capacity = ilist.size();
147 _data = _allocator.allocate(_size);
149 for (
auto it = ilist.begin(); it != ilist.end(); ++it)
159 if (count > _capacity)
161 _allocator.deallocate(_data, _capacity);
164 _data = _allocator.allocate(_size);
201 void assign(std::initializer_list<T> ilist)
203 _allocator.deallocate(_data, _capacity);
204 _size = ilist.size();
205 _capacity = ilist.size();
206 _data = _allocator.allocate(_size);
208 for (
auto it = ilist.begin(); it != ilist.end(); ++it)
217 if (r.
size() > _capacity)
219 _allocator.deallocate(_data, _capacity);
221 _capacity = r.
size();
222 _data = _allocator.allocate(_size);
225 for (
auto it = r.
begin(); it != r.
end(); ++it)
234 return this->_allocator;
252 if (_data ==
nullptr)
266 if (_data ==
nullptr)
279 if (_data ==
nullptr)
292 if (_data ==
nullptr)
301 if (_data ==
nullptr)
310 if (_data ==
nullptr)
352 return index == other.index;
357 return !(
index == other.index);
406 return iterator(*
this, this->_size);
424 const long long int _index)
444 return index == other.index;
449 return !(
index == other.index);
518 if (new_cap <= _capacity)
522 pointer new_data = _allocator.allocate(new_cap);
525 new_data[i] = _data[i];
527 _allocator.deallocate(_data, _capacity);
539 if (_size == _capacity)
543 pointer new_data = _allocator.allocate(_size);
546 new_data[i] = _data[i];
548 _allocator.deallocate(_data, _capacity);
560 if (_size == _capacity)
562 reserve(_capacity == 0 ? 1 : _capacity * 2);
564 _data[_size] = value;
575 push_back(T(std::forward<Args>(args)...));
576 return _data[_size - 1];
591 while (_size < count)
602 while (_size < count)
604 _data[_size] = value;
622 Allocator _allocator;
constexpr iterator begin() const noexcept
constexpr tenno::size size() const noexcept
constexpr iterator end() const noexcept
A reference wrapper class.
expected< tenno::reference_wrapper< const T >, tenno::error > operator[](size_type pos) const
void push_back(const T &&value) noexcept
vector(size_type count, const Allocator &alloc=Allocator())
size_type max_size() const noexcept
expected< tenno::reference_wrapper< const T >, tenno::error > front() const
reverse_iterator rbegin() noexcept
Get an reverse_iterator to the beginning of the data.
void push_back(const T &value) noexcept
tenno::expected< const_pointer, tenno::error > data() const noexcept
expected< tenno::reference_wrapper< T >, tenno::error > operator[](size_type pos)
expected< tenno::reference_wrapper< T >, tenno::error > at(size_type pos)
size_type capacity() const noexcept
size_type size() const noexcept
void assign(std::initializer_list< T > ilist)
allocator_type get_allocator() const
vector & operator=(vector &&other) noexcept
typename Allocator::pointer pointer
void reserve(size_type new_cap)
vector(const vector &other, const Allocator &alloc)
void resize(size_type count) noexcept
void shrink_to_fit() noexcept
void resize(size_type count, const value_type &value) noexcept
iterator end() noexcept
Get an iterator to the end of the data.
typename Allocator::const_pointer const_pointer
reference emplace_back(Args &&...args) noexcept
bool empty() const noexcept
vector & operator=(const vector &other)
void assign(size_type count, const T &value)
expected< tenno::reference_wrapper< const T >, tenno::error > back() const
const value_type & const_reference
vector(const vector &other)
void swap(vector &other) noexcept
vector & operator=(std::initializer_list< value_type > ilist)
reverse_iterator rend() noexcept
Get an reverse_iterator to the end of the data.
vector(size_type count, const T &value, const Allocator &alloc=Allocator())
iterator begin() noexcept
Get an iterator to the beginning of the data.
void assign_range(const tenno::range< T > &r)
tenno::expected< pointer, tenno::error > data() noexcept
vector(std::initializer_list< T > init, const Allocator &alloc=Allocator())
vector(vector &&other, const Allocator &alloc)
constexpr std::remove_reference_t< T > && move(T &&t) noexcept
Move a value from one location to another.
void swap(T &a, T &b) noexcept
Exchanges the values of a and b.
An iterator to iterate over the data.
std::forward_iterator_tag iterator_category
tenno::vector< T, Allocator > & vec
iterator(tenno::vector< T, Allocator > &_vec, const tenno::size _index)
iterator & operator++() noexcept
tenno::expected< tenno::reference_wrapper< T >, tenno::error > get() noexcept
tenno::expected< tenno::reference_wrapper< T >, tenno::error > operator->() noexcept
tenno::expected< tenno::reference_wrapper< T >, tenno::error > operator*() noexcept
iterator operator++(T) noexcept
bool operator!=(const iterator &other) const noexcept
std::ptrdiff_t difference_type
bool operator==(const iterator &other) const noexcept
An reverse_iterator to iterate over the data.
tenno::expected< tenno::reference_wrapper< T >, tenno::error > get() noexcept
bool operator!=(const reverse_iterator &other) const noexcept
reverse_iterator operator++(T) noexcept
std::ptrdiff_t difference_type
std::forward_iterator_tag reverse_iterator_category
bool operator==(const reverse_iterator &other) const noexcept
tenno::expected< tenno::reference_wrapper< T >, tenno::error > operator*() noexcept
reverse_iterator(tenno::vector< T, Allocator > &_vec, const long long int _index)
reverse_iterator & operator++() noexcept
tenno::vector< T, Allocator > & vec
tenno::expected< tenno::reference_wrapper< T >, tenno::error > operator->() noexcept