23#ifndef FROZEN_LETITGO_BASIC_TYPES_H
24#define FROZEN_LETITGO_BASIC_TYPES_H
41template <
class T, std::
size_t N>
44 std::size_t dsize = 0;
61 for (std::size_t i = 0; i < N; ++i)
82 constexpr void push_back(
const T & a) { data[dsize++] = a; }
83 constexpr void push_back(T && a) { data[dsize++] = std::move(a); }
86 constexpr void clear() { dsize = 0; }
89template <
class T, std::
size_t N>
93 template <
class Iter, std::size_t... I>
94 constexpr carray(Iter iter, std::index_sequence<I...>)
95 : data_{((void)I, *iter++)...} {}
96 template <std::size_t... I>
97 constexpr carray(
const T& value, std::index_sequence<I...>)
98 : data_{((void)I, value)...} {}
100 static constexpr void check_initializer(std::initializer_list<T> init) {
102 constexpr_assert(init.size() == N,
"Cannot initialize a carray with an initializer list of different size.");
120 : carray(val,
std::make_index_sequence<N>()) {}
121 template <typename U, std::enable_if_t<std::is_convertible<U, T>::value, std::size_t> M>
123 : carray(init,
std::make_index_sequence<N>())
125 static_assert(M >= N,
"Cannot initialize a carray with an smaller array");
127 template <typename U, std::enable_if_t<std::is_convertible<U, T>::value, std::size_t> M>
128 constexpr carray(std::array<U, M>
const &init)
129 : carray(init.
begin(),
std::make_index_sequence<N>())
131 static_assert(M >= N,
"Cannot initialize a carray with an smaller array");
133 template <typename U, std::enable_if_t<std::is_convertible<U, T>::value>* =
nullptr>
134 constexpr carray(std::initializer_list<U> init)
135 : carray((check_initializer(init), init.
begin()),
std::make_index_sequence<N>())
138 template <typename U, std::enable_if_t<std::is_convertible<U, T>::value>* =
nullptr>
139 constexpr carray(
const carray<U, N>& rhs)
140 : carray(rhs.
begin(),
std::make_index_sequence<N>())
160 FROZEN_THROW_OR_ABORT(std::out_of_range(
"Index (" + std::to_string(index) +
") out of bound (" + std::to_string(N) +
')'));
165 FROZEN_THROW_OR_ABORT(std::out_of_range(
"Index (" + std::to_string(index) +
") out of bound (" + std::to_string(N) +
')'));
T value_type
Definition basic_types.h:183
value_type * pointer
Definition basic_types.h:186
const value_type * const_pointer
Definition basic_types.h:187
const_pointer const_iterator
Definition basic_types.h:189
value_type & reference
Definition basic_types.h:184
std::size_t size_type
Definition basic_types.h:190
std::ptrdiff_t difference_type
Definition basic_types.h:191
const value_type & const_reference
Definition basic_types.h:185
constexpr carray(void)=default
pointer iterator
Definition basic_types.h:188
constexpr carray()=default
constexpr carray(std::array< U, M > const &init)
Definition basic_types.h:128
constexpr iterator end() noexcept
Definition basic_types.h:147
constexpr size_type size() const
Definition basic_types.h:151
constexpr reference at(std::size_t index)
Definition basic_types.h:158
constexpr const_reference operator[](std::size_t index) const
Definition basic_types.h:156
constexpr carray(U const (&init)[M])
Definition basic_types.h:122
constexpr size_type max_size() const
Definition basic_types.h:152
constexpr carray(const carray< U, N > &rhs)
Definition basic_types.h:139
constexpr const_reference front() const
Definition basic_types.h:170
constexpr reference front()
Definition basic_types.h:169
constexpr value_type * data() noexcept
Definition basic_types.h:175
const value_type & const_reference
Definition basic_types.h:109
constexpr const_iterator end() const noexcept
Definition basic_types.h:148
value_type * pointer
Definition basic_types.h:110
constexpr carray(std::initializer_list< U > init)
Definition basic_types.h:134
std::ptrdiff_t difference_type
Definition basic_types.h:115
const_pointer const_iterator
Definition basic_types.h:113
constexpr reference operator[](std::size_t index)
Definition basic_types.h:155
constexpr const_iterator begin() const noexcept
Definition basic_types.h:146
constexpr iterator begin() noexcept
Definition basic_types.h:145
pointer iterator
Definition basic_types.h:112
constexpr carray(const value_type &val)
Definition basic_types.h:119
const value_type * const_pointer
Definition basic_types.h:111
constexpr const_reference back() const
Definition basic_types.h:173
std::size_t size_type
Definition basic_types.h:114
constexpr const value_type * data() const noexcept
Definition basic_types.h:176
constexpr reference back()
Definition basic_types.h:172
std::ptrdiff_t value_type
Definition basic_types.h:107
constexpr const_reference at(std::size_t index) const
Definition basic_types.h:163
value_type & reference
Definition basic_types.h:108
value_type * pointer
Definition basic_types.h:51
constexpr void pop_back()
Definition basic_types.h:84
std::ptrdiff_t difference_type
Definition basic_types.h:56
constexpr void push_back(const T &a)
Definition basic_types.h:82
std::size_t size_type
Definition basic_types.h:55
constexpr const_reference operator[](std::size_t index) const
Definition basic_types.h:76
constexpr size_type size() const
Definition basic_types.h:72
constexpr const_iterator begin() const noexcept
Definition basic_types.h:68
pointer iterator
Definition basic_types.h:53
value_type & reference
Definition basic_types.h:49
constexpr cvector(void)=default
constexpr void clear()
Definition basic_types.h:86
const_pointer const_iterator
Definition basic_types.h:54
constexpr reference operator[](std::size_t index)
Definition basic_types.h:75
constexpr cvector(size_type count, const T &value)
Definition basic_types.h:60
const value_type & const_reference
Definition basic_types.h:50
constexpr reference back()
Definition basic_types.h:78
constexpr void push_back(T &&a)
Definition basic_types.h:83
constexpr const_reference back() const
Definition basic_types.h:79
const value_type * const_pointer
Definition basic_types.h:52
T value_type
Definition basic_types.h:48
constexpr iterator begin() noexcept
Definition basic_types.h:66
constexpr iterator end() noexcept
Definition basic_types.h:67
constexpr const_iterator end() const noexcept
Definition basic_types.h:69
#define constexpr_assert(cond, msg)
Definition constexpr_assert.h:31
#define FROZEN_THROW_OR_ABORT(_)
Definition exceptions.h:29
Definition algorithms.h:33
Definition algorithm.h:30
Definition basic_types.h:39