Pioneer
LuaEvent.h
Go to the documentation of this file.
1 // Copyright © 2008-2023 Pioneer Developers. See AUTHORS.txt for details
2 // Licensed under the terms of the GPL v3. See licenses/GPL-3.txt
3 
4 #ifndef _LUAEVENT_H
5 #define _LUAEVENT_H
6 
7 #include "DeleteEmitter.h"
8 #include "Lua.h"
9 #include "LuaObject.h"
10 #include "LuaPushPull.h"
11 #include "Pi.h"
12 
13 namespace LuaEvent {
14 
15  class ArgsBase {
16  public:
17  virtual ~ArgsBase() {}
18 
19  virtual void PrepareStack(lua_State *l) const = 0;
20  };
21 
22  class EmptyArgs : public ArgsBase {
23  public:
24  inline void PrepareStack(lua_State *l) const {}
25  };
26 
27  template <typename...> class Args;
28 
29  template <typename T0, typename T1, typename T2>
30  class Args<T0, T1, T2> : public ArgsBase {
31  public:
32  Args(T0 _arg0, T1 _arg1, T2 _arg2) :
33  arg0(_arg0),
34  arg1(_arg1),
35  arg2(_arg2) {}
36  virtual ~Args() {}
37 
38  T0 arg0;
39  T1 arg1;
40  T2 arg2;
41 
42  inline void PrepareStack(lua_State *l) const
43  {
44  LuaPush<T0>(l, arg0);
45  LuaPush<T1>(l, arg1);
46  LuaPush<T2>(l, arg2);
47  }
48  };
49 
50  template <typename T0, typename T1>
51  class Args<T0, T1> : public ArgsBase {
52  public:
53  Args(T0 _arg0, T1 _arg1) :
54  arg0(_arg0),
55  arg1(_arg1) {}
56  virtual ~Args() {}
57 
58  T0 arg0;
59  T1 arg1;
60 
61  inline void PrepareStack(lua_State *l) const
62  {
63  LuaPush<T0>(l, arg0);
64  LuaPush<T1>(l, arg1);
65  }
66  };
67 
68  template <typename T0>
69  class Args<T0> : public ArgsBase {
70  public:
71  Args(T0 _arg0) :
72  arg0(_arg0) {}
73  virtual ~Args() {}
74 
75  T0 arg0;
76 
77  inline void PrepareStack(lua_State *l) const
78  {
79  LuaPush<T0>(l, arg0);
80  }
81  };
82 
83  void Clear();
84  void Emit();
85 
86  void QueueInternal(const char *event, const ArgsBase &args);
87 
88  template <typename... TArgs>
89  inline void Queue(const char *event, TArgs... args)
90  {
91  QueueInternal(event, Args<TArgs...>(args...));
92  }
93 
94  inline void Queue(const char *event)
95  {
96  QueueInternal(event, EmptyArgs());
97  }
98 } // namespace LuaEvent
99 
100 #endif
Definition: LuaEvent.h:15
virtual void PrepareStack(lua_State *l) const =0
virtual ~ArgsBase()
Definition: LuaEvent.h:17
Definition: LuaEvent.h:30
Args(T0 _arg0, T1 _arg1, T2 _arg2)
Definition: LuaEvent.h:32
void PrepareStack(lua_State *l) const
Definition: LuaEvent.h:42
virtual ~Args()
Definition: LuaEvent.h:36
T1 arg1
Definition: LuaEvent.h:39
T2 arg2
Definition: LuaEvent.h:40
T0 arg0
Definition: LuaEvent.h:38
Definition: LuaEvent.h:51
Args(T0 _arg0, T1 _arg1)
Definition: LuaEvent.h:53
void PrepareStack(lua_State *l) const
Definition: LuaEvent.h:61
T1 arg1
Definition: LuaEvent.h:59
T0 arg0
Definition: LuaEvent.h:58
virtual ~Args()
Definition: LuaEvent.h:56
Definition: LuaEvent.h:69
T0 arg0
Definition: LuaEvent.h:75
Args(T0 _arg0)
Definition: LuaEvent.h:71
void PrepareStack(lua_State *l) const
Definition: LuaEvent.h:77
virtual ~Args()
Definition: LuaEvent.h:73
Definition: LuaEvent.h:27
Definition: LuaEvent.h:22
void PrepareStack(lua_State *l) const
Definition: LuaEvent.h:24
Definition: LuaEvent.cpp:10
void Emit()
Definition: LuaEvent.cpp:46
void QueueInternal(const char *event, const ArgsBase &args)
Definition: LuaEvent.cpp:56
void Clear()
Definition: LuaEvent.cpp:36
void Queue(const char *event, TArgs... args)
Definition: LuaEvent.h:89