diff options
author | 2019-03-25 22:44:58 +0100 | |
---|---|---|
committer | 2019-03-25 22:44:58 +0100 | |
commit | c24473ddff715ecec2e258a6eb38960cf8c8e98e (patch) | |
tree | 8ea44b6396a6129913c0aac13859b5de9965e972 /src/lib/netlist/plib/pstate.h | |
parent | 009cba4fb8102102168ef32870892438327f3705 (diff) | |
parent | 598cd5227223c3b04ca31f0dbc1981256d9ea3ff (diff) |
conflict resolution (nw)
Diffstat (limited to 'src/lib/netlist/plib/pstate.h')
-rw-r--r-- | src/lib/netlist/plib/pstate.h | 67 |
1 files changed, 40 insertions, 27 deletions
diff --git a/src/lib/netlist/plib/pstate.h b/src/lib/netlist/plib/pstate.h index 9757d6408b7..ac75ca6b69e 100644 --- a/src/lib/netlist/plib/pstate.h +++ b/src/lib/netlist/plib/pstate.h @@ -8,11 +8,13 @@ #ifndef PSTATE_H_ #define PSTATE_H_ +#include "palloc.h" #include "pstring.h" #include "ptypes.h" -#include <vector> +#include <array> #include <memory> +#include <vector> // ---------------------------------------------------------------------------------------- // state saving ... @@ -38,32 +40,31 @@ public: const bool is_custom; }; - template<typename T> struct datatype_f + template<typename T> + static datatype_t dtype() { - static inline const datatype_t f() - { - return datatype_t(sizeof(T), - plib::is_integral<T>::value || std::is_enum<T>::value, - std::is_floating_point<T>::value); - } - }; + return datatype_t(sizeof(T), + plib::is_integral<T>::value || std::is_enum<T>::value, + std::is_floating_point<T>::value); + } class callback_t { public: using list_t = std::vector<callback_t *>; - virtual ~callback_t(); - virtual void register_state(state_manager_t &manager, const pstring &module) = 0; - virtual void on_pre_save() = 0; - virtual void on_post_load() = 0; + virtual void on_pre_save(state_manager_t &manager) = 0; + virtual void on_post_load(state_manager_t &manager) = 0; protected: + callback_t() = default; + ~callback_t() = default; + COPYASSIGNMOVE(callback_t, default) }; struct entry_t { - using list_t = std::vector<std::unique_ptr<entry_t>>; + using list_t = std::vector<plib::unique_ptr<entry_t>>; entry_t(const pstring &stname, const datatype_t &dt, const void *owner, const std::size_t count, void *ptr) @@ -72,8 +73,6 @@ public: entry_t(const pstring &stname, const void *owner, callback_t *callback) : m_name(stname), m_dt(datatype_t(true)), m_owner(owner), m_callback(callback), m_count(0), m_ptr(nullptr) { } - ~entry_t() { } - pstring m_name; const datatype_t m_dt; const void * m_owner; @@ -82,35 +81,49 @@ public: void * m_ptr; }; - state_manager_t(); - ~state_manager_t(); + state_manager_t() = default; - template<typename C> void save_item(const void *owner, C &state, const pstring &stname) + template<typename C> + void save_item(const void *owner, C &state, const pstring &stname) { - save_state_ptr( owner, stname, datatype_f<C>::f(), 1, &state); + save_state_ptr( owner, stname, dtype<C>(), 1, &state); } - template<typename C, std::size_t N> void save_item(const void *owner, C (&state)[N], const pstring &stname) + template<typename C, std::size_t N> + void save_item(const void *owner, C (&state)[N], const pstring &stname) // NOLINT(cppcoreguidelines-avoid-c-arrays, modernize-avoid-c-arrays) { - save_state_ptr(owner, stname, datatype_f<C>::f(), N, &(state[0])); + save_state_ptr(owner, stname, dtype<C>(), N, &(state[0])); } - template<typename C> void save_item(const void *owner, C *state, const pstring &stname, const std::size_t count) + template<typename C> + void save_item(const void *owner, C *state, const pstring &stname, const std::size_t count) { - save_state_ptr(owner, stname, datatype_f<C>::f(), count, state); + save_state_ptr(owner, stname, dtype<C>(), count, state); } template<typename C> void save_item(const void *owner, std::vector<C> &v, const pstring &stname) { - save_state(v.data(), owner, stname, v.size()); + save_state_ptr(owner, stname, dtype<C>(), v.size(), v.data()); + } + + template<typename C, std::size_t N> + void save_item(const void *owner, std::array<C, N> &a, const pstring &stname) + { + save_state_ptr(owner, stname, dtype<C>(), N, a.data()); } void pre_save(); void post_load(); void remove_save_items(const void *owner); - const entry_t::list_t &save_list() const { return m_save; } + const std::vector<const entry_t *> save_list() const + { + std::vector<const entry_t *> ret; + for (auto &i : m_save) + ret.push_back(i.get()); + return ret; + } void save_state_ptr(const void *owner, const pstring &stname, const datatype_t &dt, const std::size_t count, void *ptr); @@ -124,6 +137,6 @@ private: template<> void state_manager_t::save_item(const void *owner, callback_t &state, const pstring &stname); -} +} // namespace plib #endif /* PSTATE_H_ */ |