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