26 #include <string_view>
27 #include <type_traits>
33 template<
typename T,
typename T2 =
void>
38 typename std::decay_t<T>::value_type,
39 typename std::decay_t<T>::iterator,
40 typename std::decay_t<T>::size_type,
41 typename std::decay_t<T>::reference>
42 > : std::true_type {};
44 template<
typename T,
typename T2 =
void>
49 typename std::decay_t<T>::key_type,
50 typename std::decay_t<T>::mapped_type>
51 > : std::true_type {};
53 template<
typename T,
typename T2 =
void>
58 typename std::decay_t<T>::first_type,
59 typename std::decay_t<T>::second_type>
60 > : std::true_type {};
63 std::enable_if_t<std::is_same_v<T, lua_index_raw>,
lua_index_raw>
70 std::enable_if_t<std::is_same_v<T, lua_index_raw>,
lua_index_raw>
79 std::enable_if_t<std::is_same_v<T, std::string>, std::string>
82 return luaL_checkstring(L,
n);
85 std::enable_if_t<std::is_same_v<T, std::string>, std::string>
88 return luaL_optstring(L,
n, def.c_str());
91 std::enable_if_t<std::is_same_v<T, std::string>,
void>
94 lua_pushlstring(L, val.c_str(), val.size());
99 std::enable_if_t<std::is_same_v<T, std::string_view>, std::string_view>
105 std::enable_if_t<std::is_same_v<T, std::string_view>, std::string_view>
111 std::enable_if_t<std::is_same_v<T, std::string_view>,
void>
114 lua_pushlstring(L, val.data(), val.size());
119 std::enable_if_t<std::is_same_v<T, config>,
config>
125 std::enable_if_t<std::is_same_v<T, config>,
config>
132 std::enable_if_t<std::is_same_v<T, config>,
void>
140 std::enable_if_t<std::is_same_v<T, map_location>,
map_location>
146 std::enable_if_t<std::is_same_v<T, map_location>,
map_location>
156 std::enable_if_t<std::is_same_v<T, map_location>,
void>
164 std::enable_if_t<std::is_same_v<T, t_string>,
t_string>
170 std::enable_if_t<std::is_same_v<T, t_string>,
void>
179 std::enable_if_t<std::is_same_v<T, gui2::widget>,
void>
187 std::enable_if_t<std::is_same_v<T, bool>,
bool>
193 std::enable_if_t<std::is_same_v<T, bool>,
bool>
199 std::enable_if_t<std::is_same_v<T, bool>,
void>
202 lua_pushboolean(L, val);
207 std::enable_if_t<std::is_floating_point_v<T>, T>
210 return luaL_checknumber(L,
n);
213 std::enable_if_t<std::is_floating_point_v<T>, T>
217 lua_Number
d = lua_tonumberx(L,
n, &isnum);
224 std::enable_if_t<std::is_floating_point_v<T>,
void>
227 lua_pushnumber(L, val);
232 std::enable_if_t<std::is_integral_v<T> && !std::is_same_v<T, bool>, T>
235 return luaL_checkinteger(L,
n);
238 std::enable_if_t<std::is_integral_v<T> && !std::is_same_v<T, bool>, T>
242 lua_Integer res = lua_tointegerx(L,
n, &isnum);
250 std::enable_if_t<std::is_integral_v<T> && !std::is_same_v<T, bool>,
void>
253 lua_pushinteger(L, val);
259 std::enable_if_t<is_pair<T>::value && !std::is_const_v<typename T::first_type>, T>
263 if (lua_istable(L,
n)) {
264 lua_rawgeti(L,
n, 1);
265 result.first = lua_check<const typename T::first_type&>(L, -1);
266 lua_rawgeti(L,
n, 2);
267 result.second = lua_check<const typename T::second_type&>(L, -1);
273 std::enable_if_t<is_pair<T>::value && !std::is_const_v<typename T::first_type>,
void>
277 lua_push<const typename T::first_type&>(L, val.first);
278 lua_rawseti(L, -2, 1);
279 lua_push<const typename T::second_type&>(L, val.second);
280 lua_rawseti(L, -2, 2);
285 std::enable_if_t<is_container<T>::value && !std::is_same_v<T, std::string> && !std::is_same_v<T, std::string_view>, T>
288 if (lua_istable(L,
n))
291 for (
int i = 1, i_end = lua_rawlen(L,
n);
i <= i_end; ++
i)
293 lua_rawgeti(L,
n,
i);
301 luaL_argerror(L,
n,
"Table expected");
302 throw "luaL_argerror returned";
309 is_container<T>::value && !std::is_same_v<T, std::string> && !std::is_same_v<T, std::string_view> && !is_map<T>::value
315 assert(list.size() >= 0);
316 lua_createtable(L, list.size(), 0);
318 for(
typename T::const_iterator iter = list.begin(); iter != list.end(); ++iter) {
319 lua_check_impl::lua_push<std::decay_t<typename T::reference>>(L, *iter);
320 lua_rawseti(L, -2,
i++);
326 std::enable_if_t<is_map<T>::value,
void>
330 for(
const typename T::value_type& pair : map)
332 lua_check_impl::lua_push<std::decay_t<typename T::key_type>>(L, pair.first);
333 lua_check_impl::lua_push<std::decay_t<typename T::mapped_type>>(L, pair.second);
343 std::string str = lua_check_impl::lua_check<std::string>(L,
n);
344 std::optional<typename T::type> val = T::get_enum(str);
346 luaL_argerror(L,
n, (
"cannot convert " + str +
" to enum.").c_str());
355 return lua_check_impl::lua_check<T>(L,
n);
362 return lua_check_impl::lua_check<std::decay_t<T>>(L,
n);
369 return lua_check_impl::lua_to_or_default<std::decay_t<T>>(L,
n, def);
375 return lua_check_impl::lua_push<std::decay_t<T>>(L, val);
385 if(!lua_istable(L,
index)) {
386 luaL_argerror(L,
index,
"table expected");
392 lua_pushlstring(L, k.data(), k.size());
393 lua_gettable(L,
index);
394 if(lua_isnoneornil(L, -1)) {
398 T res = lua_check_impl::lua_to_or_default<std::decay_t<T>>(L, -1, def);
407 if(!lua_istable(L,
index)) {
408 luaL_argerror(L,
index,
"table expected");
412 lua_pushlstring(L, k.data(), k.size());
414 lua_settable(L,
index);
A config object defines a single node in a WML file, with access to child nodes.
void luaW_pushconfig(lua_State *L, const config &cfg)
Converts a config object to a Lua table pushed at the top of the stack.
config luaW_checkconfig(lua_State *L, int index)
Converts an optional table or vconfig to a config object.
void luaW_pushlocation(lua_State *L, const map_location &ml)
Converts a map location object to a Lua table pushed at the top of the stack.
void luaW_pushtstring(lua_State *L, const t_string &v)
Pushes a t_string on the top of the stack.
bool luaW_toboolean(lua_State *L, int n)
std::string_view luaW_tostring(lua_State *L, int index)
std::string_view luaW_tostring_or_default(lua_State *L, int index, std::string_view def)
bool luaW_toconfig(lua_State *L, int index, config &cfg)
Converts an optional table or vconfig to a config object.
bool luaW_tolocation(lua_State *L, int index, map_location &loc)
Converts an optional table or pair of integers to a map location object.
map_location luaW_checklocation(lua_State *L, int index)
Converts an optional table or pair of integers to a map location object.
t_string luaW_checktstring(lua_State *L, int index)
Converts a scalar to a translatable string.
std::enable_if_t< std::is_same_v< T, lua_index_raw >, lua_index_raw > lua_check(lua_State *L, int n)
std::enable_if_t< std::is_same_v< T, std::string >, void > lua_push(lua_State *L, const T &val)
std::enable_if_t< std::is_same_v< T, lua_index_raw >, lua_index_raw > lua_to_or_default(lua_State *L, int n, const T &)
std::size_t index(const std::string &str, const std::size_t index)
Codepoint index corresponding to the nth character in a UTF-8 string.
std::decay_t< T > lua_to_or_default(lua_State *L, int n, const T &def)
std::decay_t< T > lua_check(lua_State *L, int n)
void lua_push(lua_State *L, const T &val)
T::type lua_enum_check(lua_State *L, int n)
std::decay_t< T > luaW_table_get_def(lua_State *L, int index, std::string_view k, const T &def)
returns t[k] where k is the table at index index and k is k or def if it is not convertible to the co...
void luaW_table_set(lua_State *L, int index, std::string_view k, const T &value)
Encapsulates the map of the game.
static map_location::DIRECTION n