|
7 | 7 | #include "../detail/check.hh" |
8 | 8 | #include "../detail/utils.hh" |
9 | 9 |
|
| 10 | +#include <concepts> |
10 | 11 | #include <cstdint> |
11 | 12 | #include <cstdlib> |
12 | 13 | #include <type_traits> |
@@ -234,8 +235,9 @@ class swizzled_vec { |
234 | 235 | swizzled_vec &operator=(const swizzled_vec &) = delete; |
235 | 236 | swizzled_vec &operator=(swizzled_vec &&) = delete; |
236 | 237 |
|
237 | | - swizzled_vec &operator=(const value_type &rhs) |
238 | | - requires(allow_assign) |
| 238 | + template<typename T> |
| 239 | + swizzled_vec &operator=(const T &rhs) |
| 240 | + requires(allow_assign && std::convertible_to<T, value_type>) |
239 | 241 | { |
240 | 242 | for(size_t i = 0; i < num_elements; ++i) { m_elems[indices[i]] = rhs; } |
241 | 243 | return *this; |
@@ -540,7 +542,10 @@ class alignas(detail::vec_alignment_v<DataT, NumElements>) vec { |
540 | 542 | vec(const vec &) = default; |
541 | 543 | vec &operator=(const vec &rhs) = default; |
542 | 544 |
|
543 | | - vec &operator=(const DataT &rhs) { |
| 545 | + template<typename T> |
| 546 | + vec &operator=(const T &rhs) |
| 547 | + requires(std::convertible_to<T, DataT>) |
| 548 | + { |
544 | 549 | for(int i = 0; i < NumElements; ++i) { m_elems[i] = rhs; } |
545 | 550 | return *this; |
546 | 551 | } |
@@ -755,15 +760,17 @@ class alignas(detail::vec_alignment_v<DataT, NumElements>) vec { |
755 | 760 | for(int i = 0; i < NumElements; ++i) { result.m_elems[i] = lhs.m_elems[i] op rhs.m_elems[i]; } \ |
756 | 761 | return result; \ |
757 | 762 | } \ |
758 | | - friend vec operator op(const vec &lhs, const DataT &rhs) \ |
759 | | - requires(enable_if) \ |
| 763 | + template<typename T> \ |
| 764 | + friend vec operator op(const vec &lhs, const T &rhs) \ |
| 765 | + requires(enable_if && std::convertible_to<T, DataT>) \ |
760 | 766 | { \ |
761 | 767 | vec result; \ |
762 | 768 | for(int i = 0; i < NumElements; ++i) { result.m_elems[i] = lhs.m_elems[i] op rhs; } \ |
763 | 769 | return result; \ |
764 | 770 | } \ |
765 | | - friend vec operator op(const DataT &lhs, const vec &rhs) \ |
766 | | - requires(enable_if) \ |
| 771 | + template<typename T> \ |
| 772 | + friend vec operator op(const T &lhs, const vec &rhs) \ |
| 773 | + requires(enable_if && std::convertible_to<T, DataT>) \ |
767 | 774 | { \ |
768 | 775 | vec result; \ |
769 | 776 | for(int i = 0; i < NumElements; ++i) { result.m_elems[i] = lhs op rhs.m_elems[i]; } \ |
@@ -797,8 +804,9 @@ class alignas(detail::vec_alignment_v<DataT, NumElements>) vec { |
797 | 804 | for(int i = 0; i < NumElements; ++i) { lhs.m_elems[i] op rhs.m_elems[rhs.indices[i]]; } \ |
798 | 805 | return lhs; \ |
799 | 806 | } \ |
800 | | - friend vec &operator op(vec & lhs, const DataT & rhs) \ |
801 | | - requires(enable_if) \ |
| 807 | + template<typename T> \ |
| 808 | + friend vec &operator op(vec & lhs, const T & rhs) \ |
| 809 | + requires(enable_if && std::convertible_to<T, DataT>) \ |
802 | 810 | { \ |
803 | 811 | for(int i = 0; i < NumElements; ++i) { lhs.m_elems[i] op rhs; } \ |
804 | 812 | return lhs; \ |
@@ -866,12 +874,18 @@ class alignas(detail::vec_alignment_v<DataT, NumElements>) vec { |
866 | 874 | for(int i = 0; i < NumElements; ++i) { result.m_elems[i] = lhs.m_elems[i] op rhs.m_elems[i]; } \ |
867 | 875 | return result; \ |
868 | 876 | } \ |
869 | | - friend vec<decltype(DataT {} op DataT{}), NumElements> operator op(const vec & lhs, const DataT & rhs) { \ |
| 877 | + template<typename T> \ |
| 878 | + friend vec<decltype(DataT {} op DataT{}), NumElements> operator op(const vec & lhs, const T & rhs) \ |
| 879 | + requires(std::convertible_to<T, DataT>) \ |
| 880 | + { \ |
870 | 881 | vec<decltype(DataT {} op DataT{}), NumElements> result; \ |
871 | 882 | for(int i = 0; i < NumElements; ++i) { result.m_elems[i] = lhs.m_elems[i] op rhs; } \ |
872 | 883 | return result; \ |
873 | 884 | } \ |
874 | | - friend vec<decltype(DataT {} op DataT{}), NumElements> operator op(const DataT & lhs, const vec & rhs) { \ |
| 885 | + template<typename T> \ |
| 886 | + friend vec<decltype(DataT {} op DataT{}), NumElements> operator op(const T & lhs, const vec & rhs) \ |
| 887 | + requires(std::convertible_to<T, DataT>) \ |
| 888 | + { \ |
875 | 889 | vec<decltype(DataT {} op DataT{}), NumElements> result; \ |
876 | 890 | for(int i = 0; i < NumElements; ++i) { result.m_elems[i] = lhs op rhs.m_elems[i]; } \ |
877 | 891 | return result; \ |
|
0 commit comments