6#ifndef IPPL_TYPE_UTILS_H
7#define IPPL_TYPE_UTILS_H
9#include <Kokkos_Core.hpp>
24 template <
typename Check,
typename... Collection>
26 constexpr static bool enable = !std::disjunction_v<std::is_same<Check, Collection>...>;
38 template <
template <
typename>
class Wrapper>
40 template <
typename Check,
typename... Collection>
42 typedef Wrapper<Check>
type;
44 !std::disjunction_v<std::is_same<type, Collection>...>;
55 template <
bool B,
typename T>
65 template <
typename Type,
typename...>
67 constexpr static bool enable = !std::is_void_v<Type>;
74 template <
typename,
typename,
template <
typename...>
class Verifier =
IsUnique>
80 template <
template <
typename...>
class Verifier>
82 typedef std::variant<>
type;
89 template <
typename...
T,
template <
typename...>
class Verifier>
91 typedef std::variant<
T...>
type;
119 template <
typename Next,
typename... ToAdd,
typename... Added,
120 template <
typename...>
class Verifier>
123 template <
bool B,
class T,
class F>
124 using cond = std::conditional_t<B, T, F>;
125 template <
typename...
T>
128 using Check = Verifier<Next, Added...>;
145 template <
typename... Types>
153 template <
typename... Types>
166 template <
template <
typename...>
class Verifier,
typename... Types>
168 typename ConstructVariant<std::variant<Types...>, std::variant<>, Verifier>::type;
176 template <
template <
typename...>
class Type,
typename Pack>
182 template <
template <
typename...>
class Type,
typename... Spaces>
190 template <
template <
typename...>
class Type,
typename T,
typename... Properties>
192 using type = Type<Properties...>;
202 template <
template <
typename...>
class Type,
typename View>
211 template <
template <
typename...>
class Type>
214 Kokkos::HostSpace, Kokkos::SharedSpace, Kokkos::SharedHostPinnedSpace
215#ifdef KOKKOS_ENABLE_CUDA
217 Kokkos::CudaSpace, Kokkos::CudaHostPinnedSpace, Kokkos::CudaUVMSpace
219#ifdef KOKKOS_ENABLE_HIP
221 Kokkos::HIPSpace, Kokkos::HIPHostPinnedSpace, Kokkos::HIPManagedSpace
223#ifdef KOKKOS_ENABLE_SYCL
225 Kokkos::Experimental::SYCLDeviceUSMSpace, Kokkos::Experimental::SYCLHostUSMSpace,
226 Kokkos::Experimental::SYCLSharedUSMSpace
231#ifdef KOKKOS_ENABLE_OPENMP
235#ifdef KOKKOS_ENABLE_OPENMPTARGET
239#ifdef KOKKOS_ENABLE_THREADS
243#ifdef KOKKOS_ENABLE_SERIAL
247#ifdef KOKKOS_ENABLE_CUDA
251#ifdef KOKKOS_ENABLE_HIP
255#ifdef KOKKOS_ENABLE_SYCL
257 Kokkos::Experimental::SYCL
259#ifdef KOKKOS_ENABLE_HPX
275 template <
template <
typename>
class Type,
typename... Spaces>
277 template <
typename T,
typename... Ts>
289 template <
typename Space,
unsigned Idx = 0>
291 static_assert(Idx <
sizeof...(Spaces));
292 if constexpr (std::is_same_v<Space,
293 std::tuple_element_t<Idx, std::tuple<Spaces...>>>) {
300 throw IpplException(
"detail::MultispaceContainer::spaceToIndex",
301 "Unreachable state");
307 template <
typename Space>
316 template <
typename MemorySpace,
typename Filter,
317 std::enable_if_t<std::is_null_pointer_v<std::decay_t<Filter>>,
int> = 0>
322 template <
typename MemorySpace,
typename Filter,
323 std::enable_if_t<!std::is_null_pointer_v<std::decay_t<Filter>>,
int> = 0>
325 return predicate.template operator()<MemorySpace>();
341 template <
typename DataType,
typename Filter = std::
nullptr_t>
344 using space =
typename DataType::memory_space;
345 static_assert(std::is_same_v<DataType, Type<space>>);
358 template <
typename Space,
typename Filter = std::
nullptr_t>
360 forAll([&]<
typename DataType>(DataType& dst) {
361 using memory_space =
typename DataType::memory_space;
362 if constexpr (!std::is_same_v<Space, memory_space>) {
364 dst = Kokkos::create_mirror_view_and_copy(
365 Kokkos::view_alloc(memory_space{}, Kokkos::WithoutInitializing),
377 template <
typename Space>
378 const Type<Space>&
get()
const {
382 template <
typename Space>
392 template <
typename Functor>
397 template <
typename Functor>
407 template <
template <
typename>
class Type>
409 template <
typename... Spaces>
415 template <
typename Functor>
417 return type{std::forward<Functor>(initFunc)};
427 template <
typename Functor>
430 auto runner = [&]<
typename... Spaces>(
const std::variant<Spaces...>&) {
431 (f.template operator()<Spaces>(), ...);
433 runner(all_spaces{});
KOKKOS_INLINE_FUNCTION auto & get(::ippl::Tuple< Ts... > &t)
typename ConstructVariant< std::variant< Types... >, std::variant<>, IsEnabled >::type VariantFromConditionalTypes
std::conditional_t< B, T, void > ConditionalType
typename ConstructVariant< std::variant< Types... >, std::variant<>, Verifier >::type VariantWithVerifier
void runForAllSpaces(Functor &&f)
typename ConstructVariant< std::variant< Types... >, std::variant<>, IsUnique >::type VariantFromUniqueTypes
static constexpr bool enable
static constexpr bool enable
static constexpr bool enable
std::variant< T... > type
std::variant< T... > variant
std::conditional_t< B, T, F > cond
Verifier< Next, Added... > Check
cond< Check::enable, typename ConstructVariant< variant< ToAdd... >, variant< typename Check::type, Added... >, Verifier >::type, typename ConstructVariant< variant< ToAdd... >, variant< Added... >, Verifier >::type > type
Type< Properties... > type
typename View::uniform_type view_type
typename Forward< Type, view_type >::type type
typename Forward< Type, unique_memory_spaces >::type memory_spaces_type
typename Forward< Type, unique_exec_spaces >::type exec_spaces_type
VariantFromUniqueTypes< Kokkos::HostSpace, Kokkos::SharedSpace, Kokkos::SharedHostPinnedSpace > unique_memory_spaces
VariantFromUniqueTypes< Kokkos::DefaultExecutionSpace > unique_exec_spaces
VariantWithVerifier< Verifier, Spaces... > Types
MultispaceContainer(const DataType &data, Filter &&predicate=nullptr)
bool copyToSpace(Filter &&predicate)
constexpr bool copyToSpace(Filter &&)
void forAll(Functor &&f) const
const Type< Space > & get() const
typename WrapUnique< Type >::template Verifier< T, Ts... > Verifier
static constexpr unsigned spaceToIndex()
void copyToOtherSpaces(Filter &&predicate=nullptr)
std::array< Types, sizeof...(Spaces)> elements_m
typename TypeForAllSpaces< container_type >::memory_spaces_type type
static type createContainer(Functor &&initFunc)
MultispaceContainer< Type, Spaces... > container_type