summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/netlist/plib/pstate.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/netlist/plib/pstate.h')
-rw-r--r--src/lib/netlist/plib/pstate.h43
1 files changed, 41 insertions, 2 deletions
diff --git a/src/lib/netlist/plib/pstate.h b/src/lib/netlist/plib/pstate.h
index 5f93c539ba0..59e7d5006f1 100644
--- a/src/lib/netlist/plib/pstate.h
+++ b/src/lib/netlist/plib/pstate.h
@@ -97,10 +97,29 @@ public:
state_manager_t() = default;
+ struct saver_t
+ {
+ saver_t(state_manager_t &sm, const void *owner, const pstring &membername)
+ : m_sm(sm)
+ , m_owner(owner)
+ , m_membername(membername)
+ { }
+
+ template <typename XS>
+ void save_item(XS &xstate, const pstring &itemname)
+ {
+ m_sm.save_item(m_owner, xstate, m_membername + "." + itemname);
+ }
+
+ state_manager_t &m_sm;
+ const void * m_owner;
+ const pstring m_membername;
+ };
+
template<typename C>
void save_item(const void *owner, C &state, const pstring &stname)
{
- save_state_ptr( owner, stname, dtype<C>(), 1, &state);
+ save_item_dispatch(owner, state, stname);
}
template<typename C, std::size_t N>
@@ -173,12 +192,32 @@ public:
protected:
private:
+
+ template<typename C>
+ typename std::enable_if<plib::is_integral<C>::value || std::is_enum<C>::value
+ || plib::is_floating_point<C>::value>::type
+ save_item_dispatch(const void *owner, C &state, const pstring &stname)
+ {
+ save_state_ptr( owner, stname, dtype<C>(), 1, &state);
+ }
+
+
+ template<typename C>
+ typename std::enable_if<!(plib::is_integral<C>::value || std::is_enum<C>::value
+ || plib::is_floating_point<C>::value)>::type
+ save_item_dispatch(const void *owner, C &state, const pstring &stname)
+ {
+ saver_t sav(*this, owner, stname);
+ state.save_state(sav);
+ }
+
entry_t::list_t m_save;
entry_t::list_t m_custom;
};
-template<> inline void state_manager_t::save_item(const void *owner, callback_t &state, const pstring &stname)
+template<>
+inline void state_manager_t::save_item(const void *owner, callback_t &state, const pstring &stname)
{
m_custom.emplace_back(stname, owner, &state);
state.register_state(*this, stname);