#pragma once #include "value-templates.hpp" #include #include #include #include namespace functools { template struct reserver_ { static inline void maybe_reserve_space(seq_&, unsigned) { //qDebug() << "nada"; } }; template struct reserver_().reserve(0u), (void)0)> { static inline void maybe_reserve_space(seq_& seq, unsigned sz) { seq.reserve(sz); } }; template inline void maybe_reserve_space(seq_& seq, unsigned sz) { reserver_::maybe_reserve_space(seq, sz); } } // ns template struct constant final { using type = t; constexpr type operator()() const noexcept { return value_; } static constexpr type value = value_; constant() = delete; }; template auto map(F&& fun, const seq_& seq) { using value_type = std::decay_t::value_type>; using ret_type = std::decay_t()))>; std::vector ret; auto it = std::back_inserter(ret); for (const auto& elt : seq) it = fun(elt); return ret; } template auto remove_if_not(F&& fun, const seq_& seq) { using namespace functools; using seq_type = std::decay_t; using value_type = std::decay_t::value_type>; using fun_ret_type = decltype(fun(std::declval())); static_assert(is_convertible_v, "must return bool"); seq_type ret; maybe_reserve_space(ret, seq.size()); std::back_insert_iterator it = std::back_inserter(ret); for (const value_type& elt : seq) if (fun(elt)) it = elt; return ret; }