diff --git a/include/chaiscript/dispatchkit/boxed_cast_helper.hpp b/include/chaiscript/dispatchkit/boxed_cast_helper.hpp index 4a0c3081..c8dce2e1 100644 --- a/include/chaiscript/dispatchkit/boxed_cast_helper.hpp +++ b/include/chaiscript/dispatchkit/boxed_cast_helper.hpp @@ -167,6 +167,17 @@ namespace chaiscript } }; + /// Cast_Helper_Inner for casting to a std::unique_ptr<> & type + /// \todo Fix the fact that this has to be in a shared_ptr for now + template + struct Cast_Helper_Inner &> + { + static std::unique_ptr &cast(const Boxed_Value &ob, const Type_Conversions_State *) + { + return *(ob.get().cast>>()); + } + }; + /// Cast_Helper_Inner for casting to a std::shared_ptr<> type template diff --git a/include/chaiscript/dispatchkit/boxed_value.hpp b/include/chaiscript/dispatchkit/boxed_value.hpp index 8b3d763b..938aab00 100644 --- a/include/chaiscript/dispatchkit/boxed_value.hpp +++ b/include/chaiscript/dispatchkit/boxed_value.hpp @@ -35,11 +35,11 @@ namespace chaiscript { Data(const Type_Info &ti, chaiscript::detail::Any to, - bool tr, + bool is_ref, const void *t_void_ptr, bool t_return_value) : m_type_info(ti), m_obj(std::move(to)), m_data_ptr(ti.is_const()?nullptr:const_cast(t_void_ptr)), m_const_data_ptr(t_void_ptr), - m_is_ref(tr), m_return_value(t_return_value) + m_is_ref(is_ref), m_return_value(t_return_value) { } @@ -154,7 +154,7 @@ namespace chaiscript return std::make_shared( detail::Get_Type_Info::get(), chaiscript::detail::Any(std::make_shared>(std::move(obj))), - false, + true, ptr, t_return_value ); diff --git a/unittests/compiled_tests.cpp b/unittests/compiled_tests.cpp index 44f23bdf..1a94c738 100644 --- a/unittests/compiled_tests.cpp +++ b/unittests/compiled_tests.cpp @@ -1113,6 +1113,9 @@ TEST_CASE("Use unique_ptr") chai.add(chaiscript::fun([](int &i){ ++i; }), "inci"); chai.add(chaiscript::fun([](int i){ ++i; }), "copyi"); chai.add(chaiscript::fun([](int *i){ ++(*i); }), "derefi"); + chai.add(chaiscript::fun([](const std::unique_ptr &i){ ++(*i); }), "constrefuniqptri"); + chai.add(chaiscript::fun([](std::unique_ptr &i){ ++(*i); }), "refuniqptri"); + chai.add(chaiscript::fun([](std::unique_ptr &&i){ ++(*i); }), "rvaluniqptri"); chai.add(chaiscript::var(std::make_unique(1)), "iptr"); @@ -1123,6 +1126,12 @@ TEST_CASE("Use unique_ptr") CHECK(chai.eval("iptr") == 2); chai.eval("derefi(iptr)"); CHECK(chai.eval("iptr") == 3); + chai.eval("constrefuniqptri(iptr)"); + CHECK(chai.eval("iptr") == 4); + chai.eval("refuniqptri(iptr)"); + CHECK(chai.eval("iptr") == 5); + chai.eval("rvaluniqptri(iptr)"); + CHECK(chai.eval("iptr") == 6); }