26 #include <string_view> 27 #include <type_traits> 35 template<
typename T,
typename T2 =
void>
40 typename std::decay_t<T>::value_type,
41 typename std::decay_t<T>::iterator,
42 typename std::decay_t<T>::size_type,
43 typename std::decay_t<T>::reference>
44 > : std::true_type {};
46 template<
typename T,
typename T2 =
void>
51 typename std::decay_t<T>::key_type,
52 typename std::decay_t<T>::mapped_type>
53 > : std::true_type {};
55 template<
typename T,
typename T2 =
void>
60 typename std::decay_t<T>::first_type,
61 typename std::decay_t<T>::second_type>
62 > : std::true_type {};
65 std::enable_if_t<std::is_same_v<T, lua_index_raw>,
lua_index_raw>
72 std::enable_if_t<std::is_same_v<T, lua_index_raw>,
lua_index_raw>
81 std::enable_if_t<std::is_same_v<T, std::string>, std::string>
87 std::enable_if_t<std::is_same_v<T, std::string>,
void>
95 std::enable_if_t<std::is_same_v<T, std::string_view>, std::string_view>
101 std::enable_if_t<std::is_same_v<T, std::string_view>, std::string_view>
107 std::enable_if_t<std::is_same_v<T, std::string_view>,
void>
115 std::enable_if_t<std::is_same_v<T, config>,
config>
121 std::enable_if_t<std::is_same_v<T, config>,
void>
129 std::enable_if_t<std::is_same_v<T, map_location>,
map_location>
135 std::enable_if_t<std::is_same_v<T, map_location>,
map_location>
145 std::enable_if_t<std::is_same_v<T, map_location>,
void>
153 std::enable_if_t<std::is_base_of_v<enum_tag, T>, T>
157 std::string str = lua_check_impl::lua_check<std::string>(L,
n);
160 luaL_argerror(L, n, (
"cannot convert " + str +
" to enum " + T::name()).c_str());
165 std::enable_if_t<std::is_base_of_v<enum_tag, T>, T>
169 std::string_view str = lua_check_impl::lua_to_or_default<std::string_view>(L,
n, std::string_view());
177 std::enable_if_t<std::is_base_of_v<enum_tag, T>,
void>
185 std::enable_if_t<std::is_same_v<T, t_string>,
t_string>
191 std::enable_if_t<std::is_same_v<T, t_string>,
void>
200 std::enable_if_t<std::is_same_v<T, gui2::widget>,
void>
208 std::enable_if_t<std::is_same_v<T, bool>,
bool>
214 std::enable_if_t<std::is_same_v<T, bool>,
bool>
220 std::enable_if_t<std::is_same_v<T, bool>,
void>
228 std::enable_if_t<std::is_floating_point_v<T>, T>
234 std::enable_if_t<std::is_floating_point_v<T>, T>
245 std::enable_if_t<std::is_floating_point_v<T>,
void>
253 std::enable_if_t<std::is_integral_v<T> && !std::is_same_v<T, bool>, T>
259 std::enable_if_t<std::is_integral_v<T> && !std::is_same_v<T, bool>, T>
271 std::enable_if_t<std::is_integral_v<T> && !std::is_same_v<T, bool>,
void>
280 std::enable_if_t<is_pair<T>::value && !std::is_const_v<typename T::first_type>, T>
286 result.first = lua_check<const typename T::first_type&>(L, -1);
288 result.second = lua_check<const typename T::second_type&>(L, -1);
294 std::enable_if_t<is_pair<T>::value && !std::is_const_v<typename T::first_type>,
void>
298 lua_push<const typename T::first_type&>(L, val.first);
300 lua_push<const typename T::second_type&>(L, val.second);
306 std::enable_if_t<is_container<T>::value && !std::is_same_v<T, std::string> && !std::is_same_v<T, std::string_view>, T>
323 throw "luaL_argerror returned";
327 #if defined(__GNUC__) && !defined(__clang__) 328 #if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 8 ) 330 #pragma GCC diagnostic ignored "-Wtype-limits" 343 assert(list.size() >= 0);
346 for(
typename T::const_iterator iter = list.begin(); iter != list.end(); ++iter) {
347 lua_check_impl::lua_push<std::decay_t<typename T::reference>>(L, *iter);
355 std::enable_if_t<is_map<T>::value,
void>
359 for(
const typename T::value_type& pair : map)
361 lua_check_impl::lua_push<std::decay_t<typename T::key_type>>(L, pair.first);
362 lua_check_impl::lua_push<std::decay_t<typename T::mapped_type>>(L, pair.second);
373 return lua_check_impl::lua_check<std::decay_t<T>>(L,
n);
380 return lua_check_impl::lua_to_or_default<std::decay_t<T>>(L,
n, def);
386 return lua_check_impl::lua_push<std::decay_t<T>>(L, val);
409 T res = lua_check_impl::lua_to_or_default<std::decay_t<T>>(L, -1, def);
std::decay_t< T > lua_check(lua_State *L, int n)
#define lua_isnoneornil(L, n)
std::enable_if_t< std::is_same_v< T, std::string >, void > lua_push(lua_State *L, const T &val)
LUA_API void lua_createtable(lua_State *L, int narray, int nrec)
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...
LUA_API lua_Number lua_tonumberx(lua_State *L, int idx, int *pisnum)
LUALIB_API lua_Number luaL_checknumber(lua_State *L, int arg)
void luaW_pushconfig(lua_State *L, const config &cfg)
Converts a config object to a Lua table pushed at the top of the stack.
LUA_API void lua_pushboolean(lua_State *L, int b)
LUA_API int lua_rawgeti(lua_State *L, int idx, lua_Integer n)
std::string_view luaW_tostring_or_default(lua_State *L, int index, std::string_view def)
LUA_API void lua_rawseti(lua_State *L, int idx, lua_Integer n)
LUA_API int lua_gettable(lua_State *L, int idx)
LUA_API void lua_settable(lua_State *L, int idx)
void lua_push(lua_State *L, const T &val)
map_location luaW_checklocation(lua_State *L, int index)
Converts an optional table or pair of integers to a map location object.
LUA_API int lua_absindex(lua_State *L, int idx)
LUALIB_API int luaL_argerror(lua_State *L, int arg, const char *extramsg)
bool luaW_toboolean(lua_State *L, int n)
void luaW_pushtstring(lua_State *L, const t_string &v)
Pushes a t_string on the top of the stack.
t_string luaW_checktstring(lua_State *L, int index)
Converts a scalar to a translatable string.
void luaW_table_set(lua_State *L, int index, std::string_view k, const T &value)
LUA_API const char * lua_pushlstring(lua_State *L, const char *s, size_t len)
std::decay_t< T > lua_to_or_default(lua_State *L, int n, const T &def)
LUA_API void lua_pushnumber(lua_State *L, lua_Number n)
Encapsulates the map of the game.
std::enable_if_t< std::is_same_v< T, lua_index_raw >, lua_index_raw > lua_check(lua_State *L, int n)
LUA_API lua_Integer lua_tointegerx(lua_State *L, int idx, int *pisnum)
LUALIB_API lua_Integer luaL_checkinteger(lua_State *L, int arg)
config luaW_checkconfig(lua_State *L, int index)
Converts an optional table or vconfig to a config object.
LUA_API lua_Unsigned lua_rawlen(lua_State *L, int idx)
#define lua_istable(L, n)
std::string_view luaW_tostring(lua_State *L, int index)
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.
A config object defines a single node in a WML file, with access to child nodes.
static map_location::DIRECTION n
LUA_API void lua_pushinteger(lua_State *L, lua_Integer n)
bool luaW_tolocation(lua_State *L, int index, map_location &loc)
Converts an optional table or pair of integers to a map location object.
#define luaL_checkstring(L, n)