10 #include <type_traits>
18 template<
typename T, std::
size_t Dim>
21 static constexpr std::size_t
rank = Dim;
26 template<std::
size_t Dim,
typename TA,
typename TB>
29 for(std::size_t i = 0; i < Dim; ++i)
36 template<std::
size_t Dim,
typename TA,
typename TB>
43 std::is_trivially_default_constructible_v<ArrayIndex<int, 1>>);
46 static_assert(std::is_trivially_copy_constructible_v<ArrayIndex<int, 1>>);
47 static_assert(std::is_trivially_move_constructible_v<ArrayIndex<int, 1>>);
48 static_assert(std::is_trivially_copy_assignable_v<ArrayIndex<int, 1>>);
49 static_assert(std::is_trivially_move_assignable_v<ArrayIndex<int, 1>>);
53 template<
typename Default,
typename... Ints>
59 template<
typename Default,
typename FirstInt,
typename... Ints>
62 static_assert(std::conjunction_v<std::is_same<FirstInt, Ints>...>,
"All index types must be the same");
68 template<
typename... Args>
74 template<
typename V,
size_t N>
75 struct std::tuple_size<
llama::
ArrayIndex<V, N>> : std::integral_constant<size_t, N>
80 template<
size_t I,
typename V,
size_t N>
92 template<
typename T, std::enable_if_t<std::is_
integral_v<T>,
int> = 0>
96 return static_cast<T
>(-1);
102 return i ==
static_cast<T
>(-1);
133 template<
typename T = std::size_t, T... Sizes>
136 static constexpr std::size_t
rank =
sizeof...(Sizes);
143 template<std::
size_t I>
146 using TypeList = mp_list_c<T, Sizes...>;
147 constexpr
auto extent = mp_at_c<TypeList, I>::value;
148 if constexpr(extent !=
dyn)
152 *
this)[+mp_count<mp_take_c<TypeList, I>, std::integral_constant<T, dyn>>::value];
157 return mp_with_index<rank>(i, [&](
auto ic)
LLAMA_LAMBDA_INLINE {
return get<decltype(ic)::value>(); });
161 template<std::size_t... Is>
164 return {get<Is>()...};
170 return toArray(std::make_index_sequence<rank>{});
178 static constexpr std::size_t
rank = 0;
192 template<
typename... Args>
197 static_assert(std::is_trivially_default_constructible_v<ArrayExtents<std::size_t, 1>>);
198 static_assert(std::is_trivially_copy_constructible_v<ArrayExtents<std::size_t, 1>>);
199 static_assert(std::is_trivially_move_constructible_v<ArrayExtents<std::size_t, 1>>);
200 static_assert(std::is_trivially_copy_assignable_v<ArrayExtents<std::size_t, 1>>);
201 static_assert(std::is_trivially_move_assignable_v<ArrayExtents<std::size_t, 1>>);
202 static_assert(std::is_empty_v<ArrayExtents<std::size_t, 1>>);
205 template<
typename SizeTypeA, SizeTypeA... SizesA,
typename SizeTypeB, SizeTypeB... SizesB>
210 return a.toArray() == b.toArray();
214 template<
typename SizeTypeA, SizeTypeA... SizesA,
typename SizeTypeB, SizeTypeB... SizesB>
223 template<
typename SizeType, SizeType... Sizes>
231 template<
typename SizeType, SizeType Extent, std::size_t... Is>
240 template<
typename SizeType, std::
size_t N, SizeType Extent>
241 using ArrayExtentsNCube = decltype(internal::makeArrayExtents<SizeType, Extent>(std::make_index_sequence<N>{}));
245 template<
typename SizeType, std::
size_t N>
249 template<
typename SizeType, std::size_t Dim,
typename Func,
typename... OuterIndices>
253 OuterIndices... outerIndices)
255 constexpr
auto fixedIndices =
sizeof...(outerIndices);
257 if constexpr(fixedIndices < Dim)
259 for(SizeType i = 0; i < extents[fixedIndices]; i++)
270 template<
typename SizeType, SizeType... Sizes,
typename Func>
278 template<
typename SizeType, SizeType... Sizes>
280 : std::integral_constant<std::size_t, sizeof...(Sizes)>
285 template<
typename SizeType, std::size_t I, SizeType... Sizes>
#define LLAMA_LAMBDA_INLINE
Gives strong indication to the compiler to inline the attributed lambda.
#define LLAMA_BEGIN_SUPPRESS_HOST_DEVICE_WARNING
#define LLAMA_FN_HOST_ACC_INLINE
#define LLAMA_END_SUPPRESS_HOST_DEVICE_WARNING
constexpr auto makeArrayExtents(std::index_sequence< Is... >)
ArrayIndex(Args...) -> ArrayIndex< typename internal::IndexTypeFromArgs< std::size_t, Args... >::type, sizeof...(Args)>
void forEachArrayIndex([[maybe_unused]] const ArrayIndex< SizeType, Dim > &extents, Func &&func, OuterIndices... outerIndices)
constexpr auto dyn
Used as a template argument to ArrayExtents to mark a dynamic extent.
ArrayExtentsNCube< SizeType, N, dyn > ArrayExtentsDynamic
N-dimensional ArrayExtents where all values are dynamic.
ArrayExtents(Args...) -> ArrayExtents< typename internal::IndexTypeFromArgs< std::size_t, Args... >::type,(Args{}, dyn)... >
decltype(internal::makeArrayExtents< SizeType, Extent >(std::make_index_sequence< N >{})) ArrayExtentsNCube
N-dimensional ArrayExtents where all N extents are Extent.
constexpr auto operator==(ArrayIndex< TA, Dim > a, ArrayIndex< TB, Dim > b) -> bool
constexpr auto operator!=(ArrayIndex< TA, Dim > a, ArrayIndex< TB, Dim > b) -> bool
constexpr auto product(Array< T, N > a) -> T
constexpr auto toArray() const -> Index
constexpr auto get() const -> value_type
static constexpr auto rankStatic
constexpr auto toArray() const -> Index
static constexpr auto rankDynamic
static constexpr std::size_t rank
ArrayIndex< T, rank > Index
constexpr auto operator[](T i) const -> value_type
static constexpr std::size_t rank
constexpr friend auto operator==(Dyn d, T i) -> bool
constexpr friend auto operator==(T i, Dyn) -> bool
constexpr friend auto operator!=(T i, Dyn d) -> bool
constexpr friend auto operator!=(Dyn d, T i) -> bool