@@ -87,21 +87,6 @@ namespace lua
8787 return 1 ;
8888 }
8989
90- template <typename ... Ts>
91- int Push (lua_State* L, const std::variant<Ts...>&& val)
92- {
93- return std::visit ([L](auto && value) -> int { return Push (L, std::move (value)); }, val);
94- }
95- 96- template <typename T>
97- int Push (lua_State* L, const std::optional<T>&& val)
98- {
99- if (val.has_value ())
100- return Push (L, val.value ());
101- else
102- return Push (L, nullptr );
103- }
104- 10590 inline int Push (lua_State* L, const CVector2D& value)
10691 {
10792 lua_pushvector (L, value);
@@ -126,6 +111,63 @@ namespace lua
126111 return 1 ;
127112 }
128113
114+ // Overload for enum types only
115+ template <typename T>
116+ typename std::enable_if_t <std::is_enum_v<T>, int > Push (lua_State* L, const T& val)
117+ {
118+ // Push<string> must be defined before this function, otherwise it wont compile
119+ return Push (L, EnumToString (val));
120+ }
121+ 122+ // Overload for pointers to classes. We boldly assume that these are script entities
123+ template <typename T>
124+ std::enable_if_t <std::is_class_v<T>, int > Push (lua_State* L, T* val)
125+ {
126+ lua_pushelement (L, val);
127+ return 1 ;
128+ }
129+ 130+ /* ****************************************************************\
131+ * The functions below may depend on each other, so they need to be
132+ * forward declared.
133+ * Please define functions that call `Push` after this line.
134+ \*****************************************************************/
135+ 136+ template <typename ... Ts>
137+ int Push (lua_State* L, const std::variant<Ts...>& val);
138+ 139+ template <typename T>
140+ int Push (lua_State* L, const std::optional<T>& val);
141+ 142+ template <typename T, size_t N>
143+ int Push (lua_State* L, const std::array<T, N>& val);
144+ 145+ template <typename T>
146+ int Push (lua_State* L, const std::vector<T>& val);
147+ 148+ template <typename K, typename V>
149+ int Push (lua_State* L, const std::unordered_map<K, V>& val);
150+ 151+ template <typename ... Ts>
152+ int Push (lua_State* L, const std::tuple<Ts...>& tuple);
153+ 154+ // Define after this line, declare above.
155+ 156+ template <typename ... Ts>
157+ int Push (lua_State* L, const std::variant<Ts...>& val)
158+ {
159+ return std::visit ([L](const auto & value) -> int { return Push (L, value); }, val);
160+ }
161+ 162+ template <typename T>
163+ int Push (lua_State* L, const std::optional<T>& val)
164+ {
165+ if (val.has_value ())
166+ return Push (L, val.value ());
167+ else
168+ return Push (L, nullptr );
169+ }
170+ 129171 template <typename T, size_t N>
130172 int Push (lua_State* L, const std::array<T, N>& val)
131173 {
@@ -142,11 +184,11 @@ namespace lua
142184 }
143185
144186 template <typename T>
145- int Push (lua_State* L, const std::vector<T>&& val)
187+ int Push (lua_State* L, const std::vector<T>& val)
146188 {
147189 lua_newtable (L);
148190 int i = 1 ;
149- for (auto & & v : val)
191+ for (const auto & v : val)
150192 {
151193 Push (L, i++);
152194 Push (L, v);
@@ -158,10 +200,10 @@ namespace lua
158200 }
159201
160202 template <typename K, typename V>
161- int Push (lua_State* L, const std::unordered_map<K, V>&& val)
203+ int Push (lua_State* L, const std::unordered_map<K, V>& val)
162204 {
163205 lua_newtable (L);
164- for (auto & & [k, v] : val)
206+ for (const auto & [k, v] : val)
165207 {
166208 Push (L, k);
167209 Push (L, v);
@@ -174,39 +216,10 @@ namespace lua
174216
175217 // Tuples can be used to return multiple results
176218 template <typename ... Ts>
177- int Push (lua_State* L, const std::tuple<Ts...>&& tuple)
219+ int Push (lua_State* L, const std::tuple<Ts...>& tuple)
178220 {
179221 // Call Push on each element of the tuple
180222 std::apply ([L](const auto &... value) { (Push (L, value), ...); }, tuple);
181223 return sizeof ...(Ts);
182224 }
183- 184- // Overload for enum types only
185- template <typename T>
186- typename std::enable_if_t <std::is_enum_v<T>, int > Push (lua_State* L, const T&& val)
187- {
188- return Push (L, EnumToString (val));
189- }
190- 191- // Overload for pointers to classes. We boldly assume that these are script entities
192- template <typename T>
193- typename std::enable_if_t <(std::is_pointer_v<T> && std::is_class_v<std::remove_pointer_t <T>>), int > Push (lua_State* L, const T&& val)
194- {
195- lua_pushelement (L, val);
196- return 1 ;
197- }
198- 199- template <typename T>
200- int Push (lua_State* L, const std::shared_ptr<T>& ptr)
201- {
202- lua_pushelement (L, ptr.get ());
203- return 1 ;
204- }
205- 206- template <typename T>
207- int Push (lua_State* L, const std::unique_ptr<T>& ptr)
208- {
209- lua_pushelement (L, ptr.get ());
210- return 1 ;
211- }
212225}
0 commit comments