From 69476967aeaa245c452a3b3b92b9ba3c571bb958 Mon Sep 17 00:00:00 2001 From: Glen Fraser Date: Fri, 18 Jun 2021 16:40:38 +0200 Subject: [PATCH] Reimplement pair_conversion() helper - resolves issue #563. --- .../dispatchkit/type_conversions.hpp | 18 ++++++++++++++++ unittests/compiled_tests.cpp | 21 +++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/include/chaiscript/dispatchkit/type_conversions.hpp b/include/chaiscript/dispatchkit/type_conversions.hpp index e47afbf7..3f89e66b 100644 --- a/include/chaiscript/dispatchkit/type_conversions.hpp +++ b/include/chaiscript/dispatchkit/type_conversions.hpp @@ -534,6 +534,24 @@ namespace chaiscript { return chaiscript::make_shared>( user_type>(), user_type(), func); } + + template + Type_Conversion pair_conversion() { + auto func = [](const Boxed_Value &t_bv) -> Boxed_Value { + const std::pair &from_pair + = detail::Cast_Helper &>::cast(t_bv, nullptr); + + auto pair = std::make_pair( + detail::Cast_Helper::cast(from_pair.first, nullptr), + detail::Cast_Helper::cast(from_pair.second, nullptr) + ); + + return Boxed_Value(std::move(pair)); + }; + + return chaiscript::make_shared>( + user_type>(), user_type>(), func); + } } // namespace chaiscript #endif diff --git a/unittests/compiled_tests.cpp b/unittests/compiled_tests.cpp index f8873df8..29f49875 100644 --- a/unittests/compiled_tests.cpp +++ b/unittests/compiled_tests.cpp @@ -866,6 +866,27 @@ TEST_CASE("Map conversions") { CHECK(c == 42); } +TEST_CASE("Pair conversions") { + chaiscript::ChaiScript_Basic chai(create_chaiscript_stdlib(), create_chaiscript_parser()); + chai.add(chaiscript::pair_conversion()); + chai.add(chaiscript::pair_conversion()); + + { + const auto p = chai.eval>(R"cs( + Pair("chai", "script"); + )cs"); + CHECK(p.first == std::string{ "chai" }); + CHECK(p.second == "script"); + } + { + const auto p = chai.eval>(R"cs( + Pair(5, 3.14); + )cs"); + CHECK(p.first == 5); + CHECK(p.second == Approx(3.14)); + } +} + TEST_CASE("Parse floats with non-posix locale") { #ifdef CHAISCRIPT_MSVC std::setlocale(LC_ALL, "en-ZA");