37 return sout <<
"_" << N;
49 std::ostream &
operator<<(std::ostream &sout, std::reference_wrapper<T>
const &wrapper) {
50 return sout << wrapper.get();
54 inline std::ostream &variadic_print(std::ostream &sout) {
return sout; }
66 template <
typename T0,
typename... Ts>
67 std::ostream &variadic_print(std::ostream &sout, T0 &&t0, Ts &&...ts) {
68 sout << std::forward<T0>(t0) << (
sizeof...(Ts) > 0 ?
", " :
"");
69 variadic_print(sout, std::forward<Ts>(ts)...);
76 template <
int C,
int N>
77 struct print_tuple_impl {
78 template <
typename Tuple>
79 void operator()(std::ostream &sout, Tuple
const &t) {
80 sout << std::get<C>(t) << (C != N - 1 ?
", " :
"");
81 print_tuple_impl<C + 1, N>()(sout, t);
87 struct print_tuple_impl<N, N> {
88 template <
typename Tuple>
89 void operator()(std::ostream &, Tuple
const &) {}
102 template <
typename Tuple>
104 detail::print_tuple_impl<1, std::tuple_size_v<Tuple>>()(sout, t);
117 template <
typename Tag,
typename L>
118 requires std::is_base_of_v<tags::unary_op, Tag>
120 return sout <<
"(" << Tag::name() <<
" " << std::get<0>(ex.
childs) <<
")";
133 template <
typename Tag,
typename L,
typename R>
134 requires std::is_base_of_v<tags::binary_op, Tag>
136 return sout <<
"(" << std::get<0>(ex.
childs) <<
" " << Tag::name() <<
" " << std::get<1>(ex.
childs) <<
")";
149 template <
typename C,
typename A,
typename B>
151 return sout <<
"(" << std::get<0>(ex.
childs) <<
" ? " << std::get<1>(ex.
childs) <<
" : " << std::get<2>(ex.
childs) <<
")";
162 template <
typename... Ts>
178 template <
typename... Ts>
194 template <
typename T>
196 return sout << std::get<0>(ex.
childs);
207 template <
typename T>
209 return sout << std::get<0>(ex.
childs) <<
"[" << std::get<1>(ex.
childs) <<
"]";
220 template <
typename T>
222 return sout <<
"-(" << std::get<0>(ex.
childs) <<
")";
234 template <
typename Expr,
int... Is>
236 sout <<
"lazy function : (";
238 return sout <<
") --> " << f.
obj;
Includes all relevant headers for the core clef library.
__inline__ void operator<<(expr< tags::function, F, placeholder< Is >... > const &ex, RHS &&rhs)
Assign values to the underlying object of a lazy function call expression.
std::ostream & print_tuple(std::ostream &sout, Tuple const &t)
Print a std::tuple to std::ostream.
Single node of the expression tree.
childs_t childs
Child nodes of the current expression node.
Helper struct to simplify calls to nda::clef::eval.
T obj
Object to be evaluated.
A placeholder is an empty struct, labelled by an int.