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 <cbodley@redhat.com>
This commit is contained in:
Casey Bodley 2017-11-07 10:54:59 -05:00
parent a942dfd4ab
commit 09448e46ef

View File

@ -5,6 +5,26 @@
#include <set>
#include <string>
#include <vector>
#include <boost/utility/string_view.hpp>
namespace ceph {
/// Split a string using the given delimiters, passing each piece as a
/// (non-null-terminated) boost::string_view to the callback.
template <typename Func> // 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**.