update single
This commit is contained in:
ThePhD 2018-06-15 15:50:51 -04:00
parent 2777b6ad15
commit 92f3330e03
4 changed files with 22440 additions and 21961 deletions

File diff suppressed because it is too large Load Diff

View File

@ -20,8 +20,8 @@
// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
// This file was generated with a script.
// Generated 2018-06-11 18:42:24.829810 UTC
// This header was generated with sol v2.20.2 (revision ac70911)
// Generated 2018-06-15 19:50:08.054132 UTC
// This header was generated with sol v2.20.2 (revision 2777b6a)
// https://github.com/ThePhD/sol2
#ifndef SOL_SINGLE_INCLUDE_FORWARD_HPP
@ -221,6 +221,10 @@
// end of sol/config.hpp
// beginning of sol/config_setup.hpp
// end of sol/config_setup.hpp
// end of sol/feature_test.hpp
namespace sol {

View File

@ -252,27 +252,44 @@ namespace stack {
struct pusher<detail::as_table_tag<T>> {
static int push(lua_State* L, const T& tablecont) {
typedef meta::has_key_value_pair<meta::unqualified_t<std::remove_pointer_t<T>>> has_kvp;
return push(has_kvp(), L, tablecont);
return push(has_kvp(), std::false_type(), L, tablecont);
}
static int push(std::true_type, lua_State* L, const T& tablecont) {
typedef meta::has_key_value_pair<meta::unqualified_t<std::remove_pointer_t<T>>> has_kvp;
return push(has_kvp(), std::true_type(), L, tablecont);
}
static int push(std::false_type, lua_State* L, const T& tablecont) {
typedef meta::has_key_value_pair<meta::unqualified_t<std::remove_pointer_t<T>>> has_kvp;
return push(has_kvp(), std::false_type(), L, tablecont);
}
template <bool is_nested>
static int push(std::true_type, std::integral_constant<bool, is_nested>, lua_State* L, const T& tablecont) {
auto& cont = detail::deref(detail::unwrap(tablecont));
lua_createtable(L, static_cast<int>(cont.size()), 0);
int tableindex = lua_gettop(L);
for (const auto& pair : cont) {
if (is_nested) {
set_field(L, pair.first, as_nested_ref(pair.second), tableindex);
}
else {
set_field(L, pair.first, pair.second, tableindex);
}
}
return 1;
}
static int push(std::false_type, lua_State* L, const T& tablecont) {
template <bool is_nested>
static int push(std::false_type, std::integral_constant<bool, is_nested>, lua_State* L, const T& tablecont) {
auto& cont = detail::deref(detail::unwrap(tablecont));
lua_createtable(L, stack_detail::get_size_hint(cont), 0);
int tableindex = lua_gettop(L);
std::size_t index = 1;
for (const auto& i : cont) {
#if SOL_LUA_VERSION >= 503
int p = stack::push(L, i);
int p = is_nested ? stack::push(L, as_nested_ref(i)) : stack::push(L, i);
for (int pi = 0; pi < p; ++pi) {
lua_seti(L, tableindex, static_cast<lua_Integer>(index++));
}
@ -317,9 +334,19 @@ namespace stack {
};
template <typename T>
struct pusher<nested<T>> {
struct pusher<nested<T>, std::enable_if_t<is_container<std::remove_pointer_t<meta::unwrap_unqualified_t<T>>>::value>> {
static int push(lua_State* L, const T& tablecont) {
pusher<as_table_t<T>> p{};
pusher<detail::as_table_tag<T>> p{};
// silence annoying VC++ warning
(void)p;
return p.push(std::true_type(), L, tablecont);
}
};
template <typename T>
struct pusher<nested<T>, std::enable_if_t<!is_container<std::remove_pointer_t<meta::unwrap_unqualified_t<T>>>::value>> {
static int push(lua_State* L, const T& tablecont) {
pusher<meta::unqualified_t<T>> p{};
// silence annoying VC++ warning
(void)p;
return p.push(L, tablecont);

View File

@ -346,6 +346,44 @@ TEST_CASE("containers/from table argument conversions", "test table conversions
REQUIRE(passed);
}
TEST_CASE("containers/deeply nested", "make sure nested works for deeply-nested C++ containers and works as advertised") {
typedef std::map<const char *, std::string> info_t;
typedef std::vector<info_t> info_vector;
class ModList {
public:
info_vector list;
ModList() {
list.push_back(info_t{
{"a", "b"}
});
}
sol::nested<info_vector> getList () {
return sol::nested<info_vector>(list);
};
};
sol::state lua;
lua.open_libraries(sol::lib::base);
lua.new_usertype<ModList>("ModList",
"getList", &ModList::getList
);
sol::string_view code = R"(
mods = ModList.new()
local modlist = mods:getList()
print(modlist[1])
assert(type(modlist) == "table")
assert(type(modlist[1]) == "table")
)";
auto result1 = lua.safe_script(code, sol::script_pass_on_error);
REQUIRE(result1.valid());
}
TEST_CASE("containers/vector roundtrip", "make sure vectors can be round-tripped") {
sol::state lua;
std::vector<int> v{ 1, 2, 3 };