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.h67
1 files changed, 27 insertions, 40 deletions
diff --git a/src/lib/netlist/plib/pstate.h b/src/lib/netlist/plib/pstate.h
index ac75ca6b69e..9757d6408b7 100644
--- a/src/lib/netlist/plib/pstate.h
+++ b/src/lib/netlist/plib/pstate.h
@@ -8,13 +8,11 @@
#ifndef PSTATE_H_
#define PSTATE_H_
-#include "palloc.h"
#include "pstring.h"
#include "ptypes.h"
-#include <array>
-#include <memory>
#include <vector>
+#include <memory>
// ----------------------------------------------------------------------------------------
// state saving ...
@@ -40,31 +38,32 @@ public:
const bool is_custom;
};
- template<typename T>
- static datatype_t dtype()
+ template<typename T> struct datatype_f
{
- return datatype_t(sizeof(T),
- plib::is_integral<T>::value || std::is_enum<T>::value,
- std::is_floating_point<T>::value);
- }
+ 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);
+ }
+ };
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(state_manager_t &manager) = 0;
- virtual void on_post_load(state_manager_t &manager) = 0;
+ virtual void on_pre_save() = 0;
+ virtual void on_post_load() = 0;
protected:
- callback_t() = default;
- ~callback_t() = default;
- COPYASSIGNMOVE(callback_t, default)
};
struct entry_t
{
- using list_t = std::vector<plib::unique_ptr<entry_t>>;
+ using list_t = std::vector<std::unique_ptr<entry_t>>;
entry_t(const pstring &stname, const datatype_t &dt, const void *owner,
const std::size_t count, void *ptr)
@@ -73,6 +72,8 @@ 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;
@@ -81,49 +82,35 @@ public:
void * m_ptr;
};
- state_manager_t() = default;
+ state_manager_t();
+ ~state_manager_t();
- 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, dtype<C>(), 1, &state);
+ save_state_ptr( owner, stname, datatype_f<C>::f(), 1, &state);
}
- 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)
+ template<typename C, std::size_t N> void save_item(const void *owner, C (&state)[N], const pstring &stname)
{
- save_state_ptr(owner, stname, dtype<C>(), N, &(state[0]));
+ save_state_ptr(owner, stname, datatype_f<C>::f(), 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, dtype<C>(), count, state);
+ save_state_ptr(owner, stname, datatype_f<C>::f(), count, state);
}
template<typename C>
void save_item(const void *owner, std::vector<C> &v, const pstring &stname)
{
- 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());
+ save_state(v.data(), owner, stname, v.size());
}
void pre_save();
void post_load();
void remove_save_items(const void *owner);
- 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;
- }
+ const entry_t::list_t &save_list() const { return m_save; }
void save_state_ptr(const void *owner, const pstring &stname, const datatype_t &dt, const std::size_t count, void *ptr);
@@ -137,6 +124,6 @@ private:
template<> void state_manager_t::save_item(const void *owner, callback_t &state, const pstring &stname);
-} // namespace plib
+}
#endif /* PSTATE_H_ */