44 #ifndef KOKKOS_KOKKOS_EXTENTS_HPP
45 #define KOKKOS_KOKKOS_EXTENTS_HPP
50 namespace Experimental {
52 constexpr ptrdiff_t dynamic_extent = -1;
54 template <ptrdiff_t... ExtentSpecs>
59 template <
class Exts, ptrdiff_t NewExtent>
62 template <ptrdiff_t... Exts, ptrdiff_t NewExtent>
64 Extents<Exts...>, NewExtent
66 using type = Extents<NewExtent, Exts...>;
69 template <
class Exts, ptrdiff_t NewExtent>
72 template <ptrdiff_t... Exts, ptrdiff_t NewExtent>
74 Extents<Exts...>, NewExtent
76 using type = Extents<Exts..., NewExtent>;
83 namespace _parse_view_extents_impl {
86 struct _all_remaining_extents_dynamic : std::true_type { };
89 struct _all_remaining_extents_dynamic<T*>
90 : _all_remaining_extents_dynamic<T>
93 template <
class T,
unsigned N>
94 struct _all_remaining_extents_dynamic<T[N]>
98 template <
class T,
class Result,
class=
void>
104 template <
class T, ptrdiff_t... ExtentSpec>
106 T*, Experimental::Extents<ExtentSpec...>,
107 typename std::enable_if<_all_remaining_extents_dynamic<T>::value>::type
110 T, Experimental::Extents<Experimental::dynamic_extent, ExtentSpec...>
115 template <
class T, ptrdiff_t... ExtentSpec>
117 T*, Experimental::Extents<ExtentSpec...>,
118 typename std::enable_if<not _all_remaining_extents_dynamic<T>::value>::type
121 using _next = Kokkos::Experimental::AppendExtent<
122 typename _parse_impl<T, Experimental::Extents<ExtentSpec...>,
void>::type,
123 Experimental::dynamic_extent
125 using type =
typename _next::type;
128 template <
class T, ptrdiff_t... ExtentSpec,
unsigned N>
130 T[N], Experimental::Extents<ExtentSpec...>, void
133 T, Experimental::Extents<ExtentSpec..., ptrdiff_t(N)>
139 template <
class DataType>
140 struct ParseViewExtents {
142 typename _parse_view_extents_impl
143 ::_parse_impl<DataType, Experimental::Extents<>>::type;
146 template <
class ValueType, ptrdiff_t Ext>
149 using type = ValueType[Ext];
152 template <
class ValueType>
153 struct ApplyExtent<ValueType, Experimental::dynamic_extent>
155 using type = ValueType*;
158 template <
class ValueType,
unsigned N, ptrdiff_t Ext>
159 struct ApplyExtent<ValueType[N], Ext>
161 using type =
typename ApplyExtent<ValueType, Ext>::type[N];
164 template <
class ValueType, ptrdiff_t Ext>
165 struct ApplyExtent<ValueType*, Ext>
167 using type = ValueType*[Ext];
170 template <
class ValueType>
171 struct ApplyExtent<ValueType*, Experimental::dynamic_extent>
173 using type =
typename ApplyExtent<ValueType, Experimental::dynamic_extent>::type*;
176 template <
class ValueType,
unsigned N>
177 struct ApplyExtent<ValueType[N], Experimental::dynamic_extent>
179 using type =
typename ApplyExtent<ValueType, Experimental::dynamic_extent>::type[N];
186 #endif //KOKKOS_KOKKOS_EXTENTS_HPP