]> source.dussan.org Git - rspamd.git/commitdiff
[Minor] Add utility to iterate over a list of newline separated strings
authorVsevolod Stakhov <vsevolod@rspamd.com>
Sat, 24 Jun 2023 13:55:55 +0000 (14:55 +0100)
committerVsevolod Stakhov <vsevolod@rspamd.com>
Sat, 24 Jun 2023 13:55:55 +0000 (14:55 +0100)
src/libutil/cxx/util.hxx

index 88a0229546e817f4505d5f316aa41454a2e71f34..6faba92778bbaf4feea0940827a2ed87a86750d0 100644 (file)
@@ -65,6 +65,35 @@ inline constexpr auto make_string_view_from_it(_It begin, _It end)
        };
 }
 
+/**
+ * Iterate over lines in a string, newline characters are dropped
+ * @tparam S
+ * @tparam F
+ * @param input
+ * @param functor
+ * @return
+ */
+template<class S, class F, typename std::enable_if_t<std::is_invocable_v<F, std::string_view> &&
+    std::is_constructible_v<std::string_view, S>, bool> = true>
+inline auto string_foreach_line(const S &input, const F &functor)
+{
+       auto it = input.begin();
+       auto end = input.end();
+
+       while (it != end) {
+               auto next = std::find(it, end, '\n');
+               while (next >= it && (*next == '\n' || *next == '\r')) {
+                       --next;
+               }
+               functor(make_string_view_from_it(it, next));
+               it = next;
+
+               if (it != end) {
+                       ++it;
+               }
+       }
+}
+
 /**
  * Enumerate for range loop
  */