18#ifndef NNGN_LUA_PUSH_H
19#define NNGN_LUA_PUSH_H
36 static int push(lua_State *L, std::optional<T> &&o) {
42template<
typename ...Ts>
44 static int push(lua_State *L, std::variant<Ts...> &&
v) {
79 static int push(lua_State *L,
bool b) {
80 lua_pushboolean(L, b);
86template<std::convertible_to<const
void> T>
87struct stack_push<
T*> {
88 static int push(lua_State *L,
T *p) {
90 lua_pushlightuserdata(L,
const_cast<void*
>(p));
101template<detail::
integer T>
102struct stack_push<
T> {
103 static int push(lua_State *L, lua_Integer
i) {
104 lua_pushinteger(L,
i);
114template<detail::number T>
115struct stack_push<
T> {
116 static int push(lua_State *L, lua_Number
n) {
117 lua_pushnumber(L,
n);
123template<scoped_enum T>
125struct stack_push<T> {
126 static int push(lua_State *L,
T t) {
134 static int push(lua_State *L,
const char *
s) {
135 lua_pushstring(L,
s);
143 static int push(lua_State *L, std::string_view
s) {
144 lua_pushlstring(L,
s.data(),
s.size());
152 static int push(lua_State *L,
const std::string &
s) {
161 static int push(lua_State *L, lua_CFunction
f) {
162 lua_pushcfunction(L,
f);
172requires(std::is_convertible_v<std::decay_t<T>, lua_CFunction>)
173struct stack_push<T> {
180template<stateless_lambda T>
181requires(!std::convertible_to<T, lua_CFunction>)
182struct stack_push<T> {
183 static int push(lua_State *L,
const T&) {
184 constexpr auto *
f = +
T{};
191template<
typename R,
typename T>
193 *
static_cast<T*
>(lua_newuserdatauv(L,
sizeof(
f), 0)) =
f;
194 lua_pushcclosure(L, [](lua_State *L_) {
195 constexpr auto i = lua_upvalueindex(1);
196 auto f_ = *
static_cast<T*
>(lua_touserdata(L_,
i));
197 if constexpr(!std::is_void_v<R>)
212template<
typename R,
typename ...Args>
214 static int push(lua_State *L, R(*
f)(Args...)) {
220template<
typename R,
typename T,
typename ...Args>
222 static int push(lua_State *L, R(
T::*
f)(Args...)) {
228template<
typename R,
typename T,
typename ...Args>
236template<detail::stack_type T>
237struct stack_push<
T> {
238 static int push([[maybe_unused]] lua_State *L,
const T &t) {
253 static int push(lua_State *L,
T t) {
264 static int push(lua_State *L,
T *t) {
275 static int push(lua_State *L,
T &t) {
284template<
typename ...Ts>
288 requires(std::same_as<std::decay_t<T>, std::tuple<Ts...>>)
289 static int push(lua_State *L,
T &&t) {
290 constexpr auto n =
sizeof...(Ts);
291 return [L, &t]<std::size_t ...Is>(std::index_sequence<Is...>) {
293 }(std::make_index_sequence<n>{});
302template<member_po
inter auto p>
304 assert(lua_gettop(L) || !
"called without an object");
305 return [L]<
typename T,
typename M>(M
T::*) {
311template<member_po
inter auto p>
313 assert(lua_gettop(L) || !
"called without an object");
314 return [L]<
typename T,
typename M>(M
T::*) {
local class const
Definition animation.lua:7
Data block allocated for user data objects.
Definition user.h:73
static int push(state_view lua, R &&r)
Pushes a value on the stack as a user data of type T.
assert
Definition debug.lua:3
for i
Definition font.lua:5
local n
Definition dump_lights.lua:5
int push_fn_wrapper(lua_State *L, T f)
Definition push.h:192
constexpr bool can_push
Whether this library knows how to push a T value onto the stack.
Definition lua.h:189
Definition lua_audio.cpp:19
int value_accessor(lua_State *L)
Similar to nngn::lua::accessor, but returns the member by value.
Definition push.h:312
int accessor(lua_State *L)
Lua function template which pushes an object's member.
Definition push.h:303
R call(lua_State *L, R(*f)(Args...), int i)
Calls the regular function f with arguments taken from the stack.
Definition function.h:125
constexpr auto to_underlying(T t)
Definition utils.h:138
v[1]
Definition math.lua:22
#define FWD(...)
Definition utils.h:18
"Pushing" this value causes lua_error to be called.
Definition lua.h:87
Used to push nil values onto the stack.
Definition lua.h:84
static int push(lua_State *L, R(T::*f)(Args...) const)
Definition push.h:230
static int push(lua_State *L, R(T::*f)(Args...))
Definition push.h:222
static int push(lua_State *L, R(*f)(Args...))
Definition push.h:214
static int push(lua_State *L, lua_Integer i)
Definition push.h:103
static int push(lua_State *L, T f)
Definition push.h:174
static int push(lua_State *L, const T &)
Definition push.h:183
static int push(lua_State *L, T t)
Definition push.h:126
static int push(lua_State *L, const T &t)
Definition push.h:238
static int push(lua_State *L, lua_Number n)
Definition push.h:116
static int push(lua_State *L, T *p)
Definition push.h:88
static int push(lua_State *L, T *t)
Definition push.h:264
static int push(lua_State *L, T &t)
Definition push.h:275
static int push(lua_State *L, bool b)
Definition push.h:79
static int push(lua_State *L, const char *s)
Definition push.h:134
static int push(lua_State *L, error< T > &&e)
Definition push.h:61
static int push(lua_State *L, const error< T > &e)
Definition push.h:58
static int push(lua_State *L, lua_CFunction f)
Definition push.h:161
static int push(lua_State *L, nil_type)
Definition push.h:70
static int push(lua_State *L, std::optional< T > &&o)
Definition push.h:36
static int push(lua_State *L, const std::string &s)
Definition push.h:152
static int push(lua_State *L, std::string_view s)
Definition push.h:143
static int push(lua_State *L, T &&t)
Definition push.h:289
static int push(lua_State *L, std::variant< Ts... > &&v)
Definition push.h:44
Pushes a value onto the Lua stack.
Definition lua.h:120
local e
Definition math.lua:4
std::chrono::seconds s
Definition timing.cpp:6
Operations on light/full user data values.