Sigh. Make sure that tuple expansion works in buggy VC++ compiler.

This commit is contained in:
ThePhD 2016-09-26 04:02:03 -04:00
parent 63093ecba4
commit d7b037da73
5 changed files with 57 additions and 10 deletions

View File

@ -20,8 +20,8 @@
// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
// This file was generated with a script. // This file was generated with a script.
// Generated 2016-09-22 16:13:14.308519 UTC // Generated 2016-09-26 08:01:11.472268 UTC
// This header was generated with sol v2.14.2 (revision dc000fb) // This header was generated with sol v2.14.2 (revision 63093ec)
// https://github.com/ThePhD/sol2 // https://github.com/ThePhD/sol2
#ifndef SOL_SINGLE_INCLUDE_HPP #ifndef SOL_SINGLE_INCLUDE_HPP
@ -3005,6 +3005,12 @@ namespace sol {
operator int() const { return index; } operator int() const { return index; }
}; };
struct raw_index {
int index;
raw_index(int i) : index(i) {}
operator int() const { return index; }
};
struct absolute_index { struct absolute_index {
int index; int index;
absolute_index(lua_State* L, int idx) : index(lua_absindex(L, idx)) {} absolute_index(lua_State* L, int idx) : index(lua_absindex(L, idx)) {}
@ -3581,6 +3587,8 @@ namespace sol {
stack_reference() noexcept = default; stack_reference() noexcept = default;
stack_reference(nil_t) noexcept : stack_reference() {}; stack_reference(nil_t) noexcept : stack_reference() {};
stack_reference(lua_State* L, int i) noexcept : L(L), index(lua_absindex(L, i)) {} stack_reference(lua_State* L, int i) noexcept : L(L), index(lua_absindex(L, i)) {}
stack_reference(lua_State* L, absolute_index i) noexcept : L(L), index(i) {}
stack_reference(lua_State* L, raw_index i) noexcept : L(L), index(i) {}
stack_reference(stack_reference&& o) noexcept = default; stack_reference(stack_reference&& o) noexcept = default;
stack_reference& operator=(stack_reference&&) noexcept = default; stack_reference& operator=(stack_reference&&) noexcept = default;
stack_reference(const stack_reference&) noexcept = default; stack_reference(const stack_reference&) noexcept = default;
@ -5354,12 +5362,22 @@ namespace sol {
template<typename... Args> template<typename... Args>
struct getter<std::tuple<Args...>> { struct getter<std::tuple<Args...>> {
template <std::size_t... I> typedef std::tuple<decltype(stack::get<Args>(nullptr, 0))...> R;
static decltype(auto) apply(std::index_sequence<I...>, lua_State* L, int index, record& tracking) {
return std::tuple<decltype(stack::get<Args>(L, index))...>{stack::get<Args>(L, index + tracking.used, tracking)...}; template <typename... TArgs>
static R apply(std::index_sequence<>, lua_State*, int, record&, TArgs&&... args) {
// Fuck you too, VC++
return R{std::forward<TArgs>(args)...};
} }
static decltype(auto) get(lua_State* L, int index, record& tracking) { template <std::size_t I, std::size_t... Ix, typename... TArgs>
static R apply(std::index_sequence<I, Ix...>, lua_State* L, int index, record& tracking, TArgs&&... args) {
// Fuck you too, VC++
typedef std::tuple_element_t<I, std::tuple<Args...>> T;
return apply(std::index_sequence<Ix...>(), L, index, tracking, std::forward<TArgs>(args)..., stack::get<T>(L, index + tracking.used, tracking));
}
static R get(lua_State* L, int index, record& tracking) {
return apply(std::make_index_sequence<sizeof...(Args)>(), L, index, tracking); return apply(std::make_index_sequence<sizeof...(Args)>(), L, index, tracking);
} }
}; };

View File

@ -504,12 +504,22 @@ namespace sol {
template<typename... Args> template<typename... Args>
struct getter<std::tuple<Args...>> { struct getter<std::tuple<Args...>> {
template <std::size_t... I> typedef std::tuple<decltype(stack::get<Args>(nullptr, 0))...> R;
static decltype(auto) apply(std::index_sequence<I...>, lua_State* L, int index, record& tracking) {
return std::tuple<decltype(stack::get<Args>(L, index))...>{stack::get<Args>(L, index + tracking.used, tracking)...}; template <typename... TArgs>
static R apply(std::index_sequence<>, lua_State*, int, record&, TArgs&&... args) {
// Fuck you too, VC++
return R{std::forward<TArgs>(args)...};
} }
static decltype(auto) get(lua_State* L, int index, record& tracking) { template <std::size_t I, std::size_t... Ix, typename... TArgs>
static R apply(std::index_sequence<I, Ix...>, lua_State* L, int index, record& tracking, TArgs&&... args) {
// Fuck you too, VC++
typedef std::tuple_element_t<I, std::tuple<Args...>> T;
return apply(std::index_sequence<Ix...>(), L, index, tracking, std::forward<TArgs>(args)..., stack::get<T>(L, index + tracking.used, tracking));
}
static R get(lua_State* L, int index, record& tracking) {
return apply(std::make_index_sequence<sizeof...(Args)>(), L, index, tracking); return apply(std::make_index_sequence<sizeof...(Args)>(), L, index, tracking);
} }
}; };

View File

@ -37,6 +37,8 @@ namespace sol {
stack_reference() noexcept = default; stack_reference() noexcept = default;
stack_reference(nil_t) noexcept : stack_reference() {}; stack_reference(nil_t) noexcept : stack_reference() {};
stack_reference(lua_State* L, int i) noexcept : L(L), index(lua_absindex(L, i)) {} stack_reference(lua_State* L, int i) noexcept : L(L), index(lua_absindex(L, i)) {}
stack_reference(lua_State* L, absolute_index i) noexcept : L(L), index(i) {}
stack_reference(lua_State* L, raw_index i) noexcept : L(L), index(i) {}
stack_reference(stack_reference&& o) noexcept = default; stack_reference(stack_reference&& o) noexcept = default;
stack_reference& operator=(stack_reference&&) noexcept = default; stack_reference& operator=(stack_reference&&) noexcept = default;
stack_reference(const stack_reference&) noexcept = default; stack_reference(const stack_reference&) noexcept = default;

View File

@ -174,6 +174,12 @@ namespace sol {
operator int() const { return index; } operator int() const { return index; }
}; };
struct raw_index {
int index;
raw_index(int i) : index(i) {}
operator int() const { return index; }
};
struct absolute_index { struct absolute_index {
int index; int index;
absolute_index(lua_State* L, int idx) : index(lua_absindex(L, idx)) {} absolute_index(lua_State* L, int idx) : index(lua_absindex(L, idx)) {}

View File

@ -86,6 +86,17 @@ struct fer {
} }
}; };
TEST_CASE("functions/tuple-returns", "Make sure tuple returns are ordered properly") {
sol::state lua;
lua.script("function f() return '3', 4 end");
std::tuple<std::string, int> result = lua["f"]();
auto s = std::get<0>(result);
auto v = std::get<1>(result);
REQUIRE(s == "3");
REQUIRE(v == 4);
}
TEST_CASE("functions/overload-resolution", "Check if overloaded function resolution templates compile/work") { TEST_CASE("functions/overload-resolution", "Check if overloaded function resolution templates compile/work") {
sol::state lua; sol::state lua;
lua.open_libraries(sol::lib::base); lua.open_libraries(sol::lib::base);