diff options
-rw-r--r-- | src/libutil/cxx/util.hxx | 29 |
1 files changed, 29 insertions, 0 deletions
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 @@ -66,6 +66,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 */ template <typename T, |