ActiveLib
Loading...
Searching...
No Matches
Vector.h
1
6#ifndef ACTIVE_CONTAINER_VECTOR
7#define ACTIVE_CONTAINER_VECTOR
8
9#include "Active/Utility/Cloner.h"
10#include "Active/Utility/Mover.h"
11
12#include <vector>
13
14namespace active::container {
15
25 template<class T> requires utility::Clonable<T>
26 class Vector : public std::vector<std::unique_ptr<T>> {
27 public:
28
29 // MARK: Types
30
32 using base = std::vector<std::unique_ptr<T>>;
34 using value_type = typename base::value_type;
36 using size_type = typename base::size_type;
38 using iterator = typename base::iterator;
40 using const_iterator = typename base::const_iterator;
41
42 // MARK: Constructors
43
48 Vector(size_type toReserve = 0) : base() { if (toReserve != 0) base::reserve(toReserve); }
53 template<class Derived>
54 explicit Vector(const std::initializer_list<Derived>& items) : base() {
55 for (const auto& item : items)
56 emplace_back(item);
57 }
62 Vector(const Vector& source) : base() { cloneFrom(source); }
67 Vector(Vector&& source) : base(std::move(source)) {}
71 virtual ~Vector() = default;
72
73 // MARK: Operators
74
80 auto operator= (const Vector& source) {
81 if (this != &source) {
82 base::clear();
83 cloneFrom(source);
84 }
85 return *this;
86 }
92 auto operator= (Vector&& source) {
93 if (this != &source)
94 base::operator=(std::move(source));
95 return *this;
96 }
97
98 // MARK: Functions (mutating)
99
104 void push_back(T* item) { base::push_back(value_type{item}); }
109 void emplace_back(T&& item) {
110 if constexpr(utility::Movable<T>)
111 base::emplace_back(cloneMove(std::move(item)));
112 else
113 base::emplace_back(clone(item));
114 }
119 void emplace_back(const T& item) { base::emplace_back(clone(item)); }
124 void emplace_back(value_type&& item) { base::emplace_back(std::move(item)); }
129 void emplace_back(value_type& item) { base::emplace_back(std::move(item)); }
135 auto insert(const_iterator pos, T* item) { return base::insert(pos, value_type{item}); }
142 auto emplace(const_iterator pos, T&& item) {
143 if constexpr(utility::Movable<decltype(item)>)
144 return base::emplace(pos, cloneMove(item));
145 else
146 return base::emplace(pos, clone(item));
147 }
154 auto emplace(const_iterator pos, value_type& item) { return base::emplace(pos, std::move(item)); }
160 auto release(iterator& pos) { return release(const_iterator(pos)); }
167 auto item = std::move(const_cast<value_type&>(*pos));
168 base::erase(pos);
169 return item;
170 }
171
172 private:
177 void cloneFrom(const Vector& source) {
178 base::reserve(source.size());
179 for (const auto& item : source)
180 base::push_back(item ? clone(*item) : value_type());
181 }
182 };
183
184}
185
186#endif //ACTIVE_CONTAINER_VECTOR
Definition Vector.h:26
void emplace_back(T &&item)
Definition Vector.h:109
void emplace_back(const T &item)
Definition Vector.h:119
auto emplace(const_iterator pos, value_type &item)
Definition Vector.h:154
auto release(iterator &pos)
Definition Vector.h:160
typename base::size_type size_type
Container size (index) type.
Definition Vector.h:36
virtual ~Vector()=default
auto emplace(const_iterator pos, T &&item)
Definition Vector.h:142
typename base::iterator iterator
Container iterator type.
Definition Vector.h:38
auto operator=(const Vector &source)
Definition Vector.h:80
Vector(const Vector &source)
Definition Vector.h:62
void emplace_back(value_type &item)
Definition Vector.h:129
Vector(size_type toReserve=0)
Definition Vector.h:48
auto insert(const_iterator pos, T *item)
Definition Vector.h:135
void push_back(T *item)
Definition Vector.h:104
std::vector< std::unique_ptr< T > > base
Base container type.
Definition Vector.h:32
typename base::const_iterator const_iterator
Container const iterator type.
Definition Vector.h:40
Vector(Vector &&source)
Definition Vector.h:67
void emplace_back(value_type &&item)
Definition Vector.h:124
auto release(const_iterator pos)
Definition Vector.h:166
typename base::value_type value_type
Stored type.
Definition Vector.h:34
Vector(const std::initializer_list< Derived > &items)
Definition Vector.h:54
Movable concept for classes/functions dependent on cloning with a move.
Definition Mover.h:33
Definition HashMap.h:14