Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #ifndef ALGORITHMS_HPP
- #define ALGORITHMS_HPP
- #include <tuple>
- #include <utility>
- namespace Utils {
- namespace detail {
- template <unsigned I, class Obj, class PredFunTuple>
- typename std::enable_if<std::tuple_size<PredFunTuple>::value == I, bool>::type
- ExecuteIfPredicate(Obj &, PredFunTuple) {
- return false;
- }
- template <unsigned I, class Obj, class PredFunTuple>
- typename std::enable_if<std::tuple_size<PredFunTuple>::value != I, bool>::type
- ExecuteIfPredicate(Obj &obj, PredFunTuple tuple) {
- if (std::get<I>(tuple)(obj)) {
- std::get<I + 1>(tuple)(obj);
- return true;
- }
- return ExecuteIfPredicate<I + 2>(obj, tuple);
- }
- template <typename... T, std::size_t... I>
- auto subtuple_(const std::tuple<T...> &t, std::index_sequence<I...>) {
- return std::make_tuple(std::get<I>(t)...);
- }
- } // namespace Details
- template <int Trim, typename... T>
- auto subtuple(const std::tuple<T...>& t) {
- return detail::subtuple_(t, std::make_index_sequence<sizeof...(T) - Trim>());
- }
- template <class Iterator, typename... Args>
- void for_each_if_else(Iterator begin, Iterator end, Args &&... args) {
- for (; begin != end; ++begin) {
- auto tuple = std::make_tuple(args...);
- auto tuple_wo_last_ = subtuple<1>(tuple);
- if (!detail::ExecuteIfPredicate<0>(*begin, tuple_wo_last_))
- std::get<std::tuple_size<decltype(tuple)>::value-1>(tuple)(*begin);
- }
- }
- } // namespace Utils
- #endif // ALGORITHMS_HPP
Advertisement
Add Comment
Please, Sign In to add comment