Skip to content

Commit fb67598

Browse files
GagaLPPeterTh
authored andcommitted
Fix 1-element vec ambiguities
1 parent 3d546be commit fb67598

1 file changed

Lines changed: 15 additions & 7 deletions

File tree

include/simsycl/sycl/vec.hh

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include "../detail/check.hh"
88
#include "../detail/utils.hh"
99

10+
#include <concepts>
1011
#include <cstdint>
1112
#include <cstdlib>
1213
#include <type_traits>
@@ -231,7 +232,8 @@ class swizzled_vec {
231232
swizzled_vec &operator=(const swizzled_vec &) = delete;
232233
swizzled_vec &operator=(swizzled_vec &&) = delete;
233234

234-
swizzled_vec &operator=(const value_type &rhs)
235+
template<std::convertible_to<value_type> T>
236+
swizzled_vec &operator=(const T &rhs)
235237
requires(allow_assign)
236238
{
237239
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 {
537539
vec(const vec &) = default;
538540
vec &operator=(const vec &rhs) = default;
539541

540-
vec &operator=(const DataT &rhs) {
542+
template<std::convertible_to<DataT> T>
543+
vec &operator=(const T &rhs) {
541544
for(int i = 0; i < NumElements; ++i) { m_elems[i] = rhs; }
542545
return *this;
543546
}
@@ -752,14 +755,16 @@ class alignas(detail::vec_alignment_v<DataT, NumElements>) vec {
752755
for(int i = 0; i < NumElements; ++i) { result.m_elems[i] = lhs.m_elems[i] op rhs.m_elems[i]; } \
753756
return result; \
754757
} \
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) \
756760
requires(enable_if) \
757761
{ \
758762
vec result; \
759763
for(int i = 0; i < NumElements; ++i) { result.m_elems[i] = lhs.m_elems[i] op rhs; } \
760764
return result; \
761765
} \
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) \
763768
requires(enable_if) \
764769
{ \
765770
vec result; \
@@ -794,7 +799,8 @@ class alignas(detail::vec_alignment_v<DataT, NumElements>) vec {
794799
for(int i = 0; i < NumElements; ++i) { lhs.m_elems[i] op rhs.m_elems[rhs.indices[i]]; } \
795800
return lhs; \
796801
} \
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) \
798804
requires(enable_if) \
799805
{ \
800806
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 {
863869
for(int i = 0; i < NumElements; ++i) { result.m_elems[i] = lhs.m_elems[i] op rhs.m_elems[i]; } \
864870
return result; \
865871
} \
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) { \
867874
vec<decltype(DataT {} op DataT{}), NumElements> result; \
868875
for(int i = 0; i < NumElements; ++i) { result.m_elems[i] = lhs.m_elems[i] op rhs; } \
869876
return result; \
870877
} \
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) { \
872880
vec<decltype(DataT {} op DataT{}), NumElements> result; \
873881
for(int i = 0; i < NumElements; ++i) { result.m_elems[i] = lhs op rhs.m_elems[i]; } \
874882
return result; \

0 commit comments

Comments
 (0)