Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit ecabcfb

Browse files
authored
Fix a few new parser issues (#1914)
* Rearrange function order in a way that primitive functions (that dont call Push) are defined first * Add forward decls * Fix issue where T* results in a bool * Remove && from everywhere, since moving isn't neccessary at all(Because we can't transfer the ownership of strings (or anything else) to Lua)
1 parent 32d68e0 commit ecabcfb

File tree

1 file changed

+62
-49
lines changed

1 file changed

+62
-49
lines changed

‎Shared/mods/deathmatch/logic/lua/LuaBasic.h‎

Lines changed: 62 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -87,21 +87,6 @@ namespace lua
8787
return 1;
8888
}
8989

90-
template <typename... Ts>
91-
int Push(lua_State* L, const std::variant<Ts...>&& val)
92-
{
93-
return std::visit([L](auto&& value) -> int { return Push(L, std::move(value)); }, val);
94-
}
95-
96-
template <typename T>
97-
int Push(lua_State* L, const std::optional<T>&& val)
98-
{
99-
if (val.has_value())
100-
return Push(L, val.value());
101-
else
102-
return Push(L, nullptr);
103-
}
104-
10590
inline int Push(lua_State* L, const CVector2D& value)
10691
{
10792
lua_pushvector(L, value);
@@ -126,6 +111,63 @@ namespace lua
126111
return 1;
127112
}
128113

114+
// Overload for enum types only
115+
template <typename T>
116+
typename std::enable_if_t<std::is_enum_v<T>, int> Push(lua_State* L, const T& val)
117+
{
118+
// Push<string> must be defined before this function, otherwise it wont compile
119+
return Push(L, EnumToString(val));
120+
}
121+
122+
// Overload for pointers to classes. We boldly assume that these are script entities
123+
template <typename T>
124+
std::enable_if_t<std::is_class_v<T>, int> Push(lua_State* L, T* val)
125+
{
126+
lua_pushelement(L, val);
127+
return 1;
128+
}
129+
130+
/*****************************************************************\
131+
* The functions below may depend on each other, so they need to be
132+
* forward declared.
133+
* Please define functions that call `Push` after this line.
134+
\*****************************************************************/
135+
136+
template <typename... Ts>
137+
int Push(lua_State* L, const std::variant<Ts...>& val);
138+
139+
template <typename T>
140+
int Push(lua_State* L, const std::optional<T>& val);
141+
142+
template <typename T, size_t N>
143+
int Push(lua_State* L, const std::array<T, N>& val);
144+
145+
template <typename T>
146+
int Push(lua_State* L, const std::vector<T>& val);
147+
148+
template <typename K, typename V>
149+
int Push(lua_State* L, const std::unordered_map<K, V>& val);
150+
151+
template<typename... Ts>
152+
int Push(lua_State* L, const std::tuple<Ts...>& tuple);
153+
154+
// Define after this line, declare above.
155+
156+
template <typename... Ts>
157+
int Push(lua_State* L, const std::variant<Ts...>& val)
158+
{
159+
return std::visit([L](const auto& value) -> int { return Push(L, value); }, val);
160+
}
161+
162+
template <typename T>
163+
int Push(lua_State* L, const std::optional<T>& val)
164+
{
165+
if (val.has_value())
166+
return Push(L, val.value());
167+
else
168+
return Push(L, nullptr);
169+
}
170+
129171
template <typename T, size_t N>
130172
int Push(lua_State* L, const std::array<T, N>& val)
131173
{
@@ -142,11 +184,11 @@ namespace lua
142184
}
143185

144186
template <typename T>
145-
int Push(lua_State* L, const std::vector<T>&& val)
187+
int Push(lua_State* L, const std::vector<T>& val)
146188
{
147189
lua_newtable(L);
148190
int i = 1;
149-
for (auto&& v : val)
191+
for (constauto& v : val)
150192
{
151193
Push(L, i++);
152194
Push(L, v);
@@ -158,10 +200,10 @@ namespace lua
158200
}
159201

160202
template <typename K, typename V>
161-
int Push(lua_State* L, const std::unordered_map<K, V>&& val)
203+
int Push(lua_State* L, const std::unordered_map<K, V>& val)
162204
{
163205
lua_newtable(L);
164-
for (auto&& [k, v] : val)
206+
for (constauto& [k, v] : val)
165207
{
166208
Push(L, k);
167209
Push(L, v);
@@ -174,39 +216,10 @@ namespace lua
174216

175217
// Tuples can be used to return multiple results
176218
template<typename... Ts>
177-
int Push(lua_State* L, const std::tuple<Ts...>&& tuple)
219+
int Push(lua_State* L, const std::tuple<Ts...>& tuple)
178220
{
179221
// Call Push on each element of the tuple
180222
std::apply([L](const auto&... value) { (Push(L, value), ...); }, tuple);
181223
return sizeof...(Ts);
182224
}
183-
184-
// Overload for enum types only
185-
template <typename T>
186-
typename std::enable_if_t<std::is_enum_v<T>, int> Push(lua_State* L, const T&& val)
187-
{
188-
return Push(L, EnumToString(val));
189-
}
190-
191-
// Overload for pointers to classes. We boldly assume that these are script entities
192-
template <typename T>
193-
typename std::enable_if_t<(std::is_pointer_v<T> && std::is_class_v<std::remove_pointer_t<T>>), int> Push(lua_State* L, const T&& val)
194-
{
195-
lua_pushelement(L, val);
196-
return 1;
197-
}
198-
199-
template <typename T>
200-
int Push(lua_State* L, const std::shared_ptr<T>& ptr)
201-
{
202-
lua_pushelement(L, ptr.get());
203-
return 1;
204-
}
205-
206-
template <typename T>
207-
int Push(lua_State* L, const std::unique_ptr<T>& ptr)
208-
{
209-
lua_pushelement(L, ptr.get());
210-
return 1;
211-
}
212225
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /