Guest User

Untitled

a guest
Sep 26th, 2015
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #ifndef ALGORITHMS_HPP
  2. #define ALGORITHMS_HPP
  3.  
  4. #include <tuple>
  5. #include <utility>
  6.  
  7. namespace Utils {
  8. namespace detail {
  9. template <unsigned I, class Obj, class PredFunTuple>
  10. typename std::enable_if<std::tuple_size<PredFunTuple>::value == I, bool>::type
  11. ExecuteIfPredicate(Obj &, PredFunTuple) {
  12.   return false;
  13. }
  14.  
  15. template <unsigned I, class Obj, class PredFunTuple>
  16. typename std::enable_if<std::tuple_size<PredFunTuple>::value != I, bool>::type
  17. ExecuteIfPredicate(Obj &obj, PredFunTuple tuple) {
  18.   if (std::get<I>(tuple)(obj)) {
  19.     std::get<I + 1>(tuple)(obj);
  20.     return true;
  21.   }
  22.   return ExecuteIfPredicate<I + 2>(obj, tuple);
  23. }
  24.  
  25. template <typename... T, std::size_t... I>
  26. auto subtuple_(const std::tuple<T...> &t, std::index_sequence<I...>) {
  27.   return std::make_tuple(std::get<I>(t)...);
  28. }
  29.  
  30. } // namespace Details
  31.  
  32. template <int Trim, typename... T>
  33. auto subtuple(const std::tuple<T...>& t) {
  34.   return detail::subtuple_(t, std::make_index_sequence<sizeof...(T) - Trim>());
  35. }
  36.  
  37. template <class Iterator, typename... Args>
  38. void for_each_if_else(Iterator begin, Iterator end, Args &&... args) {
  39.   for (; begin != end; ++begin) {
  40.     auto tuple = std::make_tuple(args...);
  41.     auto tuple_wo_last_ = subtuple<1>(tuple);
  42.     if (!detail::ExecuteIfPredicate<0>(*begin, tuple_wo_last_))
  43.       std::get<std::tuple_size<decltype(tuple)>::value-1>(tuple)(*begin);
  44.   }
  45. }
  46.  
  47. } // namespace Utils
  48. #endif // ALGORITHMS_HPP
Advertisement
Add Comment
Please, Sign In to add comment