mirror of
https://github.com/ChaiScript/ChaiScript.git
synced 2025-12-06 16:57:04 +08:00
Deal with returning of & to * types
This commit is contained in:
parent
4be5e876b8
commit
44dab4d45c
@ -167,17 +167,33 @@ namespace chaiscript
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template<typename Ret, bool Ptr>
|
||||||
|
struct Handle_Return_Ref
|
||||||
template<typename Ret>
|
|
||||||
struct Handle_Return<const Ret &>
|
|
||||||
{
|
{
|
||||||
static Boxed_Value handle(const Ret &r)
|
template<typename T>
|
||||||
|
static Boxed_Value handle(T &&r)
|
||||||
{
|
{
|
||||||
return Boxed_Value(std::cref(r), true);
|
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>
|
template<typename Ret>
|
||||||
struct Handle_Return<const Ret>
|
struct Handle_Return<const Ret>
|
||||||
{
|
{
|
||||||
|
|||||||
@ -214,18 +214,28 @@ TEST_CASE("Deduction of pointer return types")
|
|||||||
auto get_val_ptr = [&]() -> int * { return val_ptr; };
|
auto get_val_ptr = [&]() -> int * { return val_ptr; };
|
||||||
auto get_val_const_ptr = [&]() -> int const * { 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_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());
|
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_ptr), "get_val_ptr");
|
||||||
chai.add(chaiscript::fun(get_val_const_ptr), "get_val_const_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_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 *>("get_val_ptr()") == &val);
|
||||||
CHECK(chai.eval<int * const>("get_val_const_ptr()") == &val);
|
CHECK(*chai.eval<int *>("get_val_ptr()") == val);
|
||||||
CHECK(chai.eval<int *&>("get_val_ptr_ref()") == &val);
|
CHECK(chai.eval<int const *>("get_val_const_ptr()") == &val);
|
||||||
CHECK(chai.eval<int * const &>("get_val_const_ptr_ref()") == &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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user