Juggler
Juggling algorithms and event processing using gaudi framework
Utils.hpp
Go to the documentation of this file.
1 #pragma once
2 #include <tuple>
3 
4 namespace Jug::Utils {
5 
6  /** Enumerate helper.
7  *
8  * ref: https://www.reedbeta.com/blog/python-like-enumerate-in-cpp17/
9  */
10  template <typename T, typename TIter = decltype(std::begin(std::declval<T>())),
11  typename = decltype(std::end(std::declval<T>()))>
12  constexpr auto Enumerate(T&& iterable)
13  {
14  struct iterator
15  {
16  size_t i;
17  TIter iter;
18  bool operator != (const iterator & other) const { return iter != other.iter; }
19  void operator ++ () { ++i; ++iter; }
20  auto operator * () const { return std::tie(i, *iter); }
21  };
22  struct iterable_wrapper
23  {
24  T iterable;
25  auto begin() { return iterator{ 0, std::begin(iterable) }; }
26  auto end() { return iterator{ 0, std::end(iterable) }; }
27  };
28  return iterable_wrapper{ std::forward<T>(iterable) };
29 }
30 
31 } // namespace Jug::Utils
Jug::Utils
Definition: Utils.hpp:4
Jug::Utils::Enumerate
constexpr auto Enumerate(T &&iterable)
Definition: Utils.hpp:12