17 #include <type_traits>
30 template <
bool Is2D,
typename T,
int SizeY,
int Str
ideY,
int SizeX,
int Str
ideX>
32 using element_type =
T;
33 static constexpr
int length = SizeX * SizeY;
34 static constexpr
int Is_2D = Is2D;
35 static constexpr
int Size_x = SizeX;
36 static constexpr
int Stride_x = StrideX;
37 static constexpr
int Size_y = SizeY;
38 static constexpr
int Stride_y = StrideY;
39 static constexpr
int Size_in_bytes =
sizeof(
T) *
length;
41 static_assert(Size_x > 0 && Stride_x >= 0,
"illegal region in x-dimension");
42 static_assert(Size_y > 0 && Stride_y >= 0,
"illegal region in y-dimension");
47 explicit region_base() : M_offset_y(0), M_offset_x(0) {}
49 explicit region_base(uint16_t OffsetX) : M_offset_y(0), M_offset_x(OffsetX) {}
51 explicit region_base(uint16_t OffsetY, uint16_t OffsetX)
52 : M_offset_y(OffsetY), M_offset_x(OffsetX) {}
56 template <
typename T,
int Size,
int Str
ide>
57 using region1d_t = region_base<false, T, 1, 1, Size, Stride>;
60 template <
typename T,
int SizeY,
int Str
ideY,
int SizeX,
int Str
ideX>
61 using region2d_t = region_base<true, T, SizeY, StrideY, SizeX, StrideX>;
65 using region1d_scalar_t =
66 region_base<
false,
T, 1 , 1 , 1, 1>;
69 template <
typename BaseTy,
typename RegionTy>
class simd_view;
91 template <
typename Ty>
struct shape_type {
92 using element_type = Ty;
96 template <
typename Ty,
int Size,
int Str
ide>
97 struct shape_type<region1d_t<Ty, Size, Stride>> {
98 using element_type = Ty;
99 using type = region1d_t<Ty, Size, Stride>;
103 template <
typename Ty>
struct shape_type<region1d_scalar_t<Ty>> {
104 using element_type = Ty;
105 using type = region1d_t<Ty, 1, 1>;
109 template <
typename Ty,
int SizeY,
int Str
ideY,
int SizeX,
int Str
ideX>
110 struct shape_type<region2d_t<Ty, SizeY, StrideY, SizeX, StrideX>> {
111 using element_type = Ty;
112 using type = region2d_t<Ty, SizeY, StrideY, SizeX, StrideX>;
117 template <
typename TopRegionTy,
typename BaseRegionTy>
118 struct shape_type<
std::pair<TopRegionTy, BaseRegionTy>>
119 :
public shape_type<TopRegionTy> {};
122 template <
typename BaseTy,
typename RegionTy>
123 struct shape_type<simd_view<BaseTy, RegionTy>> :
public shape_type<RegionTy> {};
126 template <
typename T>
T getTopRegion(
T Reg) {
return Reg; }
127 template <
typename T,
typename U>
T getTopRegion(std::pair<T, U> Reg) {
131 template <
typename T>
T getBaseRegion(
T Reg) {
return Reg; }
132 template <
typename T,
typename U>
T getBaseRegion(std::pair<T, U> Reg) {