OGLplus  (0.59.0) a C++ wrapper for rendering APIs

data_ary.hpp
Go to the documentation of this file.
1 
9 #ifndef EAGINE_VECT_DATA_ARY_HPP
10 #define EAGINE_VECT_DATA_ARY_HPP
11 
12 #include "config.hpp"
13 #include "fwd.hpp"
14 #include <cstdint>
15 #include <type_traits>
16 #include <utility>
17 
18 namespace eagine::vect {
19 
20 template <typename T, int N>
21 struct _ary_data;
22 
23 template <typename T, int N>
24 struct _ary_param {
25  using type = const _ary_data<T, N>&;
26 };
27 
28 template <typename T, int N>
29 using _ary_param_t = typename _ary_param<T, N>::type;
30 
31 template <typename T, int N>
32 struct _ary_data {
33  static_assert(std::is_nothrow_move_constructible_v<T>);
34  static_assert(std::is_nothrow_move_assignable_v<T>);
35 
36  T _v[N];
37 
38  using type = _ary_data;
39  using param_t = _ary_param_t<T, N>;
40 
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;
46 
47  ~_ary_data() noexcept = default;
48 
49  template <
50  typename P,
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))} {}
54 
55  template <
56  typename P1,
57  typename P2,
58  typename... Pn,
59  typename = std::enable_if_t<(sizeof...(Pn) + 2) == N>>
60  constexpr _ary_data(P1&& p1, P2&& p2, Pn&&... pn)
61  : _v{
62  T(std::forward<P1>(p1)),
63  T(std::forward<P2>(p2)),
64  T(std::forward<Pn>(pn))...} {}
65 
66  constexpr auto operator[](int i) const noexcept -> T {
67  return _v[i];
68  }
69 
70  inline auto operator[](int i) noexcept -> T& {
71  return _v[i];
72  }
73 
74  constexpr auto operator+=(_ary_data b) noexcept -> auto& {
75  for(int i = 0; i < N; ++i) {
76  _v[i] += b[i];
77  }
78  return *this;
79  }
80 
81  constexpr auto operator+=(T b) noexcept -> auto& {
82  for(int i = 0; i < N; ++i) {
83  _v[i] += b;
84  }
85  return *this;
86  }
87 
88  constexpr auto operator-=(_ary_data b) noexcept -> auto& {
89  for(int i = 0; i < N; ++i) {
90  _v[i] -= b[i];
91  }
92  return *this;
93  }
94 
95  constexpr auto operator-=(T b) noexcept -> auto& {
96  for(int i = 0; i < N; ++i) {
97  _v[i] -= b;
98  }
99  return *this;
100  }
101 
102  constexpr auto operator*=(_ary_data b) noexcept -> auto& {
103  for(int i = 0; i < N; ++i) {
104  _v[i] *= b[i];
105  }
106  return *this;
107  }
108 
109  constexpr auto operator*=(T b) noexcept -> auto& {
110  for(int i = 0; i < N; ++i) {
111  _v[i] *= b;
112  }
113  return *this;
114  }
115 
116  constexpr auto operator/=(_ary_data b) noexcept -> auto& {
117  for(int i = 0; i < N; ++i) {
118  _v[i] /= b[i];
119  }
120  return *this;
121  }
122 
123  constexpr auto operator/=(T b) noexcept -> auto& {
124  for(int i = 0; i < N; ++i) {
125  _v[i] /= b;
126  }
127  return *this;
128  }
129 
130  friend constexpr auto operator+(_ary_data a) noexcept {
131  return a;
132  }
133 
134  friend auto operator-(_ary_data a) noexcept {
135  for(int i = 0; i < N; ++i) {
136  a._v[i] = -a._v[i];
137  }
138  return a;
139  }
140 
141  friend auto operator+(param_t a, param_t b) noexcept {
142  _ary_data c{};
143  for(int i = 0; i < N; ++i) {
144  c._v[i] = a._v[i] + b._v[i];
145  }
146  return c;
147  }
148 
149  friend auto operator+(param_t a, T b) noexcept {
150  _ary_data c{};
151  for(int i = 0; i < N; ++i) {
152  c._v[i] = a._v[i] + b;
153  }
154  return c;
155  }
156 
157  friend auto operator-(param_t a, param_t b) noexcept {
158  _ary_data c{};
159  for(int i = 0; i < N; ++i) {
160  c._v[i] = a._v[i] - b._v[i];
161  }
162  return c;
163  }
164 
165  friend auto operator-(param_t a, T b) noexcept {
166  _ary_data c{};
167  for(int i = 0; i < N; ++i) {
168  c._v[i] = a._v[i] - b;
169  }
170  return c;
171  }
172 
173  friend auto operator*(param_t a, param_t b) noexcept {
174  _ary_data c{};
175  for(int i = 0; i < N; ++i) {
176  c._v[i] = a._v[i] * b._v[i];
177  }
178  return c;
179  }
180 
181  friend auto operator*(param_t a, T b) noexcept {
182  _ary_data c{};
183  for(int i = 0; i < N; ++i) {
184  c._v[i] = a._v[i] * b;
185  }
186  return c;
187  }
188 
189  friend auto operator/(param_t a, param_t b) noexcept {
190  _ary_data c{};
191  for(int i = 0; i < N; ++i) {
192  c._v[i] = a._v[i] / b._v[i];
193  }
194  return c;
195  }
196 
197  friend auto operator/(param_t a, T b) noexcept {
198  _ary_data c{};
199  for(int i = 0; i < N; ++i) {
200  c._v[i] = a._v[i] / b;
201  }
202  return c;
203  }
204 };
205 
206 template <typename T>
207 struct _ary_data<T, 0U> {
208  using type = _ary_data;
209 
210  auto operator[](int i) const -> T;
211 };
212 
213 } // namespace eagine::vect
214 
215 #endif // EAGINE_VECT_DATA_ARY_HPP
static auto operator+(const fixed_size_string< N1 > &s1, const fixed_size_string< N2 > &s2) noexcept
Concatenation operator for fixed_size_string.
Definition: fixed_size_str.hpp:135

Copyright © 2015-2021 Matúš Chochlík.
<chochlik -at -gmail.com>
Documentation generated on Tue Apr 13 2021 by Doxygen (version 1.8.17).