Skip to content

Commit d7b037d

Browse files
committed
Sigh. Make sure that tuple expansion works in buggy VC++ compiler.
1 parent 63093ec commit d7b037d

File tree

5 files changed

+59
-12
lines changed

5 files changed

+59
-12
lines changed

single/sol/sol.hpp

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@
2020
// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2121

2222
// This file was generated with a script.
23-
// Generated 2016-09-22 16:13:14.308519 UTC
24-
// This header was generated with sol v2.14.2 (revision dc000fb)
23+
// Generated 2016-09-26 08:01:11.472268 UTC
24+
// This header was generated with sol v2.14.2 (revision 63093ec)
2525
// https://github.com/ThePhD/sol2
2626

2727
#ifndef SOL_SINGLE_INCLUDE_HPP
@@ -3005,6 +3005,12 @@ namespace sol {
30053005
operator int() const { return index; }
30063006
};
30073007

3008+
struct raw_index {
3009+
int index;
3010+
raw_index(int i) : index(i) {}
3011+
operator int() const { return index; }
3012+
};
3013+
30083014
struct absolute_index {
30093015
int index;
30103016
absolute_index(lua_State* L, int idx) : index(lua_absindex(L, idx)) {}
@@ -3581,6 +3587,8 @@ namespace sol {
35813587
stack_reference() noexcept = default;
35823588
stack_reference(nil_t) noexcept : stack_reference() {};
35833589
stack_reference(lua_State* L, int i) noexcept : L(L), index(lua_absindex(L, i)) {}
3590+
stack_reference(lua_State* L, absolute_index i) noexcept : L(L), index(i) {}
3591+
stack_reference(lua_State* L, raw_index i) noexcept : L(L), index(i) {}
35843592
stack_reference(stack_reference&& o) noexcept = default;
35853593
stack_reference& operator=(stack_reference&&) noexcept = default;
35863594
stack_reference(const stack_reference&) noexcept = default;
@@ -5354,12 +5362,22 @@ namespace sol {
53545362

53555363
template<typename... Args>
53565364
struct getter<std::tuple<Args...>> {
5357-
template <std::size_t... I>
5358-
static decltype(auto) apply(std::index_sequence<I...>, lua_State* L, int index, record& tracking) {
5359-
return std::tuple<decltype(stack::get<Args>(L, index))...>{stack::get<Args>(L, index + tracking.used, tracking)...};
5365+
typedef std::tuple<decltype(stack::get<Args>(nullptr, 0))...> R;
5366+
5367+
template <typename... TArgs>
5368+
static R apply(std::index_sequence<>, lua_State*, int, record&, TArgs&&... args) {
5369+
// Fuck you too, VC++
5370+
return R{std::forward<TArgs>(args)...};
5371+
}
5372+
5373+
template <std::size_t I, std::size_t... Ix, typename... TArgs>
5374+
static R apply(std::index_sequence<I, Ix...>, lua_State* L, int index, record& tracking, TArgs&&... args) {
5375+
// Fuck you too, VC++
5376+
typedef std::tuple_element_t<I, std::tuple<Args...>> T;
5377+
return apply(std::index_sequence<Ix...>(), L, index, tracking, std::forward<TArgs>(args)..., stack::get<T>(L, index + tracking.used, tracking));
53605378
}
53615379

5362-
static decltype(auto) get(lua_State* L, int index, record& tracking) {
5380+
static R get(lua_State* L, int index, record& tracking) {
53635381
return apply(std::make_index_sequence<sizeof...(Args)>(), L, index, tracking);
53645382
}
53655383
};

sol/stack_get.hpp

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -504,12 +504,22 @@ namespace sol {
504504

505505
template<typename... Args>
506506
struct getter<std::tuple<Args...>> {
507-
template <std::size_t... I>
508-
static decltype(auto) apply(std::index_sequence<I...>, lua_State* L, int index, record& tracking) {
509-
return std::tuple<decltype(stack::get<Args>(L, index))...>{stack::get<Args>(L, index + tracking.used, tracking)...};
510-
}
511-
512-
static decltype(auto) get(lua_State* L, int index, record& tracking) {
507+
typedef std::tuple<decltype(stack::get<Args>(nullptr, 0))...> R;
508+
509+
template <typename... TArgs>
510+
static R apply(std::index_sequence<>, lua_State*, int, record&, TArgs&&... args) {
511+
// Fuck you too, VC++
512+
return R{std::forward<TArgs>(args)...};
513+
}
514+
515+
template <std::size_t I, std::size_t... Ix, typename... TArgs>
516+
static R apply(std::index_sequence<I, Ix...>, lua_State* L, int index, record& tracking, TArgs&&... args) {
517+
// Fuck you too, VC++
518+
typedef std::tuple_element_t<I, std::tuple<Args...>> T;
519+
return apply(std::index_sequence<Ix...>(), L, index, tracking, std::forward<TArgs>(args)..., stack::get<T>(L, index + tracking.used, tracking));
520+
}
521+
522+
static R get(lua_State* L, int index, record& tracking) {
513523
return apply(std::make_index_sequence<sizeof...(Args)>(), L, index, tracking);
514524
}
515525
};

sol/stack_reference.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ namespace sol {
3737
stack_reference() noexcept = default;
3838
stack_reference(nil_t) noexcept : stack_reference() {};
3939
stack_reference(lua_State* L, int i) noexcept : L(L), index(lua_absindex(L, i)) {}
40+
stack_reference(lua_State* L, absolute_index i) noexcept : L(L), index(i) {}
41+
stack_reference(lua_State* L, raw_index i) noexcept : L(L), index(i) {}
4042
stack_reference(stack_reference&& o) noexcept = default;
4143
stack_reference& operator=(stack_reference&&) noexcept = default;
4244
stack_reference(const stack_reference&) noexcept = default;

sol/types.hpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,12 @@ namespace sol {
174174
operator int() const { return index; }
175175
};
176176

177+
struct raw_index {
178+
int index;
179+
raw_index(int i) : index(i) {}
180+
operator int() const { return index; }
181+
};
182+
177183
struct absolute_index {
178184
int index;
179185
absolute_index(lua_State* L, int idx) : index(lua_absindex(L, idx)) {}

test_functions.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,17 @@ struct fer {
8686
}
8787
};
8888

89+
TEST_CASE("functions/tuple-returns", "Make sure tuple returns are ordered properly") {
90+
sol::state lua;
91+
lua.script("function f() return '3', 4 end");
92+
93+
std::tuple<std::string, int> result = lua["f"]();
94+
auto s = std::get<0>(result);
95+
auto v = std::get<1>(result);
96+
REQUIRE(s == "3");
97+
REQUIRE(v == 4);
98+
}
99+
89100
TEST_CASE("functions/overload-resolution", "Check if overloaded function resolution templates compile/work") {
90101
sol::state lua;
91102
lua.open_libraries(sol::lib::base);

0 commit comments

Comments
 (0)