]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
[Minor] Add enumerate helper
authorVsevolod Stakhov <vsevolod@rspamd.com>
Wed, 4 May 2022 20:24:06 +0000 (21:24 +0100)
committerVsevolod Stakhov <vsevolod@rspamd.com>
Wed, 4 May 2022 20:24:06 +0000 (21:24 +0100)
src/libutil/cxx/util.hxx

index 8011f67a129959970859bf71ebe2b8227c5444c4..0df3349a3dd58eb73009ea0ab082eea8eff2ba92 100644 (file)
@@ -22,6 +22,7 @@
 #include <array>
 #include <string_view>
 #include <optional>
+#include <tuple>
 
 /*
  * Common C++ utilities
@@ -103,6 +104,31 @@ inline constexpr auto make_string_view_from_it(_It begin, _It end)
        };
 }
 
+/**
+ * Enumerate for range loop
+ */
+template <typename T,
+               typename TIter = decltype(std::begin(std::declval<T>())),
+               typename = decltype(std::end(std::declval<T>()))>
+constexpr auto enumerate(T && iterable)
+{
+       struct iterator
+       {
+               size_t i;
+               TIter iter;
+               bool operator != (const iterator & other) const { return iter != other.iter; }
+               void operator ++ () { ++i; ++iter; }
+               auto operator * () const { return std::tie(i, *iter); }
+       };
+       struct iterable_wrapper
+       {
+               T iterable;
+               auto begin() { return iterator{ 0, std::begin(iterable) }; }
+               auto end() { return iterator{ 0, std::end(iterable) }; }
+       };
+       return iterable_wrapper{ std::forward<T>(iterable) };
+}
+
 }
 
 #endif //RSPAMD_UTIL_HXX