17 namespace __ESIMD_NS {
33 template <
typename BaseTy,
35 region1d_t<typename BaseTy::element_type, BaseTy::length, 1>>
36 class simd_view :
public detail::simd_view_impl<BaseTy, RegionTy> {
38 template <
typename,
int,
class,
class>
friend class detail::simd_obj_impl;
39 template <
typename,
int>
friend class detail::simd_mask_impl;
40 template <
typename,
typename>
friend class simd_view;
41 template <
typename,
int>
friend class simd;
42 template <
typename,
typename>
friend class detail::simd_view_impl;
45 using BaseClass = detail::simd_view_impl<BaseTy, RegionTy>;
47 using ShapeTy =
typename shape_type<RegionTy>::type;
48 using base_type = BaseTy;
49 template <
typename ElT,
int N>
50 using get_simd_t =
typename BaseClass::template get_simd_t<ElT, N>;
54 static_assert(detail::is_simd_obj_impl_derivative_v<BaseTy>);
56 static constexpr
int length = ShapeTy::Size_x * ShapeTy::Size_y;
70 detail::vector_type_t<detail::__raw_t<element_type>,
length>;
74 simd_view(BaseTy &Base, RegionTy Region) : BaseClass(Base, Region) {}
75 simd_view(BaseTy &&Base, RegionTy Region) : BaseClass(Base, Region) {}
80 simd_view(
const simd_view &Other) =
default;
81 simd_view(simd_view &&Other) =
default;
89 BaseClass::operator=(Other);
93 using BaseClass::operator--;
94 using BaseClass::operator++;
95 using BaseClass::operator=;
98 #define __ESIMD_DEF_SCALAR_SIMD_VIEW_RELOP(RELOP) \
100 ESIMD_INLINE friend bool operator RELOP(const simd_view &X, \
101 const simd_view &Y) { \
102 return (element_type)X RELOP(element_type) Y; \
106 template <typename T1, \
107 std::enable_if_t<detail::is_valid_simd_elem_type_v<T1>>> \
108 ESIMD_INLINE friend bool operator RELOP(const simd_view &X, T1 Y) { \
109 return (element_type)X RELOP Y; \
113 template <typename T1, \
114 std::enable_if_t<detail::is_valid_simd_elem_type_v<T1>>> \
115 ESIMD_INLINE friend bool operator RELOP(T1 X, const simd_view &Y) { \
116 return X RELOP(element_type) Y; \
130 template <
typename BaseTy,
class ViewedElemT>
132 :
public detail::simd_view_impl<BaseTy, region1d_scalar_t<ViewedElemT>> {
134 template <
typename,
typename>
friend class detail::simd_view_impl;
138 using BaseClass = detail::simd_view_impl<BaseTy, RegionTy>;
139 using ShapeTy =
typename shape_type<RegionTy>::type;
140 static constexpr
int length = ShapeTy::Size_x * ShapeTy::Size_y;
141 static_assert(1 ==
length,
"length of this view is not equal to 1");
142 static_assert(std::is_same_v<typename ShapeTy::element_type, ViewedElemT>);
147 template <
typename ElT,
int N>
154 simd_view(BaseTy &&Base, RegionTy Region) : BaseClass(Base, Region) {}
161 const auto v = BaseClass::read().data();
162 return detail::bitcast_to_wrapper_type<element_type>(std::move(v)[0]);
165 using BaseClass::operator--;
166 using BaseClass::operator++;
167 using BaseClass::operator=;
185 template <typename BaseTy, typename NestedRegion, class ViewedElemT>
186 class
simd_view<BaseTy,
std::pair<region1d_scalar_t<ViewedElemT>, NestedRegion>>
187 : public detail::simd_view_impl<
188 BaseTy,
std::pair<region1d_scalar_t<ViewedElemT>, NestedRegion>> {
189 template <
typename,
int>
friend class simd;
190 template <
typename,
typename>
friend class detail::simd_view_impl;
193 using RegionTy = std::pair<region1d_scalar_t<ViewedElemT>, NestedRegion>;
194 using BaseClass = detail::simd_view_impl<BaseTy, RegionTy>;
195 using ShapeTy =
typename shape_type<RegionTy>::type;
196 static constexpr
int length = ShapeTy::Size_x * ShapeTy::Size_y;
197 static_assert(1 ==
length,
"length of this view is not equal to 1");
198 static_assert(std::is_same_v<typename ShapeTy::element_type, ViewedElemT>);
205 simd_view(BaseTy &&Base, RegionTy Region) : BaseClass(Base, Region) {}
208 using BaseClass::operator=;
211 const auto v = BaseClass::read();
212 return detail::convert_scalar<element_type>(v[0]);
223 #undef __ESIMD_DEF_SCALAR_SIMD_VIEW_RELOP