From e6a6a20eb657240c0bea05729eb9979b2edf7053 Mon Sep 17 00:00:00 2001 From: Jason Turner Date: Sat, 26 Aug 2017 08:24:55 -0600 Subject: [PATCH] Handful for C++17 things --- .../dispatchkit/proxy_functions_detail.hpp | 28 +++++-------------- .../chaiscript/language/chaiscript_eval.hpp | 21 +++++++------- 2 files changed, 18 insertions(+), 31 deletions(-) diff --git a/include/chaiscript/dispatchkit/proxy_functions_detail.hpp b/include/chaiscript/dispatchkit/proxy_functions_detail.hpp index 70d77b9a..8db9b509 100644 --- a/include/chaiscript/dispatchkit/proxy_functions_detail.hpp +++ b/include/chaiscript/dispatchkit/proxy_functions_detail.hpp @@ -82,10 +82,7 @@ namespace chaiscript { try { std::vector::size_type i = 0; - (void)i; - (void)params; (void)t_conversions; - // this is ok because the order of evaluation of initializer lists is well defined - (void)std::initializer_list{(boxed_cast(params[i++], &t_conversions), 0)...}; + ( boxed_cast(params[i++], &t_conversions), ... ); return true; } catch (const exception::bad_boxed_cast &) { return false; @@ -111,23 +108,12 @@ namespace chaiscript Boxed_Value call_func(const chaiscript::dispatch::detail::Function_Signature &sig, const Callable &f, const std::vector ¶ms, const Type_Conversions_State &t_conversions) { - return Handle_Return::handle(call_func(sig, std::index_sequence_for{}, f, params, t_conversions)); - } - - template - Boxed_Value call_func(const chaiscript::dispatch::detail::Function_Signature &sig, const Callable &f, - const std::vector ¶ms, const Type_Conversions_State &t_conversions) - { - call_func(sig, std::index_sequence_for{}, f, params, t_conversions); -#ifdef CHAISCRIPT_MSVC -#pragma warning(push) -#pragma warning(disable : 4702) -#endif - // MSVC is reporting that this is unreachable code - and it's wrong. - return Handle_Return::handle(); -#ifdef CHAISCRIPT_MSVC -#pragma warning(pop) -#endif + if constexpr (std::is_same_v) { + call_func(sig, std::index_sequence_for{}, f, params, t_conversions); + return Handle_Return::handle(); + } else { + return Handle_Return::handle(call_func(sig, std::index_sequence_for{}, f, params, t_conversions)); + } } } diff --git a/include/chaiscript/language/chaiscript_eval.hpp b/include/chaiscript/language/chaiscript_eval.hpp index 23557ca1..1b05cac7 100644 --- a/include/chaiscript/language/chaiscript_eval.hpp +++ b/include/chaiscript/language/chaiscript_eval.hpp @@ -57,8 +57,9 @@ namespace chaiscript chaiscript::detail::Dispatch_State state(t_ss); const Boxed_Value *thisobj = [&]() -> const Boxed_Value *{ - auto &stack = t_ss.get_stack_data(state.stack_holder()).back(); - if (!stack.empty() && stack.back().first == "__this") { + if (auto &stack = t_ss.get_stack_data(state.stack_holder()).back(); + !stack.empty() && stack.back().first == "__this") + { return &stack.back().second; } else if (!t_vals.empty()) { return &t_vals[0]; @@ -71,8 +72,8 @@ namespace chaiscript if (thisobj && !has_this_capture) { state.add_object("this", *thisobj); } if (t_locals) { - for (const auto &local : *t_locals) { - state.add_object(local.first, local.second); + for (const auto &[name, value] : *t_locals) { + state.add_object(name, value); } } @@ -109,7 +110,7 @@ namespace chaiscript std::vector> get_children() const final { std::vector> retval; retval.reserve(children.size()); - for (auto &&child : children) { + for (auto &child : children) { retval.emplace_back(*child); } @@ -868,9 +869,9 @@ namespace chaiscript Boxed_Value eval_internal(const chaiscript::detail::Dispatch_State &t_ss) const override{ const auto get_function = [&t_ss](const std::string &t_name, auto &t_hint){ uint_fast32_t hint = t_hint; - auto funs = t_ss->get_function(t_name, hint); - if (funs.first != hint) { t_hint = uint_fast32_t(funs.first); } - return std::move(funs.second); + auto [funs_loc, funs] = t_ss->get_function(t_name, hint); + if (funs_loc != hint) { t_hint = uint_fast32_t(funs_loc); } + return std::move(funs); }; const auto call_function = [&t_ss](const auto &t_funcs, const Boxed_Value &t_param) { @@ -1056,8 +1057,8 @@ namespace chaiscript if (!this->children.empty()) { vec.reserve(this->children[0]->children.size()); for (const auto &child : this->children[0]->children) { - auto obj = child->eval(t_ss); - if (!obj.is_return_value()) { + if (auto obj = child->eval(t_ss); + !obj.is_return_value()) { vec.push_back(t_ss->call_function("clone", m_loc, {obj}, t_ss.conversions())); } else { vec.push_back(std::move(obj));