|
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> |
@@ -231,7 +232,8 @@ class swizzled_vec { |
231 | 232 | swizzled_vec &operator=(const swizzled_vec &) = delete; |
232 | 233 | swizzled_vec &operator=(swizzled_vec &&) = delete; |
233 | 234 |
|
234 | | - swizzled_vec &operator=(const value_type &rhs) |
| 235 | + template<std::convertible_to<value_type> T> |
| 236 | + swizzled_vec &operator=(const T &rhs) |
235 | 237 | requires(allow_assign) |
236 | 238 | { |
237 | 239 | for(size_t i = 0; i < num_elements; ++i) { m_elems[indices[i]] = rhs; } |
@@ -537,7 +539,8 @@ class alignas(detail::vec_alignment_v<DataT, NumElements>) vec { |
537 | 539 | vec(const vec &) = default; |
538 | 540 | vec &operator=(const vec &rhs) = default; |
539 | 541 |
|
540 | | - vec &operator=(const DataT &rhs) { |
| 542 | + template<std::convertible_to<DataT> T> |
| 543 | + vec &operator=(const T &rhs) { |
541 | 544 | for(int i = 0; i < NumElements; ++i) { m_elems[i] = rhs; } |
542 | 545 | return *this; |
543 | 546 | } |
@@ -752,14 +755,16 @@ class alignas(detail::vec_alignment_v<DataT, NumElements>) vec { |
752 | 755 | for(int i = 0; i < NumElements; ++i) { result.m_elems[i] = lhs.m_elems[i] op rhs.m_elems[i]; } \ |
753 | 756 | return result; \ |
754 | 757 | } \ |
755 | | - friend vec operator op(const vec &lhs, const DataT &rhs) \ |
| 758 | + template<std::convertible_to<DataT> T> \ |
| 759 | + friend vec operator op(const vec &lhs, const T &rhs) \ |
756 | 760 | requires(enable_if) \ |
757 | 761 | { \ |
758 | 762 | vec result; \ |
759 | 763 | for(int i = 0; i < NumElements; ++i) { result.m_elems[i] = lhs.m_elems[i] op rhs; } \ |
760 | 764 | return result; \ |
761 | 765 | } \ |
762 | | - friend vec operator op(const DataT &lhs, const vec &rhs) \ |
| 766 | + template<std::convertible_to<DataT> T> \ |
| 767 | + friend vec operator op(const T &lhs, const vec &rhs) \ |
763 | 768 | requires(enable_if) \ |
764 | 769 | { \ |
765 | 770 | vec result; \ |
@@ -794,7 +799,8 @@ class alignas(detail::vec_alignment_v<DataT, NumElements>) vec { |
794 | 799 | for(int i = 0; i < NumElements; ++i) { lhs.m_elems[i] op rhs.m_elems[rhs.indices[i]]; } \ |
795 | 800 | return lhs; \ |
796 | 801 | } \ |
797 | | - friend vec &operator op(vec & lhs, const DataT & rhs) \ |
| 802 | + template<std::convertible_to<DataT> T> \ |
| 803 | + friend vec &operator op(vec & lhs, const T & rhs) \ |
798 | 804 | requires(enable_if) \ |
799 | 805 | { \ |
800 | 806 | for(int i = 0; i < NumElements; ++i) { lhs.m_elems[i] op rhs; } \ |
@@ -863,12 +869,14 @@ class alignas(detail::vec_alignment_v<DataT, NumElements>) vec { |
863 | 869 | for(int i = 0; i < NumElements; ++i) { result.m_elems[i] = lhs.m_elems[i] op rhs.m_elems[i]; } \ |
864 | 870 | return result; \ |
865 | 871 | } \ |
866 | | - friend vec<decltype(DataT {} op DataT{}), NumElements> operator op(const vec & lhs, const DataT & rhs) { \ |
| 872 | + template<std::convertible_to<DataT> T> \ |
| 873 | + friend vec<decltype(DataT {} op DataT{}), NumElements> operator op(const vec & lhs, const T & rhs) { \ |
867 | 874 | vec<decltype(DataT {} op DataT{}), NumElements> result; \ |
868 | 875 | for(int i = 0; i < NumElements; ++i) { result.m_elems[i] = lhs.m_elems[i] op rhs; } \ |
869 | 876 | return result; \ |
870 | 877 | } \ |
871 | | - friend vec<decltype(DataT {} op DataT{}), NumElements> operator op(const DataT & lhs, const vec & rhs) { \ |
| 878 | + template<std::convertible_to<DataT> T> \ |
| 879 | + friend vec<decltype(DataT {} op DataT{}), NumElements> operator op(const T & lhs, const vec & rhs) { \ |
872 | 880 | vec<decltype(DataT {} op DataT{}), NumElements> result; \ |
873 | 881 | for(int i = 0; i < NumElements; ++i) { result.m_elems[i] = lhs op rhs.m_elems[i]; } \ |
874 | 882 | return result; \ |
|
0 commit comments