From 09448e46ef1eb073d4028595b5ea5b88874b2157 Mon Sep 17 00:00:00 2001 From: Casey Bodley Date: Tue, 7 Nov 2017 10:54:59 -0500 Subject: [PATCH] common: add for_each_substr() for cheap string split using boost::string_view avoids copies (and potential allocation) of the substrings using a callback model avoids baking in the container type, along with the copies and allocations required for insertion this interface is ideal for cases where you just want to iterate over the substrings, and don't actually need to store them in a container Signed-off-by: Casey Bodley --- src/include/str_list.h | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/include/str_list.h b/src/include/str_list.h index 0a50be7af39..7f5e71659c0 100644 --- a/src/include/str_list.h +++ b/src/include/str_list.h @@ -5,6 +5,26 @@ #include #include #include +#include + + +namespace ceph { + +/// Split a string using the given delimiters, passing each piece as a +/// (non-null-terminated) boost::string_view to the callback. +template // where Func(boost::string_view) is a valid call +void for_each_substr(boost::string_view s, const char *delims, Func&& f) +{ + auto pos = s.find_first_not_of(delims); + while (pos != s.npos) { + s.remove_prefix(pos); // trim delims from the front + auto end = s.find_first_of(delims); + f(s.substr(0, end)); + pos = s.find_first_not_of(delims, end); + } +} + +} // namespace ceph /** * Split **str** into a list of strings, using the ";,= \t" delimiters and output the result in **str_list**.