21 #include <type_traits> 22 #include <boost/mpl/not.hpp> 23 #include <boost/mpl/and.hpp> 24 #include <boost/mpl/has_xxx.hpp> 40 BOOST_MPL_HAS_XXX_TRAIT_DEF(value_type)
41 BOOST_MPL_HAS_XXX_TRAIT_DEF(
iterator)
42 BOOST_MPL_HAS_XXX_TRAIT_DEF(size_type)
43 BOOST_MPL_HAS_XXX_TRAIT_DEF(reference)
44 BOOST_MPL_HAS_XXX_TRAIT_DEF(key_type)
45 BOOST_MPL_HAS_XXX_TRAIT_DEF(mapped_type)
46 BOOST_MPL_HAS_XXX_TRAIT_DEF(first_type)
47 BOOST_MPL_HAS_XXX_TRAIT_DEF(second_type)
50 template<
typename T,
typename T2 = std::remove_reference_t<T>>
53 detail::has_value_type<T2>::value &&
54 detail::has_iterator<T2>::value &&
55 detail::has_size_type<T2>::value &&
56 detail::has_reference<T2>::value
60 template<
typename T,
typename T2 = std::remove_reference_t<T>>
63 detail::has_key_type<T2>::value &&
64 detail::has_mapped_type<T2>::value
68 template<
typename T,
typename T2 = std::remove_reference_t<T>>
71 detail::has_first_type<T2>::value &&
72 detail::has_second_type<T2>::value
77 using remove_constref = std::remove_const_t<std::remove_reference_t<std::remove_const_t<T>>>;
81 std::enable_if_t<std::is_same_v<T, lua_index_raw>,
lua_index_raw>
88 std::enable_if_t<std::is_same_v<T, lua_index_raw>,
lua_index_raw>
97 std::enable_if_t<std::is_same_v<T, std::string>, std::string>
103 std::enable_if_t<std::is_same_v<T, std::string>,
void>
123 std::enable_if_t<std::is_same_v<T, utils::string_view>,
void>
131 std::enable_if_t<std::is_same_v<T, config>,
config>
137 std::enable_if_t<std::is_same_v<T, config>,
void>
145 std::enable_if_t<std::is_same_v<T, map_location>,
map_location>
151 std::enable_if_t<std::is_same_v<T, map_location>,
map_location>
161 std::enable_if_t<std::is_same_v<T, map_location>,
void>
169 std::enable_if_t<std::is_base_of_v<enum_tag, T>, T>
173 std::string str = lua_check_impl::lua_check<std::string>(L,
n);
181 std::enable_if_t<std::is_base_of_v<enum_tag, T>, T>
193 std::enable_if_t<std::is_base_of_v<enum_tag, T>,
void>
201 std::enable_if_t<std::is_same_v<T, t_string>,
t_string>
207 std::enable_if_t<std::is_same_v<T, t_string>,
void>
216 std::enable_if_t<std::is_same_v<T, gui2::widget>,
void>
224 std::enable_if_t<std::is_same_v<T, bool>,
bool>
230 std::enable_if_t<std::is_same_v<T, bool>,
bool>
236 std::enable_if_t<std::is_same_v<T, bool>,
void>
244 std::enable_if_t<std::is_floating_point_v<T>, T>
250 std::enable_if_t<std::is_floating_point_v<T>, T>
261 std::enable_if_t<std::is_floating_point_v<T>,
void>
269 std::enable_if_t<std::is_integral_v<T> && !std::is_same_v<T, bool>, T>
275 std::enable_if_t<std::is_integral_v<T> && !std::is_same_v<T, bool>, T>
287 std::enable_if_t<std::is_integral_v<T> && !std::is_same_v<T, bool>,
void>
296 std::enable_if_t<is_pair<T>::value && !std::is_const_v<typename T::first_type>, T>
302 result.first = lua_check<const typename T::first_type&>(L, -1);
304 result.second = lua_check<const typename T::second_type&>(L, -1);
310 std::enable_if_t<is_pair<T>::value && !std::is_const_v<typename T::first_type>,
void>
314 lua_push<const typename T::first_type&>(L, val.first);
316 lua_push<const typename T::second_type&>(L, val.second);
322 std::enable_if_t<is_container<T>::value && !std::is_same_v<T, std::string> && !std::is_same_v<T, utils::string_view>, T>
339 throw "luaL_argerror returned";
343 #if defined(__GNUC__) && !defined(__clang__) 344 #if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 8 ) 346 #pragma GCC diagnostic ignored "-Wtype-limits" 359 assert(list.size() >= 0);
362 for(
typename T::const_iterator iter = list.begin(); iter != list.end(); ++iter) {
363 lua_check_impl::lua_push<remove_constref<typename T::reference>>(L, *iter);
371 std::enable_if_t<is_map<T>::value,
void>
375 for(
const typename T::value_type& pair : map)
377 lua_check_impl::lua_push<remove_constref<typename T::key_type>>(L, pair.first);
378 lua_check_impl::lua_push<remove_constref<typename T::mapped_type>>(L, pair.second);
389 return lua_check_impl::lua_check<lua_check_impl::remove_constref<T>>(L,
n);
396 return lua_check_impl::lua_to_or_default<lua_check_impl::remove_constref<T>>(L,
n, def);
402 return lua_check_impl::lua_push<lua_check_impl::remove_constref<T>>(L, val);
425 T res = lua_check_impl::lua_to_or_default<lua_check_impl::remove_constref<T>>(L, -1, def);
#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)
utils::string_view luaW_tostring(lua_State *L, int index)
lua_check_impl::remove_constref< T > lua_to_or_default(lua_State *L, int n, const T &def)
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)
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.
LUA_API const char * lua_pushlstring(lua_State *L, const char *s, size_t len)
LUA_API void lua_pushnumber(lua_State *L, lua_Number n)
Encapsulates the map of the game.
std::remove_const_t< std::remove_reference_t< std::remove_const_t< T > >> remove_constref
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_check_impl::remove_constref< T > lua_check(lua_State *L, int n)
lua_check_impl::remove_constref< T > luaW_table_get_def(lua_State *L, int index, utils::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 size_t lua_rawlen(lua_State *L, int idx)
void luaW_table_set(lua_State *L, int index, utils::string_view k, const T &value)
#define lua_istable(L, n)
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.
boost::string_view string_view
A config object defines a single node in a WML file, with access to child nodes.
static map_location::DIRECTION n
std::string::const_iterator iterator
utils::string_view luaW_tostring_or_default(lua_State *L, int index, utils::string_view def)
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)