Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2024-06-26 07:06:31

0001 #pragma once
0002 #include <tuple>
0003 
0004 namespace Jug::Utils {
0005 
0006   /** Enumerate helper.
0007    *
0008    * ref: https://www.reedbeta.com/blog/python-like-enumerate-in-cpp17/
0009    */
0010   template <typename T, typename TIter = decltype(std::begin(std::declval<T>())),
0011             typename = decltype(std::end(std::declval<T>()))>
0012   constexpr auto Enumerate(T&& iterable)
0013   {
0014     struct iterator
0015     {
0016         size_t i;
0017         TIter iter;
0018         bool operator != (const iterator & other) const { return iter != other.iter; }
0019         void operator ++ () { ++i; ++iter; }
0020         auto operator * () const { return std::tie(i, *iter); }
0021     };
0022     struct iterable_wrapper
0023     {
0024         T iterable;
0025         auto begin() { return iterator{ 0, std::begin(iterable) }; }
0026         auto end() { return iterator{ 0, std::end(iterable) }; }
0027     };
0028     return iterable_wrapper{ std::forward<T>(iterable) };
0029 }
0030 
0031 } // namespace Jug::Utils