9 #ifndef EAGINE_VECT_DATA_ARY_HPP
10 #define EAGINE_VECT_DATA_ARY_HPP
15 #include <type_traits>
18 namespace eagine::vect {
20 template <
typename T,
int N>
23 template <
typename T,
int N>
25 using type =
const _ary_data<T, N>&;
28 template <
typename T,
int N>
29 using _ary_param_t =
typename _ary_param<T, N>::type;
31 template <
typename T,
int N>
33 static_assert(std::is_nothrow_move_constructible_v<T>);
34 static_assert(std::is_nothrow_move_assignable_v<T>);
38 using type = _ary_data;
39 using param_t = _ary_param_t<T, N>;
41 _ary_data() =
default;
42 _ary_data(_ary_data&&) noexcept = default;
43 _ary_data(const _ary_data&) = default;
44 auto operator=(_ary_data&&) noexcept -> _ary_data& = default;
45 auto operator=(const _ary_data&) -> _ary_data& = default;
47 ~_ary_data() noexcept = default;
51 typename = std::enable_if_t<(N == 1) && (std::is_convertible_v<P, T>)>>
52 constexpr _ary_data(P&& p)
53 : _v{T(std::forward<P>(p))} {}
59 typename = std::enable_if_t<(
sizeof...(Pn) + 2) == N>>
60 constexpr _ary_data(P1&& p1, P2&& p2, Pn&&... pn)
62 T(std::forward<P1>(p1)),
63 T(std::forward<P2>(p2)),
64 T(std::forward<Pn>(pn))...} {}
66 constexpr
auto operator[](
int i)
const noexcept -> T {
70 inline auto operator[](
int i) noexcept -> T& {
74 constexpr
auto operator+=(_ary_data b) noexcept ->
auto& {
75 for(
int i = 0; i < N; ++i) {
81 constexpr
auto operator+=(T b) noexcept ->
auto& {
82 for(
int i = 0; i < N; ++i) {
88 constexpr
auto operator-=(_ary_data b) noexcept ->
auto& {
89 for(
int i = 0; i < N; ++i) {
95 constexpr
auto operator-=(T b) noexcept ->
auto& {
96 for(
int i = 0; i < N; ++i) {
102 constexpr
auto operator*=(_ary_data b) noexcept ->
auto& {
103 for(
int i = 0; i < N; ++i) {
109 constexpr
auto operator*=(T b) noexcept ->
auto& {
110 for(
int i = 0; i < N; ++i) {
116 constexpr
auto operator/=(_ary_data b) noexcept ->
auto& {
117 for(
int i = 0; i < N; ++i) {
123 constexpr
auto operator/=(T b) noexcept ->
auto& {
124 for(
int i = 0; i < N; ++i) {
130 friend constexpr
auto operator+(_ary_data a) noexcept {
134 friend auto operator-(_ary_data a) noexcept {
135 for(
int i = 0; i < N; ++i) {
141 friend auto operator+(param_t a, param_t b) noexcept {
143 for(
int i = 0; i < N; ++i) {
144 c._v[i] = a._v[i] + b._v[i];
149 friend auto operator+(param_t a, T b) noexcept {
151 for(
int i = 0; i < N; ++i) {
152 c._v[i] = a._v[i] + b;
157 friend auto operator-(param_t a, param_t b) noexcept {
159 for(
int i = 0; i < N; ++i) {
160 c._v[i] = a._v[i] - b._v[i];
165 friend auto operator-(param_t a, T b) noexcept {
167 for(
int i = 0; i < N; ++i) {
168 c._v[i] = a._v[i] - b;
173 friend auto operator*(param_t a, param_t b) noexcept {
175 for(
int i = 0; i < N; ++i) {
176 c._v[i] = a._v[i] * b._v[i];
181 friend auto operator*(param_t a, T b) noexcept {
183 for(
int i = 0; i < N; ++i) {
184 c._v[i] = a._v[i] * b;
189 friend auto operator/(param_t a, param_t b) noexcept {
191 for(
int i = 0; i < N; ++i) {
192 c._v[i] = a._v[i] / b._v[i];
197 friend auto operator/(param_t a, T b) noexcept {
199 for(
int i = 0; i < N; ++i) {
200 c._v[i] = a._v[i] / b;
206 template <
typename T>
207 struct _ary_data<T, 0U> {
208 using type = _ary_data;
210 auto operator[](
int i)
const -> T;
215 #endif // EAGINE_VECT_DATA_ARY_HPP