18#ifndef NNGN_LUA_PUSH_H
19#define NNGN_LUA_PUSH_H
26#include "utils/concepts/fundamental.h"
35struct stack_push<
std::optional<T>> {
36 static int push(lua_State *L, std::optional<T> &&o) {
42template<
typename ...Ts>
43struct stack_push<
std::variant<Ts...>> {
44 static int push(lua_State *L, std::variant<Ts...> &&
v) {
57struct stack_push<
error<
T>> {
69struct stack_push<nil_type> {
78struct stack_push<
bool> {
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>
124requires(detail::can_push<std::underlying_type_t<T>>)
125struct stack_push<T> {
126 static int push(lua_State *L,
T t) {
133struct stack_push<const char*> {
134 static int push(lua_State *L,
const char *
s) {
135 lua_pushstring(L,
s);
142struct stack_push<
std::string_view> {
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) {
160struct stack_push<lua_CFunction> {
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>)
198 return stack_push<>::push(L_,
call(L_, f_));
212template<
typename R,
typename ...Args>
213struct stack_push<R(*)(Args...)> {
214 static int push(lua_State *L, R(*
f)(Args...)) {
215 return detail::push_fn_wrapper<R>(L,
f);
220template<
typename R,
typename T,
typename ...Args>
221struct stack_push<R(
T::*)(Args...)> {
222 static int push(lua_State *L, R(
T::*
f)(Args...)) {
223 return detail::push_fn_wrapper<R>(L,
f);
228template<
typename R,
typename T,
typename ...Args>
229struct stack_push<R(
T::*)(Args...) const> {
230 static int push(lua_State *L, R(
T::*
f)(Args...)
const) {
231 return detail::push_fn_wrapper<R>(L,
f);
236template<detail::stack_type T>
237struct stack_push<
T> {
238 static int push([[maybe_unused]] lua_State *L,
const T &t) {
252struct stack_push<
T> {
253 static int push(lua_State *L,
T t) {
263struct stack_push<
T*> {
264 static int push(lua_State *L,
T *t) {
274struct stack_push<
T&> {
275 static int push(lua_State *L,
T &t) {
284template<
typename ...Ts>
285requires(... && detail::can_push<Ts>)
286struct stack_push<std::tuple<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::*) {
get_type get(void) const
Pointer to the contained/referenced object.
Definition: user.h:124
static int push(state_view lua, R &&r)
Pushes a value on the stack as a user data of type T.
for i
Definition: font.lua:5
assert
Definition: debug.lua:3
n
Definition: dump_lights.lua:5
v[1]
Definition: math.lua:19
error
Definition: strict.lua:2
std::chrono::seconds s
Definition: timing.cpp:6
#define FWD(...)
Definition: utils.h:18
int push_fn_wrapper(lua_State *L, T f)
Definition: push.h:192
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
Operations on light/full user data values.
"Pushing" this value causes lua_error to be called.
Definition: lua.h:86
Used to push nil values onto the stack.
Definition: lua.h:83
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:119