non-allocating element() variant on ListParser
parent
1a08b018c6
commit
6fcdbe7ac1
|
@ -771,6 +771,15 @@ namespace util {
|
|||
ostd::Size parse(ostd::Size n);
|
||||
ostd::Size count();
|
||||
|
||||
template<typename R>
|
||||
ostd::Size element(R &&writer) const {
|
||||
if (!quote.empty() && (*quote == '"')) {
|
||||
return unescape_string(ostd::forward<R>(writer), item);
|
||||
} else {
|
||||
return writer.put_n(item.data(), item.size());
|
||||
}
|
||||
}
|
||||
|
||||
CsString element() const;
|
||||
|
||||
private:
|
||||
|
|
|
@ -392,18 +392,9 @@ endblock:
|
|||
}
|
||||
|
||||
CsString ListParser::element() const {
|
||||
CsString s;
|
||||
s.reserve(item.size());
|
||||
if (!quote.empty() && (*quote == '"')) {
|
||||
auto writer = s.iter_cap();
|
||||
util::unescape_string(writer, item);
|
||||
writer.put('\0');
|
||||
} else {
|
||||
memcpy(s.data(), item.data(), item.size());
|
||||
s[item.size()] = '\0';
|
||||
}
|
||||
s.advance(item.size());
|
||||
return s;
|
||||
auto app = ostd::appender<CsString>();
|
||||
element(app);
|
||||
return ostd::move(app.get());
|
||||
}
|
||||
} /* namespace util */
|
||||
|
||||
|
|
Loading…
Reference in New Issue