From: Casey Bodley Date: Tue, 7 Nov 2017 15:54:59 +0000 (-0500) Subject: common: add for_each_substr() for cheap string split X-Git-Tag: v13.0.1~233^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=09448e46ef1eb073d4028595b5ea5b88874b2157;p=ceph.git 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 --- diff --git a/src/include/str_list.h b/src/include/str_list.h index 0a50be7af397..7f5e71659c03 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**.