From 8c1c1ddd88a2ea84ca937fce536553cc4b8cd3da Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Sat, 24 Jun 2023 14:55:55 +0100 Subject: [PATCH] [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 && + std::is_constructible_v, 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 */ -- 2.39.5