16#ifndef KOKKOS_DETECTION_IDIOM_HPP
17#define KOKKOS_DETECTION_IDIOM_HPP
18#ifndef KOKKOS_IMPL_PUBLIC_INCLUDE
19#define KOKKOS_IMPL_PUBLIC_INCLUDE
20#define KOKKOS_IMPL_PUBLIC_INCLUDE_NOTDEFINED_DETECTIONIDIOM
23#include <Kokkos_Macros.hpp>
38struct nonesuch_base {};
41template <
class Default,
class ,
template <
class...>
class Op,
44 using value_t = std::false_type;
49template <
class Default,
template <
class...>
class Op,
class... Args>
50struct detector<Default, std::void_t<Op<Args...>>, Op, Args...> {
51 using value_t = std::true_type;
52 using type = Op<Args...>;
56struct nonesuch :
private Impl::nonesuch_base {
58 nonesuch(nonesuch
const&) =
delete;
59 void operator=(nonesuch
const&) =
delete;
62template <
template <
class...>
class Op,
class... Args>
64 typename Impl::detector<nonesuch, void, Op, Args...>::value_t;
66template <
template <
class...>
class Op,
class... Args>
67using detected_t =
typename Impl::detector<nonesuch, void, Op, Args...>::type;
69template <
class Default,
template <
class...>
class Op,
class... Args>
70using detected_or_t =
typename Impl::detector<Default, void, Op, Args...>::type;
72template <
class Expected,
template <
class...>
class Op,
class... Args>
73using is_detected_exact = std::is_same<Expected, detected_t<Op, Args...>>;
75template <
class To,
template <
class...>
class Op,
class... Args>
76using is_detected_convertible =
77 std::is_convertible<detected_t<Op, Args...>, To>;
79template <
template <
class...>
class Op,
class... Args>
80inline constexpr bool is_detected_v = is_detected<Op, Args...>::value;
82template <
class Expected,
template <
class...>
class Op,
class... Args>
83inline constexpr bool is_detected_exact_v =
84 is_detected_exact<Expected, Op, Args...>::value;
86template <
class Expected,
template <
class...>
class Op,
class... Args>
87inline constexpr bool is_detected_convertible_v =
88 is_detected_convertible<Expected, Op, Args...>::value;
92#ifdef KOKKOS_IMPL_PUBLIC_INCLUDE_NOTDEFINED_DETECTIONIDIOM
93#undef KOKKOS_IMPL_PUBLIC_INCLUDE
94#undef KOKKOS_IMPL_PUBLIC_INCLUDE_NOTDEFINED_DETECTIONIDIOM