Fix factory code. (nw)

This commit is contained in:
couriersud 2016-05-29 19:10:38 +02:00
parent fe8476956a
commit 4c7bb29445
6 changed files with 29 additions and 58 deletions

View File

@ -61,9 +61,9 @@ NETLIST_END()
#define ENTRY1(nic, name, defparam) factory.register_device<nic>( # name, xstr(nic), defparam );
#define ENTRY(nic, name, defparam) ENTRY1(NETLIB_NAME(nic), name, defparam)
#define NETLIB_DEVICE_DECL(chip) extern device_creator_ptr_t decl_ ## chip;
#define NETLIB_DEVICE_DECL(chip) extern factory_creator_ptr_t decl_ ## chip;
#define ENTRYX1(nic, name, defparam, decl) factory.register_device( # name, xstr(nic), defparam, decl );
#define ENTRYX1(nic, name, defparam, decl) factory.register_device( decl (# name, xstr(nic), defparam) );
#define ENTRYX(nic, name, defparam) { NETLIB_DEVICE_DECL(nic) ENTRYX1(NETLIB_NAME(nic), name, defparam, decl_ ## nic) }
namespace netlist

View File

@ -1071,15 +1071,15 @@ namespace netlist
namespace devices
{
// ----------------------------------------------------------------------------------------
// mainclock
// ----------------------------------------------------------------------------------------
// ----------------------------------------------------------------------------------------
// mainclock
// ----------------------------------------------------------------------------------------
ATTR_HOT /* inline */ void NETLIB_NAME(mainclock)::mc_update(logic_net_t &net)
{
net.toggle_new_Q();
net.update_devs();
}
ATTR_HOT /* inline */ void NETLIB_NAME(mainclock)::mc_update(logic_net_t &net)
{
net.toggle_new_Q();
net.update_devs();
}
} //namespace devices

View File

@ -236,8 +236,6 @@ class NETLIB_NAME(name) : public device_t
#define NETLIB_UPDATE_TERMINALS(chip) ATTR_HOT void NETLIB_NAME(chip) :: update_terminals(void)
#define NETLIB_DEVICE_IMPL(chip) device_creator_ptr_t decl_ ## chip = device_creator_t< NETLIB_NAME(chip) >;
//============================================================
// Asserts
//============================================================
@ -1301,17 +1299,6 @@ protected:
plib::dynlib *m_lib; // external lib needs to be loaded as long as netlist exists
};
// -----------------------------------------------------------------------------
// base_device_creator_t
// -----------------------------------------------------------------------------
using device_creator_ptr_t = plib::owned_ptr<device_t> (*)(netlist_t &anetlist, const pstring &name);
template <typename T>
plib::owned_ptr<device_t> device_creator_t(netlist_t &anetlist, const pstring &name)
{
return plib::owned_ptr<device_t>::Create<T>(anetlist, name);
}
// -----------------------------------------------------------------------------
// inline implementations

View File

@ -67,12 +67,6 @@ void factory_list_t::error(const pstring &s)
m_setup.log().fatal("{1}", s);
}
plib::owned_ptr<device_t> factory_list_t::new_device_by_name(const pstring &devname, netlist_t &anetlist, const pstring &name)
{
base_factory_t *f = factory_by_name(devname);
return f->Create(anetlist, name);
}
base_factory_t * factory_list_t::factory_by_name(const pstring &devname)
{
for (auto & e : *this)

View File

@ -15,6 +15,8 @@
#include "plib/plists.h"
#include "nl_base.h"
#define NETLIB_DEVICE_IMPL(chip) factory_creator_ptr_t decl_ ## chip = factory_creator_t< NETLIB_NAME(chip) >;
namespace netlist
{
@ -47,7 +49,7 @@ namespace netlist
pstring m_def_param; /* default parameter */
};
template <class device_class>
template <class C>
class factory_t : public base_factory_t
{
P_PREVENT_COPYING(factory_t)
@ -58,27 +60,10 @@ namespace netlist
plib::owned_ptr<device_t> Create(netlist_t &anetlist, const pstring &name) override
{
return plib::owned_ptr<device_t>::Create<device_class>(anetlist, name);
return plib::owned_ptr<device_t>::Create<C>(anetlist, name);
}
};
class factoryx_t : public base_factory_t
{
P_PREVENT_COPYING(factoryx_t)
public:
factoryx_t(const pstring &name, const pstring &classname,
const pstring &def_param, device_creator_ptr_t ptr)
: base_factory_t(name, classname, def_param)
, m_ptr(ptr) { }
plib::owned_ptr<device_t> Create(netlist_t &anetlist, const pstring &name) override
{
return m_ptr(anetlist, name);
}
private:
device_creator_ptr_t m_ptr;
};
class factory_list_t : public plib::pvector_t<plib::owned_ptr<base_factory_t>>
{
public:
@ -100,15 +85,6 @@ namespace netlist
push_back(std::move(factory));
}
void register_device(const pstring &name, const pstring &classname,
const pstring &def_param, device_creator_ptr_t ptr)
{
register_device(plib::owned_ptr<base_factory_t>::Create<factoryx_t>(name, classname, def_param, ptr));
}
//ATTR_COLD device_t *new_device_by_classname(const pstring &classname) const;
// FIXME: legacy, should use factory_by_name
plib::owned_ptr<device_t> new_device_by_name(const pstring &devname, netlist_t &anetlist, const pstring &name);
base_factory_t * factory_by_name(const pstring &devname);
template <class C>
@ -123,6 +99,20 @@ namespace netlist
setup_t &m_setup;
};
// -----------------------------------------------------------------------------
// factory_creator_ptr_t
// -----------------------------------------------------------------------------
using factory_creator_ptr_t = plib::owned_ptr<base_factory_t> (*)(const pstring &name, const pstring &classname,
const pstring &def_param);
template <typename T>
plib::owned_ptr<base_factory_t> factory_creator_t(const pstring &name, const pstring &classname,
const pstring &def_param)
{
return plib::owned_ptr<base_factory_t>::Create<factory_t<T>>(name, classname, def_param);
}
}
#endif /* NLFACTORY_H_ */

View File

@ -853,7 +853,7 @@ void setup_t::start_devices()
for (pstring ll : loglist)
{
pstring name = "log_" + ll;
auto nc = factory().new_device_by_name("LOG", netlist(), name);
auto nc = factory().factory_by_name("LOG")->Create(netlist(), name);
register_link(name + ".I", ll);
log().debug(" dynamic link {1}: <{2}>\n",ll, name);
register_dev_s(std::move(nc));