mirror of
https://github.com/ceph/ceph
synced 2024-12-29 23:12:27 +00:00
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:
parent
a942dfd4ab
commit
09448e46ef
@ -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**.
|
||||
|
Loading…
Reference in New Issue
Block a user