24 template<
typename R,
size_t N>
27 requires { std::remove_cvref_t<R>::extent; }
and
28 std::remove_cvref_t<R>::extent >=
N and
29 std::remove_cvref_t<R>::extent != std::dynamic_extent
33 requires {
typename std::tuple_size <std::remove_cvref_t<R>>; }
and
34 std::tuple_size<std::remove_cvref_t<R>>::value >=
N
38 template<
typename R,
size_t N>
41 requires { std::remove_cvref_t<R>::extent; }
and
42 std::remove_cvref_t<R>::extent ==
N and
43 std::remove_cvref_t<R>::extent != std::dynamic_extent
47 requires {
typename std::tuple_size<std::remove_cvref_t<R>>; }
and
48 std::tuple_size<std::remove_cvref_t<R>>::value ==
N
51 template<
typename T,
size_t N>
52 requires (
N != std::dynamic_extent)
61 template<
typename T,
size_t N>
82 explicit constexpr Vector(
const T& value) :
89 (
sizeof...(Elements) ==
N)
and
90 (std::constructible_from<T, Elements>
and ...)
92 explicit (not (std::convertible_to<Elements, T>
and ...))
94 data_{
static_cast<T>(std::forward<Elements>(
elements))...}
98 template<std::ranges::contiguous_range R>
100 detail::CompileTimeSizeGreaterThanOrEqualTo<R, N>
and
101 std::constructible_from<T, typename std::remove_cvref_t<R>::value_type>
103 explicit (not std::convertible_to<
typename std::remove_cvref_t<R>::value_type,
T>)
109 template<
typename U,
size_t M,
typename...
Elements>
113 std::constructible_from<T, U>
and
114 (std::constructible_from<T, Elements>
and ...)
117 Vector{
v, std::make_index_sequence<M>{}, std::forward<Elements>(
elements)...}
128 detail::CompileTimeSizeGreaterThanOrEqualTo<
R,
N>
and
133 copy_or_move_assign(std::forward<R>(r), std::make_index_sequence<N>{});
197 constexpr operator std::span< T, N>() {
return {data(), size()}; }
198 constexpr operator std::span<const T, N>()
const {
return {data(), size()}; }
205 [&]<
size_t...
Is>(std::index_sequence<
Is...>)
207 ((data_[
Is] +=
rhs), ...);
208 }(std::make_index_sequence<N>{});
213 template<std::ranges::contiguous_range R>
220 [&]<
size_t...
Is>(std::index_sequence<
Is...>)
223 }(std::make_index_sequence<N>{});
232 [&]<
size_t...
Is>(std::index_sequence<
Is...>)
234 ((data_[
Is] -=
rhs), ...);
235 }(std::make_index_sequence<N>{});
240 template<std::ranges::contiguous_range R>
247 [&]<
size_t...
Is>(std::index_sequence<
Is...>)
250 }(std::make_index_sequence<N>{});
259 [&]<
size_t...
Is>(std::index_sequence<
Is...>)
261 ((data_[
Is] *=
rhs), ...);
262 }(std::make_index_sequence<N>{});
267 template<std::ranges::contiguous_range R>
274 [&]<
size_t...
Is>(std::index_sequence<
Is...>)
277 }(std::make_index_sequence<N>{});
286 [&]<
size_t...
Is>(std::index_sequence<
Is...>)
288 ((data_[
Is] /=
rhs), ...);
289 }(std::make_index_sequence<N>{});
294 template<std::ranges::contiguous_range R>
301 [&]<
size_t...
Is>(std::index_sequence<
Is...>)
304 }(std::make_index_sequence<N>{});
310 requires (
requires(
T&
t) { ++
t; })
312 [
this]<
size_t...
Is>(std::index_sequence<
Is...>)
315 }(std::make_index_sequence<N>{});
321 requires (
requires(
T&
t) { --
t; })
323 [
this]<
size_t...
Is>(std::index_sequence<
Is...>)
326 }(std::make_index_sequence<N>{});
332 requires (
requires(
T&
t) { ++
t; })
341 requires (
requires(
T&
t) { --
t; })
350 requires std::constructible_from<T, U>
360 template<
size_t...
Is>
361 constexpr Vector(
const T& value, std::index_sequence<Is...>) :
366 template<
class R,
class U>
367 static constexpr decltype(
auto) forward_range_element(
U&& x)
369 if constexpr (std::is_rvalue_reference_v<R&&>) {
373 return std::forward<U>(x);
378 template<std::ranges::contiguous_range
R,
size_t...
Is>
379 constexpr Vector(
R&& r, std::index_sequence<Is...>) :
384 template<
typename U,
size_t M,
size_t...
Is,
typename...
Elements>
389 template<std::ranges::contiguous_range
R,
size_t...
Is>
390 constexpr void copy_or_move_assign(
R&& r, std::index_sequence<Is...>)
395 std::array<T, N> data_{};
399 template<
typename T,
size_t N>
400 requires (
requires (
const Vector<T, N>& v) { +v[0]; })
403 return [&]<
size_t... Is>(std::index_sequence<Is...>)
405 return Vector<std::remove_cvref_t<
decltype(+vec[0])>,
N>{+vec[Is]...};
406 }(std::make_index_sequence<N>{});
410 template<
typename T,
size_t N>
411 requires (
requires (
const Vector<T, N>& v) { -v[0]; })
414 return [&]<
size_t... Is>(std::index_sequence<Is...>)
416 return Vector<std::remove_cvref_t<
decltype(-vec[0])>,
N>{-vec[Is]...};
417 }(std::make_index_sequence<N>{});
421 template<
typename T,
size_t N>
422 requires (
requires (
const Vector<T, N>& v) { !v[0]; })
425 return [&]<
size_t... Is>(std::index_sequence<Is...>)
427 return Vector<std::remove_cvref_t<
decltype(!vec[0])>,
N>{!vec[Is]...};
428 }(std::make_index_sequence<N>{});
432 template<
typename T,
size_t N,
typename U>
434 requires (
const Vector<T, N>& v,
const U& rhs) { v[0] + rhs; }
438 return [&]<
size_t... Is>(std::index_sequence<Is...>)
440 return Vector<std::remove_cvref_t<
decltype(lhs[0] + rhs)>,
N>{(lhs[Is] + rhs)...};
441 }(std::make_index_sequence<N>{});
445 template<
typename T,
typename U,
size_t N>
447 requires (
const T& lhs,
const Vector<U, N>& rhs) { lhs + rhs[0]; }
451 return [&]<
size_t... Is>(std::index_sequence<Is...>)
453 return Vector<std::remove_cvref_t<
decltype(lhs + rhs[0])>,
N>{(lhs + rhs[Is])...};
454 }(std::make_index_sequence<N>{});
458 template<
typename T,
typename U,
size_t N>
459 requires (
requires (
const Vector<T, N>& lhs,
const Vector<U, N>& rhs) { lhs[0] + rhs[0]; })
462 return [&]<
size_t... Is>(std::index_sequence<Is...>)
464 return Vector<std::remove_cvref_t<
decltype(lhs[0] + rhs[0])>,
N>{(lhs[Is] + rhs[Is])...};
465 }(std::make_index_sequence<N>{});
469 template<
typename T,
size_t N,
typename U>
470 requires (
requires (
const Vector<T, N>& v,
const U& rhs) { v[0] - rhs; })
473 return [&]<
size_t... Is>(std::index_sequence<Is...>)
475 return Vector<std::remove_cvref_t<
decltype(lhs[0] - rhs)>,
N>{(lhs[Is] - rhs)...};
476 }(std::make_index_sequence<N>{});
480 template<
typename T,
typename U,
size_t N>
481 requires (
requires (
const T& lhs,
const Vector<U, N>& rhs) { lhs - rhs[0]; })
484 return [&]<
size_t... Is>(std::index_sequence<Is...>)
486 return Vector<std::remove_cvref_t<
decltype(lhs - rhs[0])>,
N>{(lhs - rhs[Is])...};
487 }(std::make_index_sequence<N>{});
491 template<
typename T,
typename U,
size_t N>
492 requires (
requires (
const Vector<T, N>& lhs,
const Vector<U, N>& rhs) { lhs[0] - rhs[0]; })
495 return [&]<
size_t... Is>(std::index_sequence<Is...>)
497 return Vector<std::remove_cvref_t<
decltype(lhs[0] - rhs[0])>,
N>{(lhs[Is] - rhs[Is])...};
498 }(std::make_index_sequence<N>{});
502 template<
typename T,
size_t N,
typename U>
503 requires (
requires (
const Vector<T, N>& v,
const U& rhs) { v[0] * rhs; })
506 return [&]<
size_t... Is>(std::index_sequence<Is...>)
508 return Vector<std::remove_cvref_t<
decltype(lhs[0] * rhs)>,
N>{(lhs[Is] * rhs)...};
509 }(std::make_index_sequence<N>{});
513 template<
typename T,
typename U,
size_t N>
514 requires (
requires (
const T& lhs,
const Vector<U, N>& rhs) { U(lhs * rhs[0]); })
517 return [&]<
size_t... Is>(std::index_sequence<Is...>)
519 return Vector<std::remove_cvref_t<
decltype(lhs * rhs[0])>,
N>{(lhs * rhs[Is])...};
520 }(std::make_index_sequence<N>{});
524 template<
typename T,
typename U,
size_t N>
525 requires (
requires (
const Vector<T, N>& lhs,
const Vector<U, N>& rhs) { lhs[0] * rhs[0]; })
528 return [&]<
size_t... Is>(std::index_sequence<Is...>)
530 return Vector<std::remove_cvref_t<
decltype(lhs[0] * rhs[0])>,
N>{(lhs[Is] * rhs[Is])...};
531 }(std::make_index_sequence<N>{});
535 template<
typename T,
size_t N,
typename U>
536 requires (
requires (
const Vector<T, N>& v,
const U& rhs) { v[0] / rhs; })
539 return [&]<
size_t... Is>(std::index_sequence<Is...>)
541 return Vector<std::remove_cvref_t<
decltype(lhs[0] / rhs)>,
N>{(lhs[Is] / rhs)...};
542 }(std::make_index_sequence<N>{});
546 template<
typename T,
typename U,
size_t N>
547 requires (
requires (
const T& lhs,
const Vector<U, N>& rhs) { lhs / rhs[0]; })
550 return [&]<
size_t... Is>(std::index_sequence<Is...>)
552 return Vector<std::remove_cvref_t<
decltype(lhs / rhs[0])>,
N>{(lhs / rhs[Is])...};
553 }(std::make_index_sequence<N>{});
557 template<
typename T,
typename U,
size_t N>
558 requires (
requires (
const Vector<T, N>& lhs,
const Vector<U, N>& rhs) { lhs[0] / rhs[0]; })
561 return [&]<
size_t... Is>(std::index_sequence<Is...>)
563 return Vector<std::remove_cvref_t<
decltype(lhs[0] / rhs[0])>,
N>{(lhs[Is] / rhs[Is])...};
564 }(std::make_index_sequence<N>{});
568 template<detail::OutputStreamable T,
size_t N>
571 return out << std::format(
"{}", v);
575 template<
size_t I,
typename T,
size_t N>
579 template<
size_t I,
typename T,
size_t N>
583 template<
size_t I,
typename T,
size_t N>
587 template<
size_t I,
typename T,
size_t N>
593template<
typename T,
size_t N>
594struct std::formatter<
osc::Vector<T, N>> {
595 template<
class ParseCtx>
596 constexpr typename ParseCtx::iterator
parse(ParseCtx& ctx) {
return inner_.parse(ctx); }
598 template<
class FmtCtx>
601 auto it = std::ranges::copy(std::string_view{
"Vector("}, ctx.out()).out;
602 std::string_view delimeter;
603 for (
const auto& el : v) {
604 it = std::ranges::copy(delimeter, it).out;
606 it = inner_.format(el, ctx);
613 std::formatter<T> inner_;
617template<
typename T,
size_t N>
618struct std::tuple_size<
osc::Vector<T, N>> : std::integral_constant<size_t, N> {};
621template<
size_t I,
typename T,
size_t N>
625template<
typename T,
size_t N>
626struct std::hash<
osc::Vector<T, N>> final {
constexpr reference x()
Returns (*this)[0]
Definition vector.h:157
constexpr reference z()
Returns (*this)[2]
Definition vector.h:167
value_type & reference
Definition vector.h:68
const value_type & const_reference
Definition vector.h:69
constexpr Vector(Vector &&)=default
constexpr reference w()
Returns (*this)[3]
Definition vector.h:172
constexpr Vector & operator--()
Definition vector.h:320
constexpr const_iterator end() const
Definition vector.h:150
constexpr Vector & operator++()
Definition vector.h:309
constexpr const_pointer data() const
Definition vector.h:142
ptrdiff_t difference_type
Definition vector.h:67
constexpr const_iterator begin() const
Definition vector.h:146
constexpr Vector operator++(int)
Definition vector.h:331
constexpr Vector< T, 2 > yx() const
Returns Vector<T, 2>{y(), x()}
Definition vector.h:183
T value_type
Definition vector.h:65
friend constexpr auto operator<=>(const Vector &, const Vector &)=default
constexpr const_reference y() const
Returns (*this)[0]
Definition vector.h:164
constexpr const_reference z() const
Returns (*this)[0]
Definition vector.h:169
constexpr reference y()
Returns (*this)[1]
Definition vector.h:162
constexpr const_reference operator[](size_type pos) const
Definition vector.h:154
constexpr reference operator[](size_type pos)
Definition vector.h:153
constexpr Vector(const Vector< U, M > &v, Elements &&... elements)
Definition vector.h:116
const T * const_pointer
Definition vector.h:71
constexpr pointer data()
Definition vector.h:141
constexpr Vector with_element(size_type pos, U value) const
Definition vector.h:351
T * iterator
Definition vector.h:72
constexpr iterator begin()
Definition vector.h:145
~Vector() noexcept=default
constexpr Vector< T, 2 > yz() const
Returns {y(), z()}
Definition vector.h:186
T * pointer
Definition vector.h:70
not std::convertible_to< typename std::remove_cvref_t< R >::value_type, T > constexpr Vector(R &&r)
Definition vector.h:104
constexpr Vector< T, 2 > zx() const
Returns {z(), x()}
Definition vector.h:189
constexpr Vector()=default
constexpr Vector operator--(int)
Definition vector.h:340
constexpr iterator end()
Definition vector.h:149
constexpr const_reference x() const
Returns (*this)[0]
Definition vector.h:159
constexpr Vector< T, 2 > xz() const
Returns Vector<T, 2>{x(), z()}
Definition vector.h:180
constexpr Vector(const Vector &)=default
size_t size_type
Definition vector.h:66
constexpr const_reference w() const
Returns (*this)[0]
Definition vector.h:174
constexpr Vector< T, 2 > zy() const
Returns {z(), y()}
Definition vector.h:192
constexpr Vector< T, 2 > xy() const
Returns Vector<T, 2>{x(), y()}
Definition vector.h:177
constexpr Vector(const T &value)
Definition vector.h:82
const T * const_iterator
Definition vector.h:73
constexpr size_type size() const
Definition vector.h:138
constexpr size_t compile_time_size(std::span< T, N >)
Definition vector.h:53
Definition custom_decoration_generator.h:5
bool operator==(const Class &, const Class &)
constexpr const T & get(const Rgb< T > &v)
Definition rgb.h:88
constexpr U to(T &&value)
Definition conversion.h:56
and
Definition algorithms.h:158
size_t hash_range(const Range &range) noexcept(noexcept(hash_combine(0, *std::ranges::begin(range))))
Definition hash_helpers.h:36
size_t operator()(const osc::Vector< T, N > &vec) const noexcept(noexcept(osc::hash_range(vec)))
Definition vector.h:627
T type
Definition vector.h:623