From cc80743d5b81044b7692064647756632a8a712b8 Mon Sep 17 00:00:00 2001 From: Gabriel Mitterrutzner Date: Mon, 27 Jan 2025 18:06:39 +0100 Subject: [PATCH 1/2] Fix vec constructors --- include/simsycl/sycl/vec.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/simsycl/sycl/vec.hh b/include/simsycl/sycl/vec.hh index cdc5718..a5ead20 100644 --- a/include/simsycl/sycl/vec.hh +++ b/include/simsycl/sycl/vec.hh @@ -515,7 +515,7 @@ class alignas(detail::vec_alignment_v) vec { vec() = default; - explicit constexpr vec(const DataT &arg) { + explicit(num_elements > 1) constexpr vec(const DataT &arg) { for(int i = 0; i < NumElements; ++i) { m_elems[i] = arg; } } From bf7fe2a5323476c5d80cf8e939d2294cce8cf82f Mon Sep 17 00:00:00 2001 From: Gabriel Mitterrutzner Date: Mon, 27 Jan 2025 18:24:50 +0100 Subject: [PATCH 2/2] Add explicit conversion to vec --- include/simsycl/sycl/vec.hh | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/include/simsycl/sycl/vec.hh b/include/simsycl/sycl/vec.hh index a5ead20..d029b0a 100644 --- a/include/simsycl/sycl/vec.hh +++ b/include/simsycl/sycl/vec.hh @@ -69,6 +69,11 @@ template concept VecCompatible = vec_like_num_elements::value == 1 || vec_like_num_elements::value == NumElements; +template +concept implicitly_convertible = requires { std::is_convertible_v; }; + +template +concept explicitly_convertible = requires { static_cast(std::declval()); }; template struct no_repeat_indices; @@ -261,6 +266,13 @@ class swizzled_vec { return m_elems[indices[0]]; } + template + explicit operator T() const + requires(num_elements == 1 && detail::explicitly_convertible) + { + return m_elems[indices[0]]; + } + static constexpr size_t byte_size() noexcept { return sycl::vec::byte_size(); } static constexpr size_t size() noexcept { return num_elements; } @@ -548,6 +560,13 @@ class alignas(detail::vec_alignment_v) vec { return m_elems[0]; } + template + explicit operator T() const + requires(NumElements == 1 && detail::explicitly_convertible) + { + return m_elems[0]; + } + static constexpr size_t byte_size() noexcept { return sizeof m_elems; } static constexpr size_t size() noexcept { return NumElements; }