cMHN 1.2
C++ library for learning MHNs with pRC
Loading...
Searching...
No Matches
fold.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: BSD-2-Clause
2
3#ifndef pRC_CORE_VALUE_FUNCTIONS_FOLD_H
4#define pRC_CORE_VALUE_FUNCTIONS_FOLD_H
5
8
9namespace pRC
10{
11 template<class F, Bool E = false, Direction D = Direction::Forwards,
12 class X>
14 static inline constexpr decltype(auto) fold(X &&a)
15 {
16 if constexpr(E)
17 {
18 return eval(forward<X>(a));
19 }
20 else
21 {
22 return as(forward<X>(a));
23 }
24 }
25
26 template<class F, Bool E = false, Direction D = Direction::Forwards,
27 class XA, class XB>
28 requires IsInvocable<F, XA, XB> &&
30 static inline constexpr decltype(auto) fold(XA &&a, XB &&b)
31 {
32 if constexpr(E)
33 {
34 return eval(F()(forward<XA>(a), forward<XB>(b)));
35 }
36 else
37 {
38 return F()(forward<XA>(a), forward<XB>(b));
39 }
40 }
41
42 template<class F, Bool E = false, Direction D = Direction::Forwards,
43 class XA, class XB, class... Xs>
44 requires IsInvocable<F, XA, XB> &&
46 sizeof...(Xs) > 0) &&
47 requires {
48 fold<F, E, D>(fold<F, E, D>(declval<XA>(), declval<XB>()),
49 declval<Xs>()...);
50 }
51 static inline constexpr decltype(auto) fold(XA &&a, XB &&b, Xs &&...args)
52 {
53 if constexpr(D == Direction::Forwards)
54 {
55 auto const c = [&a, &b]() -> decltype(auto)
56 {
57 if constexpr(E)
58 {
59 return eval(F()(forward<XA>(a), forward<XB>(b)));
60 }
61 else
62 {
63 return F()(forward<XA>(a), forward<XB>(b));
64 }
65 };
66
67 return fold<F, E, D>(c(), forward<Xs>(args)...);
68 }
69 if constexpr(D == Direction::Backwards)
70 {
71 auto const c = [&b, &args...]() -> decltype(auto)
72 {
73 return fold<F, E, D>(forward<XB>(b), forward<Xs>(args)...);
74 };
75
76 if constexpr(E)
77 {
78 return eval(F()(forward<XA>(a), c()));
79 }
80 else
81 {
82 return F()(forward<XA>(a), c());
83 }
84 }
85 }
86}
87#endif // pRC_CORE_VALUE_FUNCTIONS_FOLD_H
pRC::Size const D
Definition CalculatePThetaTests.cpp:9
Definition cholesky.hpp:10
static constexpr decltype(auto) fold(X &&a)
Definition fold.hpp:14
Direction
Definition direction.hpp:9
static constexpr RemoveConst< X > as(X &&a)
Definition basics.hpp:83
static constexpr decltype(auto) eval(X &&a)
Definition eval.hpp:12
Definition gtest_pred_impl_unittest.cc:54