Deal with returning of & to * types

This commit is contained in:
Jason Turner 2018-08-15 13:10:23 -06:00
parent 4be5e876b8
commit 44dab4d45c
2 changed files with 36 additions and 10 deletions

View File

@ -167,17 +167,33 @@ namespace chaiscript
}
};
template<typename Ret>
struct Handle_Return<const Ret &>
template<typename Ret, bool Ptr>
struct Handle_Return_Ref
{
static Boxed_Value handle(const Ret &r)
template<typename T>
static Boxed_Value handle(T &&r)
{
return Boxed_Value(std::cref(r), true);
}
};
template<typename Ret>
struct Handle_Return_Ref<Ret, true>
{
template<typename T>
static Boxed_Value handle(T &&r)
{
return Boxed_Value(typename std::remove_reference<decltype(r)>::type{r}, true);
}
};
template<typename Ret>
struct Handle_Return<const Ret &> : Handle_Return_Ref<const Ret &, std::is_pointer<typename std::remove_reference<const Ret &>::type>::value>
{
};
template<typename Ret>
struct Handle_Return<const Ret>
{

View File

@ -214,18 +214,28 @@ TEST_CASE("Deduction of pointer return types")
auto get_val_ptr = [&]() -> int * { return val_ptr; };
auto get_val_const_ptr = [&]() -> int const * { return val_ptr; };
auto get_val_ptr_ref = [&]() -> int *& { return val_ptr_ref; };
auto get_val_const_ptr_ref = [&]() -> int * const & { return val_ptr_const_ref; };
auto get_val_ptr_const_ref = [&]() -> int * const & { return val_ptr_const_ref; };
// auto get_val_const_ptr_const_ref = [ref=std::cref(val_ptr)]() -> int const * const & { return ref.get(); };
chaiscript::ChaiScript_Basic chai(create_chaiscript_stdlib(), create_chaiscript_parser());
chai.add(chaiscript::fun(get_val_ptr), "get_val_ptr");
chai.add(chaiscript::fun(get_val_const_ptr), "get_val_const_ptr");
chai.add(chaiscript::fun(get_val_ptr_ref), "get_val_ptr_ref");
chai.add(chaiscript::fun(get_val_const_ptr_ref), "get_val_const_ptr_ref");
chai.add(chaiscript::fun(get_val_ptr_const_ref), "get_val_ptr_const_ref");
// chai.add(chaiscript::fun(get_val_const_ptr_const_ref), "get_val_const_ptr_const_ref");
CHECK(chai.eval<int *>("get_val_ptr()") == &val);
CHECK(chai.eval<int * const>("get_val_const_ptr()") == &val);
CHECK(chai.eval<int *&>("get_val_ptr_ref()") == &val);
CHECK(chai.eval<int * const &>("get_val_const_ptr_ref()") == &val);
CHECK(*chai.eval<int *>("get_val_ptr()") == val);
CHECK(chai.eval<int const *>("get_val_const_ptr()") == &val);
CHECK(*chai.eval<int const *>("get_val_const_ptr()") == val);
// note that we cannot maintain the references here,
// chaiscript internals cannot handle that, effectively pointer to pointer
CHECK(chai.eval<int *>("get_val_ptr_ref()") == &val);
CHECK(*chai.eval<int *>("get_val_ptr_ref()") == val);
CHECK(chai.eval<int *>("get_val_ptr_const_ref()") == &val);
CHECK(*chai.eval<int *>("get_val_ptr_const_ref()") == val);
// CHECK(chai.eval<int const *>("get_val_const_ptr_const_ref()") == &val);
}