0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-11-26 08:42:34 +01:00

ircd::tokens: Add a string separator functor.

This commit is contained in:
Jason Volk 2020-05-11 16:09:11 -07:00
parent 613464c476
commit 890dc6f003

View file

@ -10,6 +10,29 @@
#include <boost/tokenizer.hpp> #include <boost/tokenizer.hpp>
namespace ircd
{
struct string_separator;
};
struct [[gnu::visibility("internal")]]
ircd::string_separator
{
string_view delim;
template<class iterator,
class token>
bool operator()(iterator &next, iterator end, token &ret) const noexcept;
void reset() noexcept;
string_separator(const string_view &delim) noexcept;
~string_separator() noexcept;
};
//
// interface
//
ircd::string_view ircd::string_view
ircd::tokens_before(const string_view &str, ircd::tokens_before(const string_view &str,
const char &sep, const char &sep,
@ -360,3 +383,56 @@ ircd::tokens(const string_view &str,
std::for_each(begin(view), end(view), closure); std::for_each(begin(view), end(view), closure);
} }
//
// string_separator
//
ircd::string_separator::string_separator(const string_view &delim)
noexcept
:delim
{
delim
}
{
}
ircd::string_separator::~string_separator()
noexcept
{
}
void
ircd::string_separator::reset()
noexcept
{
//TODO: ???
}
template<class iterator,
class token>
bool
ircd::string_separator::operator()(iterator &start,
iterator stop,
token &ret)
const noexcept
{
do
{
if(start == stop)
return false;
const string_view input
{
start, stop
};
string_view remain;
std::tie(ret, remain) = ircd::split(input, delim);
start = remain?
begin(remain):
stop;
}
while(!ret);
return true;
}