cMHN 1.2
C++ library for learning MHNs with pRC
Loading...
Searching...
No Matches
loop.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: BSD-2-Clause
2
3#ifndef pRC_CORE_TENSOR_FUNCTIONS_LOOP_H
4#define pRC_CORE_TENSOR_FUNCTIONS_LOOP_H
5
9
10namespace pRC
11{
12 template<class F, class... Xs>
13 requires(IsTensorish<RemoveReference<Xs>> && ...) &&
14 (sizeof...(Xs) > 0) &&
15 (IsSame<typename TupleElement<0, Tuple<RemoveReference<Xs>...>>::Sizes,
16 typename RemoveReference<Xs>::Sizes> &&
17 ...) &&
18 IsInvocable<F,
19 ResultOf<Xs, typename RemoveReference<Xs>::Subscripts>...>
20 static inline constexpr auto loop(F &&f, Xs &&...args)
21 {
22 if constexpr((IsInvocable<View, Xs> && ...))
23 {
26
27 return TensorViews::Loop<T,
30 forward<F>(f), view(forward<Xs>(args))...);
31 }
32 else
33 {
34 return eval(loop(forward<F>(f), args...));
35 }
36 }
37
38 template<class F, class... Xs>
39 requires(IsTensorish<RemoveReference<Xs>> && ...) &&
40 requires { loop(declval<F>(), declval<Xs>()...); }
41 static inline constexpr auto loop(Xs &&...args)
42 {
43 return loop(F(), forward<Xs>(args)...);
44 }
45}
46#endif // pRC_CORE_TENSOR_FUNCTIONS_LOOP_H
Definition value.hpp:12
Definition loop.hpp:19
Definition concepts.hpp:31
pRC::Float<> T
Definition externs_nonTT.hpp:1
Definition cholesky.hpp:10
std::invoke_result_t< F, Args... > ResultOf
Definition basics.hpp:59
std::remove_reference_t< T > RemoveReference
Definition basics.hpp:41
static constexpr decltype(auto) view(X &&a)
Definition view.hpp:13
std::common_type_t< Ts... > Common
Definition basics.hpp:53
Sequence< Size, Ns... > Sizes
Definition sequence.hpp:100
static constexpr auto loop(F &&f, Xs &&...args)
Definition loop.hpp:20
RemoveConst< RemoveReference< T > > RemoveConstReference
Definition basics.hpp:47
static constexpr decltype(auto) eval(X &&a)
Definition eval.hpp:12