22#define CE_STATIC_VECTOR_ERROR_HANDLING_NONE 0
23#define CE_STATIC_VECTOR_ERROR_HANDLING_THROW 1
24#define CE_STATIC_VECTOR_ERROR_HANDLING_ASSERT 2
25#define CE_STATIC_VECTOR_ERROR_HANDLING_RESCUE 3
26#define CE_STATIC_VECTOR_ERROR_HANDLING_ASSERT_AND_THROW 4
27#define CE_STATIC_VECTOR_ERROR_HANDLING_ASSERT_AND_RESCUE 5
29#if !defined(CE_STATIC_VECTOR_ERROR_HANDLING)
30#define CE_STATIC_VECTOR_ERROR_HANDLING CE_STATIC_VECTOR_ERROR_HANDLING_THROW
33#if CE_STATIC_VECTOR_ERROR_HANDLING == CE_STATIC_VECTOR_ERROR_HANDLING_NONE
34#define CE_STATIC_VECTOR_OUT_OF_RANGE_IF(cond, rescue_return)
35#elif CE_STATIC_VECTOR_ERROR_HANDLING == CE_STATIC_VECTOR_ERROR_HANDLING_THROW
37#define CE_STATIC_VECTOR_OUT_OF_RANGE_IF(cond, rescue_return) \
39 throw std::out_of_range("itlib::StaticVector out of range")
40#elif CE_STATIC_VECTOR_ERROR_HANDLING == CE_STATIC_VECTOR_ERROR_HANDLING_ASSERT
42#define CE_STATIC_VECTOR_OUT_OF_RANGE_IF(cond, rescue_return) assert(!(cond) && "itlib::StaticVector out of range")
43#elif CE_STATIC_VECTOR_ERROR_HANDLING == CE_STATIC_VECTOR_ERROR_HANDLING_RESCUE
44#define CE_STATIC_VECTOR_OUT_OF_RANGE_IF(cond, rescue_return) \
47#elif CE_STATIC_VECTOR_ERROR_HANDLING == CE_STATIC_VECTOR_ERROR_HANDLING_ASSERT_AND_THROW
50#define CE_STATIC_VECTOR_OUT_OF_RANGE_IF(cond, rescue_return) \
53 assert(false && "itlib::StaticVector out of range"); \
54 throw std::out_of_range("itlib::StaticVector out of range"); \
57#elif CE_STATIC_VECTOR_ERROR_HANDLING == CE_STATIC_VECTOR_ERROR_HANDLING_ASSERT_AND_RESCUE
59#define CE_STATIC_VECTOR_OUT_OF_RANGE_IF(cond, rescue_return) \
62 assert(false && "itlib::StaticVector out of range"); \
63 return rescue_return; \
67#error "Unknown CE_STATIC_VECTOR_ERRROR_HANDLING"
70#if defined(CE_STATIC_VECTOR_NO_DEBUG_BOUNDS_CHECK)
71#define CE_STATIC_VECTOR_BOUNDS_CHECK(i)
74#define CE_STATIC_VECTOR_BOUNDS_CHECK(i) assert((i) < this->size())
126 for(
const auto&
i :
v) {
134 for(
const auto&
i :
v) {
140 for(
auto i =
v.begin();
i !=
v.end(); ++
i) {
155 for(
auto&
elem :
v) {
164 for(
auto i =
v.begin();
i !=
v.end(); ++
i) {
174 return *
reinterpret_cast<const T*
>(
m_data +
i);
179 return *
reinterpret_cast<T*
>(
m_data +
i);
250 if(position ==
end()) {
257 for(
auto i =
end() - 2;
i != position; --
i) {
258 *
i = std::move(*(
i - 1));
269 if(position ==
end()) {
276 for(
auto i =
end() - 2;
i != position; --
i) {
277 *
i = std::move(*(
i - 1));
281 ::new(position)
T(std::forward<Args>(args)...);
291 *(
i - 1) = std::move(*
i);
337 typename std::aligned_storage<
sizeof(
T), std::alignment_of<T>::value>::type
m_data[
Capacity];
341 template<
typename T,
size_t CapacityA,
size_t CapacityB>
347 for(
size_t i = 0;
i < a.
size(); ++
i) {
356 template<
typename T,
size_t CapacityA,
size_t CapacityB>
362 for(
size_t i = 0;
i < a.
size(); ++
i) {
373template<
typename T,
size_t N>
struct std::hash<
CeresEngine::StaticVector<T, N>> {
375 constexpr size_t operator()(
const Type& obj)
const {
377 for(
const T& value : obj) {
#define CE_STATIC_VECTOR_OUT_OF_RANGE_IF(cond, rescue_return)
Definition StaticVector.hpp:37
#define CE_STATIC_VECTOR_BOUNDS_CHECK(i)
Definition StaticVector.hpp:74
Definition Application.hpp:19
constexpr void combine(std::size_t &seed, const T &v)
Generates a new hash for the provided type using the default standard hasher and combines it with a p...
Definition Hash.hpp:32
bool operator!=(const ShortAllocator< T, N, A1 > &x, const ShortAllocator< U, M, A2 > &y) noexcept
Definition Allocator.hpp:416
bool operator==(const ShortAllocator< T, N, A1 > &x, const ShortAllocator< U, M, A2 > &y) noexcept
Definition Allocator.hpp:411
constexpr CountAlgorithmFunctor count
Returns the number of elements matching an element.
Definition Count.hpp:82
constexpr size_t hash(const T &v)
Generates a hash for the provided type.
Definition Hash.hpp:25
Definition StaticVector.hpp:85
T * pointer
Definition StaticVector.hpp:87
T value_type
Definition StaticVector.hpp:86
const T * const_pointer
Definition StaticVector.hpp:88
StaticVector is almost a drop-in replacement of std::vector, but has a fixed capacity as a template a...
Definition StaticVector.hpp:84
StaticVector(const StaticVector &v)
Definition StaticVector.hpp:125
reference operator[](const size_type i)
Definition StaticVector.hpp:183
const_reverse_iterator rend() const noexcept
Definition StaticVector.hpp:205
StaticVector & operator=(const StaticVector &v)
Definition StaticVector.hpp:148
const_iterator begin() const noexcept
Definition StaticVector.hpp:196
const_reverse_iterator rbegin() const noexcept
Definition StaticVector.hpp:202
iterator erase(const_iterator position)
Definition StaticVector.hpp:286
size_t m_size
Definition StaticVector.hpp:338
reference front()
Definition StaticVector.hpp:186
T value_type
Definition StaticVector.hpp:92
iterator begin() noexcept
Definition StaticVector.hpp:195
size_t max_size() const noexcept
Definition StaticVector.hpp:211
const_pointer data() const noexcept
Definition StaticVector.hpp:191
const_reference at(size_type i) const
Definition StaticVector.hpp:172
StaticVector(std::initializer_list< T > l)
Definition StaticVector.hpp:117
const_reference operator[](const size_type i) const
Definition StaticVector.hpp:182
const_reverse_iterator crend() const noexcept
Definition StaticVector.hpp:206
T * pointer
Definition StaticVector.hpp:97
iterator insert(iterator position, const value_type &val)
Definition StaticVector.hpp:247
reference at(size_type i)
Definition StaticVector.hpp:177
StaticVector(StaticVector &&v) noexcept(std::is_nothrow_move_constructible< T >::value)
Definition StaticVector.hpp:139
std::reverse_iterator< iterator > reverse_iterator
Definition StaticVector.hpp:101
const_iterator cbegin() const noexcept
Definition StaticVector.hpp:197
size_t size() const noexcept
Definition StaticVector.hpp:210
StaticVector(const size_t count, const T &value)
Definition StaticVector.hpp:109
void swap(StaticVector &v)
Definition StaticVector.hpp:310
ptrdiff_t difference_type
Definition StaticVector.hpp:94
pointer data() noexcept
Definition StaticVector.hpp:192
bool empty() const noexcept
Definition StaticVector.hpp:209
const T * const_pointer
Definition StaticVector.hpp:98
void clear() noexcept
Definition StaticVector.hpp:220
~StaticVector()
Definition StaticVector.hpp:146
const T & const_reference
Definition StaticVector.hpp:96
void emplace_back(Args &&... args)
Definition StaticVector.hpp:240
const_reference back() const
Definition StaticVector.hpp:188
size_t capacity() const noexcept
Definition StaticVector.hpp:212
iterator emplace(iterator position, Args &&... args)
Definition StaticVector.hpp:266
const_reference front() const
Definition StaticVector.hpp:185
void push_back(T &&v)
Definition StaticVector.hpp:233
void push_back(const_reference v)
Definition StaticVector.hpp:226
StaticVector & operator=(StaticVector &&v) noexcept(std::is_nothrow_move_assignable< T >::value)
Definition StaticVector.hpp:162
iterator end() noexcept
Definition StaticVector.hpp:198
T * iterator
Definition StaticVector.hpp:99
reverse_iterator rend() noexcept
Definition StaticVector.hpp:204
StaticVector(const StaticVector< T, CapacityB > &v)
Definition StaticVector.hpp:131
const_iterator end() const noexcept
Definition StaticVector.hpp:199
const_iterator cend() const noexcept
Definition StaticVector.hpp:200
StaticVector(const size_t count)
Definition StaticVector.hpp:107
T & reference
Definition StaticVector.hpp:95
reverse_iterator rbegin() noexcept
Definition StaticVector.hpp:201
const T * const_iterator
Definition StaticVector.hpp:100
void pop_back()
Definition StaticVector.hpp:215
std::reverse_iterator< const_iterator > const_reverse_iterator
Definition StaticVector.hpp:102
size_t size_type
Definition StaticVector.hpp:93
const_reverse_iterator crbegin() const noexcept
Definition StaticVector.hpp:203
reference back()
Definition StaticVector.hpp:189
std::aligned_storage< sizeof(T), std::alignment_of< T >::value >::type m_data[Capacity]
Definition StaticVector.hpp:337
void resize(const size_type n)
Definition StaticVector.hpp:298