kokkos-execution 0.0.1
Loading...
Searching...
No Matches
diagnostics.hpp
Go to the documentation of this file.
1#ifndef KOKKOS_EXECUTION_IMPL_DIAGNOSTICS_HPP
2#define KOKKOS_EXECUTION_IMPL_DIAGNOSTICS_HPP
3
9
11
13
15template <typename T>
17
19template <typename... T>
21
23template <typename T>
25
28template <template <typename...> class To, template <typename...> class From, typename... As>
29auto rebind(From<As...>*) -> To<As...>;
30
31template <template <typename...> class To, typename From>
32using rebind_t = decltype(rebind<To>(static_cast<From*>(nullptr)));
34
37template <typename T>
39 using type = stdexec::__msuccess;
40};
41
42template <typename T>
43requires std::invocable<decltype(T::diagnose)>
45 using type = decltype(T::diagnose());
46};
47
48template <typename T>
51
54template <typename...>
55struct Diagnose;
56
57template <typename T>
59
60template <typename... Ts>
61struct Diagnose {
62 using type = stdexec::__mlist<try_diagnose_t<Ts>...>;
63};
64
65template <typename... Ts>
66requires(sizeof...(Ts) > 0)
69
72template <typename...>
74
75template <typename T>
77 using type = std::conditional_t<stdexec::__merror<T>, T, stdexec::__msuccess>;
78};
79
80template <typename T, typename... Ts>
81struct FirstErrorOf<T, Ts...>
82 : std::conditional_t<stdexec::__merror<T>, std::type_identity<T>, FirstErrorOf<Ts...>> { };
83
84template <typename T>
85struct FirstError : FirstErrorOf<T> { };
86
87template <typename... Ts>
88struct FirstError<stdexec::__mlist<Ts...>> : FirstErrorOf<Ts...> { };
89
90template <typename T>
93
96template <typename T>
97struct Collapse : std::type_identity<T> { };
98
99template <typename T>
100struct Collapse<stdexec::__mlist<T>> {
101 using type = T;
102};
103
104template <typename T>
107
116template <typename T>
117using keep_if_error_t = std::conditional_t<stdexec::__merror<T>, stdexec::__mlist<T>, stdexec::__mlist<>>;
118
119template <typename T>
121 using type = std::conditional_t<stdexec::__merror<T>, T, stdexec::__msuccess>;
122};
123
124template <typename... Ts>
125struct KeepErrors<stdexec::__mlist<Ts...>> {
126 using type = stdexec::__mconcat_result_t<stdexec::__mlist<>, keep_if_error_t<Ts>...>;
127};
128
129template <typename List>
132
134template <typename T>
135constexpr bool mandate_or_explain() noexcept {
136 if constexpr (!T::value) {
137 static_assert(std::is_same_v<diagnose_t<T>, stdexec::__msuccess>, "Check for the error in the compiler log.");
138 }
139 return T::value;
140}
141
142} // namespace Kokkos::Execution::Impl
143
144#endif // KOKKOS_EXECUTION_IMPL_DIAGNOSTICS_HPP
typename FirstError< T >::type first_error_t
typename Collapse< T >::type collapse_t
auto rebind(From< As... > *) -> To< As... >
typename TryDiagnose< T >::type try_diagnose_t
constexpr bool mandate_or_explain() noexcept
If T::value is false, diagnose.
std::conditional_t< stdexec::__merror< T >, stdexec::__mlist< T >, stdexec::__mlist<> > keep_if_error_t
typename KeepErrors< List >::type keep_errors_t
decltype(rebind< To >(static_cast< From * >(nullptr))) rebind_t
typename Diagnose< Ts... >::type diagnose_t
stdexec::__mlist< try_diagnose_t< Ts >... > type
std::conditional_t< stdexec::__merror< T >, T, stdexec::__msuccess > type
stdexec::__mconcat_result_t< stdexec::__mlist<>, keep_if_error_t< Ts >... > type
std::conditional_t< stdexec::__merror< T >, T, stdexec::__msuccess > type
Tag to be used to signal children errors.
Tag to be used to signal an execution space.