From 6fcdbe7ac1d546571d39cb84ffd473fa4412d9d6 Mon Sep 17 00:00:00 2001 From: q66 Date: Mon, 24 Oct 2016 02:52:25 +0200 Subject: [PATCH] non-allocating element() variant on ListParser --- include/cubescript/cubescript.hh | 9 +++++++++ src/cs_util.cc | 15 +++------------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/include/cubescript/cubescript.hh b/include/cubescript/cubescript.hh index 082d20b..ae86947 100644 --- a/include/cubescript/cubescript.hh +++ b/include/cubescript/cubescript.hh @@ -771,6 +771,15 @@ namespace util { ostd::Size parse(ostd::Size n); ostd::Size count(); + template + ostd::Size element(R &&writer) const { + if (!quote.empty() && (*quote == '"')) { + return unescape_string(ostd::forward(writer), item); + } else { + return writer.put_n(item.data(), item.size()); + } + } + CsString element() const; private: diff --git a/src/cs_util.cc b/src/cs_util.cc index 2e977e9..8f2f0e6 100644 --- a/src/cs_util.cc +++ b/src/cs_util.cc @@ -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(); + element(app); + return ostd::move(app.get()); } } /* namespace util */