diff options
Diffstat (limited to 'src/lib/netlist/nl_factory.h')
-rw-r--r-- | src/lib/netlist/nl_factory.h | 87 |
1 files changed, 36 insertions, 51 deletions
diff --git a/src/lib/netlist/nl_factory.h b/src/lib/netlist/nl_factory.h index 271bf72bf90..6dad6c5e171 100644 --- a/src/lib/netlist/nl_factory.h +++ b/src/lib/netlist/nl_factory.h @@ -9,58 +9,46 @@ #ifndef NLFACTORY_H_ #define NLFACTORY_H_ -#include "nltypes.h" #include "plib/palloc.h" #include "plib/ptypes.h" -#include <vector> - -#define NETLIB_DEVICE_IMPL_ALIAS(p_alias, chip, p_name, p_def_param) \ - NETLIB_DEVICE_IMPL_BASE(devices, p_alias, chip, p_name, p_def_param) \ - -#define NETLIB_DEVICE_IMPL(chip, p_name, p_def_param) \ - NETLIB_DEVICE_IMPL_NS(devices, chip, p_name, p_def_param) - -#define NETLIB_DEVICE_IMPL_NS(ns, chip, p_name, p_def_param) \ - NETLIB_DEVICE_IMPL_BASE(ns, chip, chip, p_name, p_def_param) \ +#define NETLIB_DEVICE_IMPL(chip) \ + static std::unique_ptr<factory::element_t> NETLIB_NAME(chip ## _c)( \ + const pstring &name, const pstring &classname, const pstring &def_param) \ + { \ + return std::unique_ptr<factory::element_t>(plib::palloc<factory::device_element_t<NETLIB_NAME(chip)>>(name, classname, def_param, pstring(__FILE__))); \ + } \ + factory::constructor_ptr_t decl_ ## chip = NETLIB_NAME(chip ## _c); -#define NETLIB_DEVICE_IMPL_BASE(ns, p_alias, chip, p_name, p_def_param) \ - static plib::unique_ptr<factory::element_t> NETLIB_NAME(p_alias ## _c) \ - (const pstring &classname) \ +#define NETLIB_DEVICE_IMPL_NS(ns, chip) \ + static std::unique_ptr<factory::element_t> NETLIB_NAME(chip ## _c)( \ + const pstring &name, const pstring &classname, const pstring &def_param) \ { \ - return plib::make_unique<factory::device_element_t<ns :: NETLIB_NAME(chip)>>(p_name, classname, p_def_param, pstring(__FILE__)); \ + return std::unique_ptr<factory::element_t>(plib::palloc<factory::device_element_t<ns :: NETLIB_NAME(chip)>>(name, classname, def_param, pstring(__FILE__))); \ } \ - \ - factory::constructor_ptr_t decl_ ## p_alias = NETLIB_NAME(p_alias ## _c); + factory::constructor_ptr_t decl_ ## chip = NETLIB_NAME(chip ## _c); namespace netlist { + class netlist_t; class device_t; - class nlparse_t; class setup_t; - class netlist_state_t; namespace factory { // ----------------------------------------------------------------------------- // net_dev class factory // ----------------------------------------------------------------------------- - class element_t + class element_t : plib::nocopyassignmove { public: element_t(const pstring &name, const pstring &classname, const pstring &def_param); element_t(const pstring &name, const pstring &classname, const pstring &def_param, const pstring &sourcefile); - virtual ~element_t() = default; + virtual ~element_t(); - COPYASSIGNMOVE(element_t, default) - - virtual pool_owned_ptr<device_t> Create(netlist_state_t &anetlist, const pstring &name) = 0; - virtual void macro_actions(nlparse_t &nparser, const pstring &name) - { - plib::unused_var(nparser); - plib::unused_var(name); - } + virtual plib::owned_ptr<device_t> Create(netlist_t &anetlist, const pstring &name) = 0; + virtual void macro_actions(netlist_t &anetlist, const pstring &name) {} const pstring &name() const { return m_name; } const pstring &classname() const { return m_classname; } @@ -85,28 +73,26 @@ namespace factory { const pstring &def_param, const pstring &sourcefile) : element_t(name, classname, def_param, sourcefile) { } - pool_owned_ptr<device_t> Create(netlist_state_t &anetlist, const pstring &name) override + plib::owned_ptr<device_t> Create(netlist_t &anetlist, const pstring &name) override { - return pool().make_poolptr<C>(anetlist, name); + return plib::owned_ptr<device_t>::Create<C>(anetlist, name); } }; - class list_t : public std::vector<plib::unique_ptr<element_t>> + class list_t : public std::vector<std::unique_ptr<element_t>> { public: - explicit list_t(log_type &alog); - ~list_t() = default; - - COPYASSIGNMOVE(list_t, delete) + explicit list_t(setup_t &m_setup); + ~list_t(); template<class device_class> void register_device(const pstring &name, const pstring &classname, const pstring &def_param) { - register_device(plib::make_unique<device_element_t<device_class>>(name, classname, def_param)); + register_device(std::unique_ptr<element_t>(plib::palloc<device_element_t<device_class>>(name, classname, def_param))); } - void register_device(plib::unique_ptr<element_t> &&factory); + void register_device(std::unique_ptr<element_t> &&factory); element_t * factory_by_name(const pstring &devname); @@ -117,20 +103,21 @@ namespace factory { } private: - log_type &m_log; + setup_t &m_setup; }; // ----------------------------------------------------------------------------- // factory_creator_ptr_t // ----------------------------------------------------------------------------- - using constructor_ptr_t = plib::unique_ptr<element_t> (*)(const pstring &classname); + using constructor_ptr_t = std::unique_ptr<element_t> (*)(const pstring &name, const pstring &classname, + const pstring &def_param); template <typename T> - plib::unique_ptr<element_t> constructor_t(const pstring &name, const pstring &classname, + std::unique_ptr<element_t> constructor_t(const pstring &name, const pstring &classname, const pstring &def_param) { - return plib::make_unique<device_element_t<T>>(name, classname, def_param); + return std::unique_ptr<element_t>(plib::palloc<device_element_t<T>>(name, classname, def_param)); } // ----------------------------------------------------------------------------- @@ -141,24 +128,22 @@ namespace factory { { public: - library_element_t(const pstring &name, const pstring &classname, + library_element_t(setup_t &setup, const pstring &name, const pstring &classname, const pstring &def_param, const pstring &source) - : element_t(name, classname, def_param, source) - { - } + : element_t(name, classname, def_param, source) { } - pool_owned_ptr<device_t> Create(netlist_state_t &anetlist, const pstring &name) override; + plib::owned_ptr<device_t> Create(netlist_t &anetlist, const pstring &name) override; - void macro_actions(nlparse_t &nparser, const pstring &name) override; + void macro_actions(netlist_t &anetlist, const pstring &name) override; private: }; - } // namespace factory + } namespace devices { void initialize_factory(factory::list_t &factory); - } // namespace devices -} // namespace netlist + } +} #endif /* NLFACTORY_H_ */ |