mirror of
https://github.com/ThePhD/sol2.git
synced 2024-03-22 13:10:44 +08:00
Standard-compliant function signature deduction (cannot use set_function<Args...> format as that creates an ambiguity)
state now has for_each (runs on global table like all other functions) added for_each tests, per @Rapptz request
This commit is contained in:
parent
1792259685
commit
e816d07121
|
@ -105,11 +105,6 @@ struct pusher<function_sig_t<Sigs...>> {
|
||||||
set_isconvertible_fx(is_convertible(), t, L, std::forward<Fx>(fx));
|
set_isconvertible_fx(is_convertible(), t, L, std::forward<Fx>(fx));
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename... Args, typename Fx, typename R = typename std::result_of<Fx(Args...)>::type>
|
|
||||||
static void set_memfx(types<Args...>, lua_State* L, Fx&& fx){
|
|
||||||
set_memfx(types<R(Args...)>(), L, std::forward<Fx>(fx));
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Fx>
|
template<typename Fx>
|
||||||
static void set_memfx(types<>, lua_State* L, Fx&& fx) {
|
static void set_memfx(types<>, lua_State* L, Fx&& fx) {
|
||||||
typedef Unqualified<Unwrap<Fx>> fx_t;
|
typedef Unqualified<Unwrap<Fx>> fx_t;
|
||||||
|
|
|
@ -77,6 +77,10 @@ public:
|
||||||
return get<function>();
|
return get<function>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
operator Unqualified<Table>() const {
|
||||||
|
return get<Unqualified<Table>>();
|
||||||
|
}
|
||||||
|
|
||||||
operator std::string() const {
|
operator std::string() const {
|
||||||
return get<std::string>();
|
return get<std::string>();
|
||||||
}
|
}
|
||||||
|
|
|
@ -192,6 +192,11 @@ public:
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename Fx>
|
||||||
|
void for_each(Fx&& fx) {
|
||||||
|
global.for_each(std::forward<Fx>(fx));
|
||||||
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
table create_table(T&& key, int narr = 0, int nrec = 0) {
|
table create_table(T&& key, int narr = 0, int nrec = 0) {
|
||||||
lua_createtable(L.get(), narr, nrec);
|
lua_createtable(L.get(), narr, nrec);
|
||||||
|
|
|
@ -113,7 +113,9 @@ public:
|
||||||
|
|
||||||
size_t size() const {
|
size_t size() const {
|
||||||
push();
|
push();
|
||||||
return lua_rawlen(state(), -1);
|
size_t result = lua_rawlen(state(), -1);
|
||||||
|
pop();
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
|
@ -166,11 +168,6 @@ private:
|
||||||
set_resolved_function<R(Args...)>(std::forward<Key>(key), std::forward<Fx>(fx));
|
set_resolved_function<R(Args...)>(std::forward<Key>(key), std::forward<Fx>(fx));
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename... Args, typename Fx, typename Key, typename R = typename std::result_of<Fx(Args...)>::type>
|
|
||||||
void set_fx(types<Args...>, Key&& key, Fx&& fx){
|
|
||||||
set_fx(types<R(Args...)>(), std::forward<Key>(key), std::forward<Fx>(fx));
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Fx, typename Key>
|
template<typename Fx, typename Key>
|
||||||
void set_fx(types<>, Key&& key, Fx&& fx) {
|
void set_fx(types<>, Key&& key, Fx&& fx) {
|
||||||
typedef Unqualified<Unwrap<Fx>> fx_t;
|
typedef Unqualified<Unwrap<Fx>> fx_t;
|
||||||
|
|
53
tests.cpp
53
tests.cpp
|
@ -730,6 +730,59 @@ TEST_CASE("tables/arbitrary-creation", "tables should be created from standard c
|
||||||
REQUIRE(c.get<std::string>("project") == "sol");
|
REQUIRE(c.get<std::string>("project") == "sol");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_CASE("tables/for_each", "Testing the use of for_each to get values from a lua table") {
|
||||||
|
sol::state lua;
|
||||||
|
lua.open_libraries(sol::lib::base);
|
||||||
|
|
||||||
|
lua.script("arr = {\n"
|
||||||
|
"[0] = \"Hi\",\n"
|
||||||
|
"[1] = 123.45,\n"
|
||||||
|
"[2] = \"String value\",\n"
|
||||||
|
// Does nothing
|
||||||
|
//"[3] = nil,\n"
|
||||||
|
//"[nil] = 3,\n"
|
||||||
|
"[\"WOOF\"] = 123,\n"
|
||||||
|
"}");
|
||||||
|
sol::table tbl = lua[ "arr" ];
|
||||||
|
std::size_t tablesize = 4;
|
||||||
|
std::size_t iterations = 0;
|
||||||
|
tbl.for_each(
|
||||||
|
[&iterations](sol::object key, sol::object value) {
|
||||||
|
++iterations;
|
||||||
|
sol::type keytype = key.get_type();
|
||||||
|
switch (keytype) {
|
||||||
|
case sol::type::number:
|
||||||
|
switch (key.as<int>()) {
|
||||||
|
case 0:
|
||||||
|
REQUIRE((value.as<std::string>() == "Hi"));
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
REQUIRE((value.as<double>() == 123.45));
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
REQUIRE((value.as<std::string>() == "String value"));
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
REQUIRE((value.is<sol::nil_t>()));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case sol::type::string:
|
||||||
|
if (key.as<std::string>() == "WOOF") {
|
||||||
|
REQUIRE((value.as<double>() == 123));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case sol::type::nil:
|
||||||
|
REQUIRE((value.as<double>() == 3));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
REQUIRE(iterations == tablesize);
|
||||||
|
}
|
||||||
|
|
||||||
TEST_CASE("tables/issue-number-twenty-five", "Using pointers and references from C++ classes in Lua") {
|
TEST_CASE("tables/issue-number-twenty-five", "Using pointers and references from C++ classes in Lua") {
|
||||||
struct test {
|
struct test {
|
||||||
int x = 0;
|
int x = 0;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user