summaryrefslogtreecommitdiffstats
path: root/src/frontend/mame/luaengine_render.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/frontend/mame/luaengine_render.cpp')
-rw-r--r--src/frontend/mame/luaengine_render.cpp150
1 files changed, 10 insertions, 140 deletions
diff --git a/src/frontend/mame/luaengine_render.cpp b/src/frontend/mame/luaengine_render.cpp
index ca472dba675..b910a717561 100644
--- a/src/frontend/mame/luaengine_render.cpp
+++ b/src/frontend/mame/luaengine_render.cpp
@@ -21,6 +21,10 @@ namespace {
struct layout_file_views
{
layout_file_views(layout_file &f) : file(f) { }
+ layout_file::view_list &items() { return file.views(); }
+
+ static layout_view &unwrap(layout_file::view_list::iterator const &it) { return *it; }
+ static int push_key(lua_State *L, layout_file::view_list::iterator const &it, std::size_t ix) { return sol::stack::push_reference(L, it->unqualified_name()); }
layout_file &file;
};
@@ -29,6 +33,10 @@ struct layout_file_views
struct layout_view_items
{
layout_view_items(layout_view &v) : view(v) { }
+ layout_view::item_list &items() { return view.items(); }
+
+ static layout_view::item &unwrap(layout_view::item_list::iterator const &it) { return *it; }
+ static int push_key(lua_State *L, layout_view::item_list::iterator const &it, std::size_t ix) { return sol::stack::push(L, ix + 1); }
layout_view &view;
};
@@ -53,48 +61,9 @@ template <> struct is_container<render_target_view_names> : std::true_type { };
template <>
-struct usertype_container<layout_file_views> : lua_engine::immutable_collection_helper<layout_file_views, layout_file::view_list>
+struct usertype_container<layout_file_views> : lua_engine::immutable_sequence_helper<layout_file_views, layout_file::view_list>
{
-private:
- using view_list = layout_file::view_list;
-
- template <bool Indexed>
- static int next_pairs(lua_State *L)
- {
- indexed_iterator &i(stack::unqualified_get<user<indexed_iterator> >(L, 1));
- if (i.src.end() == i.it)
- return stack::push(L, lua_nil);
- int result;
- if constexpr (Indexed)
- result = stack::push(L, i.ix + 1);
- else
- result = stack::push_reference(L, i.it->unqualified_name());
- result += stack::push_reference(L, *i.it);
- ++i;
- return result;
- }
-
- template <bool Indexed>
- static int start_pairs(lua_State *L)
- {
- layout_file_views &self(get_self(L));
- stack::push(L, next_pairs<Indexed>);
- stack::push<user<indexed_iterator> >(L, self.file.views(), self.file.views().begin());
- stack::push(L, lua_nil);
- return 3;
- }
-
public:
- static int at(lua_State *L)
- {
- layout_file_views &self(get_self(L));
- std::ptrdiff_t const index(stack::unqualified_get<std::ptrdiff_t>(L, 2));
- if ((0 >= index) || (self.file.views().size() < index))
- return stack::push(L, lua_nil);
- else
- return stack::push_reference(L, *std::next(self.file.views().begin(), index - 1));
- }
-
static int get(lua_State *L)
{
layout_file_views &self(get_self(L));
@@ -113,72 +82,13 @@ public:
{
return get(L);
}
-
- static int index_of(lua_State *L)
- {
- layout_file_views &self(get_self(L));
- layout_view &view(stack::unqualified_get<layout_view>(L, 2));
- auto it(self.file.views().begin());
- std::ptrdiff_t ix(0);
- while ((self.file.views().end() != it) && (&view != &*it))
- {
- ++it;
- ++ix;
- }
- if (self.file.views().end() == it)
- return stack::push(L, lua_nil);
- else
- return stack::push(L, ix + 1);
- }
-
- static int size(lua_State *L)
- {
- layout_file_views &self(get_self(L));
- return stack::push(L, self.file.views().size());
- }
-
- static int empty(lua_State *L)
- {
- layout_file_views &self(get_self(L));
- return stack::push(L, self.file.views().empty());
- }
-
- static int next(lua_State *L) { return stack::push(L, next_pairs<false>); }
- static int pairs(lua_State *L) { return start_pairs<false>(L); }
- static int ipairs(lua_State *L) { return start_pairs<true>(L); }
};
template <>
-struct usertype_container<layout_view_items> : lua_engine::immutable_collection_helper<layout_view_items, layout_view::item_list>
+struct usertype_container<layout_view_items> : lua_engine::immutable_sequence_helper<layout_view_items, layout_view::item_list>
{
-private:
- using item_list = layout_view::item_list;
-
- static int next_pairs(lua_State *L)
- {
- indexed_iterator &i(stack::unqualified_get<user<indexed_iterator> >(L, 1));
- if (i.src.end() == i.it)
- return stack::push(L, lua_nil);
- int result;
- result = stack::push(L, i.ix + 1);
- result += stack::push_reference(L, *i.it);
- ++i.it;
- ++i.ix;
- return result;
- }
-
public:
- static int at(lua_State *L)
- {
- layout_view_items &self(get_self(L));
- std::ptrdiff_t const index(stack::unqualified_get<std::ptrdiff_t>(L, 2));
- if ((0 >= index) || (self.view.items().size() < index))
- return stack::push(L, lua_nil);
- else
- return stack::push_reference(L, *std::next(self.view.items().begin(), index - 1));
- }
-
static int get(lua_State *L)
{
layout_view_items &self(get_self(L));
@@ -195,50 +105,10 @@ public:
return get(L);
}
- static int index_of(lua_State *L)
- {
- layout_view_items &self(get_self(L));
- layout_view::item &item(stack::unqualified_get<layout_view::item>(L, 2));
- auto it(self.view.items().begin());
- std::ptrdiff_t ix(0);
- while ((self.view.items().end() != it) && (&item != &*it))
- {
- ++it;
- ++ix;
- }
- if (self.view.items().end() == it)
- return stack::push(L, lua_nil);
- else
- return stack::push(L, ix + 1);
- }
-
- static int size(lua_State *L)
- {
- layout_view_items &self(get_self(L));
- return stack::push(L, self.view.items().size());
- }
-
- static int empty(lua_State *L)
- {
- layout_view_items &self(get_self(L));
- return stack::push(L, self.view.items().empty());
- }
-
- static int next(lua_State *L) { return stack::push(L, next_pairs); }
-
static int pairs(lua_State *L)
{
return luaL_error(L, "sol: cannot call 'pairs' on type '%s': not iterable by ID", sol::detail::demangle<layout_view_items>().c_str());
}
-
- static int ipairs(lua_State *L)
- {
- layout_view_items &self(get_self(L));
- stack::push(L, next_pairs);
- stack::push<user<indexed_iterator> >(L, self.view.items(), self.view.items().begin());
- stack::push(L, lua_nil);
- return 3;
- }
};