Fix LeftFold concept and add example for it

This commit is contained in:
sha512sum 2024-07-18 16:28:25 +00:00
parent 93783671cf
commit 2be45e896a
2 changed files with 31 additions and 1 deletions

View file

@ -0,0 +1,9 @@
#include <utempl/utils.hpp>
auto main() -> int {
constexpr auto value = utempl::LeftFold(
utempl::GetIndexesTuple<4>(), utempl::kWrapper<std::size_t{}>, []<std::size_t I>(utempl::Wrapper<I>, auto) -> utempl::Wrapper<I + 1> {
return {};
});
static_assert(std::is_same_v<decltype(value), const utempl::Wrapper<static_cast<std::size_t>(4)>>);
};

View file

@ -436,9 +436,30 @@ struct LeftFold<T, F> {
}; };
}; };
struct LeftFoldIgnorer {
static constexpr bool value = false;
consteval auto operator|(auto&&) const -> LeftFoldIgnorer {
return {};
};
};
template <typename F, typename T>
struct LeftFoldIsOk {
static constexpr bool value = true;
template <typename TT>
consteval auto operator|(LeftFoldIsOk<F, TT>&& other) -> LeftFoldIsOk<F, std::invoke_result_t<F, T, TT>>
requires Function<F, void(T, TT)>
{
return {};
};
consteval auto operator|(auto&&) -> LeftFoldIgnorer {
return {};
};
};
template <typename F, typename T, typename Tuple> template <typename F, typename T, typename Tuple>
concept LeftFoldConcept = decltype(Unpack(std::declval<Tuple>(), []<typename... Ts>(Ts&&...) { concept LeftFoldConcept = decltype(Unpack(std::declval<Tuple>(), []<typename... Ts>(Ts&&...) {
return kWrapper<(Function<F, T(T, Ts)> && ...)>; return kWrapper<decltype((LeftFoldIsOk<F, T>{} | ... | LeftFoldIsOk<F, Ts>{}))::value>;
}))::kValue; }))::kValue;
} // namespace impl } // namespace impl