commit 8c1c1dd: [Minor] Add utility to iterate over a list of newline separated strings

Vsevolod Stakhov vsevolod at rspamd.com
Sat Jun 24 18:28:03 UTC 2023


Author: Vsevolod Stakhov
Date: 2023-06-24 14:55:55 +0100
URL: https://github.com/rspamd/rspamd/commit/8c1c1ddd88a2ea84ca937fce536553cc4b8cd3da

[Minor] Add utility to iterate over a list of newline separated strings

---
 src/libutil/cxx/util.hxx | 29 +++++++++++++++++++++++++++++
 1 file changed, 29 insertions(+)

diff --git a/src/libutil/cxx/util.hxx b/src/libutil/cxx/util.hxx
index 88a022954..6faba9277 100644
--- a/src/libutil/cxx/util.hxx
+++ b/src/libutil/cxx/util.hxx
@@ -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
  */


More information about the Commits mailing list