From 26bcc43578b4d6fe898a25eed575ef40080ab5ce Mon Sep 17 00:00:00 2001 From: Daniel Kolesa Date: Fri, 19 Mar 2021 00:30:54 +0100 Subject: [PATCH] get rid of tvals_concat in favor of simpler api --- include/cubescript/cubescript.hh | 39 ++++---------------------------- src/cs_util.cc | 24 ++++++++++++++++++++ src/cs_vm.cc | 26 ++++++++------------- src/lib_str.cc | 12 ++++------ 4 files changed, 42 insertions(+), 59 deletions(-) diff --git a/include/cubescript/cubescript.hh b/include/cubescript/cubescript.hh index 0c02c78..95aa10f 100644 --- a/include/cubescript/cubescript.hh +++ b/include/cubescript/cubescript.hh @@ -662,6 +662,10 @@ OSTD_EXPORT std::size_t list_count(cs_list_parse_state &ps, cs_state &cs); OSTD_EXPORT cs_strref list_get_item(cs_list_parse_state &ps, cs_state &cs); OSTD_EXPORT void list_find_item(cs_list_parse_state &ps); +OSTD_EXPORT cs_strref value_list_concat( + cs_state &cs, cs_value_r vals, ostd::string_range sep = ostd::string_range{} +); + namespace util { template inline R &&escape_string(R &&writer, ostd::string_range str) { @@ -777,41 +781,6 @@ namespace util { } } - template - inline void tvals_concat( - R &&writer, cs_value_r vals, - ostd::string_range sep = ostd::string_range() - ) { - for (size_t i = 0; i < vals.size(); ++i) { - switch (vals[i].get_type()) { - case cs_value_type::INT: { - format_int( - std::forward(writer), vals[i].get_int() - ); - break; - } - case cs_value_type::FLOAT: { - format_float( - std::forward(writer), vals[i].get_float() - ); - break; - } - case cs_value_type::STRING: { - ostd::range_put_all( - writer, ostd::string_range{vals[i].get_str()} - ); - break; - } - default: - break; - } - if (i == (vals.size() - 1)) { - break; - } - ostd::range_put_all(writer, sep); - } - } - template inline void print_stack(R &&writer, cs_stack_state const &st) { auto nd = st.get(); diff --git a/src/cs_util.cc b/src/cs_util.cc index 26015f3..1b1e969 100644 --- a/src/cs_util.cc +++ b/src/cs_util.cc @@ -473,4 +473,28 @@ OSTD_EXPORT void list_find_item(cs_list_parse_state &ps) { } } +OSTD_EXPORT cs_strref value_list_concat( + cs_state &cs, cs_value_r vals, ostd::string_range sep +) { + auto app = ostd::appender(); + for (std::size_t i = 0; i < vals.size(); ++i) { + switch (vals[i].get_type()) { + case cs_value_type::INT: + case cs_value_type::FLOAT: + case cs_value_type::STRING: { + cs_value v{vals[i]}; + ostd::range_put_all(app, cs_value{vals[i]}.force_str()); + break; + } + default: + break; + } + if (i == (vals.size() - 1)) { + break; + } + ostd::range_put_all(app, sep); + } + return cs_strref{cs, ostd::iter(app.get())}; +} + } /* namespace cscript */ diff --git a/src/cs_vm.cc b/src/cs_vm.cc index 6196f36..df55658 100644 --- a/src/cs_vm.cc +++ b/src/cs_vm.cc @@ -465,10 +465,8 @@ static inline void callcommand( break; case 'C': { i = std::max(i + 1, numargs); - auto buf = ostd::appender(); - cscript::util::tvals_concat(buf, ostd::iter(args, args + i), " "); cs_value tv{cs}; - tv.set_str(buf.get()); + tv.set_str(value_list_concat(cs, ostd::iter(args, args + i), " ")); cs_cmd_internal::call(cs, id, cs_value_r(&tv, &tv + 1), res); return; } @@ -1381,12 +1379,10 @@ static uint32_t *runcode(cs_state &cs, uint32_t *code, cs_value &result) { int callargs = (op >> 8) & 0x1F, offset = numargs - callargs; result.force_none(); { - auto buf = ostd::appender(); - cscript::util::tvals_concat(buf, ostd::iter( - &args[offset], &args[offset + callargs] - ), " "); cs_value tv{cs}; - tv.set_str(buf.get()); + tv.set_str(value_list_concat(cs, ostd::iter( + &args[offset], &args[offset + callargs] + ), " ")); cs_cmd_internal::call(cs, id, cs_value_r(&tv, &tv + 1), result); } force_arg(result, op & CS_CODE_RET_MASK); @@ -1403,13 +1399,12 @@ static uint32_t *runcode(cs_state &cs, uint32_t *code, cs_value &result) { case CS_CODE_CONC_W | CS_RET_FLOAT: case CS_CODE_CONC_W | CS_RET_INT: { int numconc = op >> 8; - auto buf = ostd::appender(); - cscript::util::tvals_concat( - buf, ostd::iter(&args[numargs - numconc], &args[numargs]), + auto buf = value_list_concat( + cs, ostd::iter(&args[numargs - numconc], &args[numargs]), ((op & CS_CODE_OP_MASK) == CS_CODE_CONC) ? " " : "" ); numargs = numargs - numconc; - args[numargs].set_str(buf.get()); + args[numargs].set_str(buf); force_arg(args[numargs], op & CS_CODE_RET_MASK); numargs++; continue; @@ -1420,12 +1415,11 @@ static uint32_t *runcode(cs_state &cs, uint32_t *code, cs_value &result) { case CS_CODE_CONC_M | CS_RET_FLOAT: case CS_CODE_CONC_M | CS_RET_INT: { int numconc = op >> 8; - auto buf = ostd::appender(); - cscript::util::tvals_concat( - buf, ostd::iter(&args[numargs - numconc], &args[numargs]) + auto buf = value_list_concat( + cs, ostd::iter(&args[numargs - numconc], &args[numargs]) ); numargs = numargs - numconc; - result.set_str(buf.get()); + result.set_str(buf); force_arg(result, op & CS_CODE_RET_MASK); continue; } diff --git a/src/lib_str.cc b/src/lib_str.cc index bfd454d..1c75d2f 100644 --- a/src/lib_str.cc +++ b/src/lib_str.cc @@ -84,16 +84,12 @@ void cs_init_lib_string(cs_state &cs) { res.set_str(s.get()); }); - cs.new_command("concat", "V", [](auto &, auto args, auto &res) { - auto s = ostd::appender(); - cscript::util::tvals_concat(s, args, " "); - res.set_str(s.get()); + cs.new_command("concat", "V", [](auto &ccs, auto args, auto &res) { + res.set_str(value_list_concat(ccs, args, " ")); }); - cs.new_command("concatword", "V", [](auto &, auto args, auto &res) { - auto s = ostd::appender(); - cscript::util::tvals_concat(s, args); - res.set_str(s.get()); + cs.new_command("concatword", "V", [](auto &ccs, auto args, auto &res) { + res.set_str(value_list_concat(ccs, args)); }); cs.new_command("format", "V", [](auto &, auto args, auto &res) {