33namespace triqs::utility {
38 template <
int r,
typename Lambda,
typename Tu>
struct _bra;
40 template <
int r,
typename F,
typename Tu> _bra<r, F, Tu> make_bra(F &&f, Tu &&tu) {
return {std::forward<F>(f), std::forward<Tu>(tu)}; }
42 template <
int r,
typename Lambda,
typename Tu>
struct _bra {
43 static_assert(r > 1,
"Internal error in calling make_lazy_bracket : rank is incorrect");
46 template <
typename U>
decltype(
auto)
operator[](U
const &u) {
return make_bra<r - 1>(f, std::tuple_cat(tu, std::tie(u))); }
47 template <
typename T>
void operator=(T &&) =
delete;
48 _bra &operator=(_bra
const &) =
delete;
51 template <
typename Lambda,
typename Tu>
struct _bra<1, Lambda, Tu> {
54 template <
typename U>
decltype(
auto)
operator[](U
const &u) {
return triqs::tuple::apply(f, std::tuple_cat(tu, std::tie(u))); }
55 template <
typename T>
void operator=(T &&) =
delete;
56 _bra &operator=(_bra
const &) =
delete;
59 template <
int NArgs,
typename Lambda,
typename T>
decltype(
auto) _make_lazy_bracket(Lambda &&f, T
const &x, std::false_type) {
60 return details::make_bra<NArgs - 1>(std::forward<Lambda>(f), std::tie(x));
63 template <
int NArgs,
typename Lambda,
typename T>
decltype(
auto) _make_lazy_bracket(Lambda &&f, T
const &x, std::true_type) {
64 return std::forward<Lambda>(f)(x);
82 template <
int NArgs,
typename Lambda,
typename T>
decltype(
auto)
make_lazy_bracket(Lambda &&f, T
const &x) {
83 return details::_make_lazy_bracket<NArgs>(std::forward<Lambda>(f), x, std::integral_constant<
bool, (NArgs == 1)>{});
decltype(auto) make_lazy_bracket(Lambda &&f, T const &x)
Invoke a callable lazily by accumulating arguments through chained operator[] calls.
decltype(auto) apply(F &&f, T &&t)
Call a function with the elements of a tuple as its arguments.