sound/discrete: Get rid of vtables in factories.

This speeds up compilation.
This commit is contained in:
Vas Crabb 2020-10-01 00:16:40 +10:00
parent 687dd20aeb
commit b320438db4
2 changed files with 24 additions and 39 deletions

View File

@ -118,7 +118,7 @@ public:
inline void unlock() { m_threadid = -1; } inline void unlock() { m_threadid = -1; }
//const linked_list_entry *list; //const linked_list_entry *list;
node_step_list_t step_list; discrete_device::node_step_list_t step_list;
/* list of source nodes */ /* list of source nodes */
std::vector<input_buffer> source_list; /* discrete_source_node */ std::vector<input_buffer> source_list; /* discrete_source_node */
@ -210,10 +210,10 @@ inline void discrete_task::step_nodes()
void *discrete_task::task_callback(void *param, int threadid) void *discrete_task::task_callback(void *param, int threadid)
{ {
task_list_t *list = (task_list_t *) param; const auto &list = *reinterpret_cast<const discrete_sound_device::task_list_t *>(param);
do do
{ {
for (const auto &task : *list) for (const auto &task : list)
{ {
/* try to lock */ /* try to lock */
if (task->lock_threadid(threadid)) if (task->lock_threadid(threadid))
@ -601,7 +601,7 @@ void discrete_device::discrete_sanity_check(const sound_block_list_t &block_list
* *
*************************************/ *************************************/
static uint64_t list_run_time(const node_list_t &list) static uint64_t list_run_time(const discrete_device::node_list_t &list)
{ {
uint64_t total = 0; uint64_t total = 0;
@ -614,7 +614,7 @@ static uint64_t list_run_time(const node_list_t &list)
return total; return total;
} }
static uint64_t step_list_run_time(const node_step_list_t &list) static uint64_t step_list_run_time(const discrete_device::node_step_list_t &list)
{ {
uint64_t total = 0; uint64_t total = 0;

View File

@ -4101,14 +4101,10 @@ enum discrete_node_type
*************************************/ *************************************/
struct discrete_block; struct discrete_block;
class discrete_node_base_factory;
class discrete_task; class discrete_task;
class discrete_base_node; class discrete_base_node;
class discrete_dss_input_stream_node; class discrete_dss_input_stream_node;
class discrete_device; class discrete_device;
typedef std::vector<std::unique_ptr<discrete_base_node> > node_list_t;
typedef std::vector<discrete_dss_input_stream_node *> istream_node_list_t;
typedef std::vector<std::unique_ptr<discrete_task> > task_list_t;
/************************************* /*************************************
@ -4137,7 +4133,6 @@ struct discrete_block
const char * name; /* Node Name */ const char * name; /* Node Name */
const char * mod_name; /* Module / class name */ const char * mod_name; /* Module / class name */
}; };
typedef std::vector<const discrete_block *> sound_block_list_t;
/************************************* /*************************************
* *
@ -4154,7 +4149,6 @@ public:
osd_ticks_t run_time; osd_ticks_t run_time;
discrete_base_node * self; discrete_base_node * self;
}; };
typedef std::vector<discrete_step_interface *> node_step_list_t;
class discrete_input_interface class discrete_input_interface
{ {
@ -4177,7 +4171,6 @@ public:
//************************************************************************** //**************************************************************************
class discrete_sound_output_interface; class discrete_sound_output_interface;
typedef std::vector<discrete_sound_output_interface *> node_output_list_t;
// ======================> discrete_device // ======================> discrete_device
@ -4191,6 +4184,10 @@ protected:
discrete_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); discrete_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
public: public:
typedef std::vector<std::unique_ptr<discrete_task> > task_list_t;
typedef std::vector<std::unique_ptr<discrete_base_node> > node_list_t;
typedef std::vector<discrete_step_interface *> node_step_list_t;
// inline configuration helpers // inline configuration helpers
void set_intf(const discrete_block *intf) { m_intf = intf; } void set_intf(const discrete_block *intf) { m_intf = intf; }
@ -4231,7 +4228,6 @@ public:
protected: protected:
// device-level overrides // device-level overrides
virtual void device_start() override; virtual void device_start() override;
virtual void device_reset() override; virtual void device_reset() override;
@ -4253,6 +4249,8 @@ protected:
node_list_t m_node_list; /* node_description * */ node_list_t m_node_list; /* node_description * */
private: private:
typedef std::vector<const discrete_block *> sound_block_list_t;
void discrete_build_list(const discrete_block *intf, sound_block_list_t &block_list); void discrete_build_list(const discrete_block *intf, sound_block_list_t &block_list);
void discrete_sanity_check(const sound_block_list_t &block_list); void discrete_sanity_check(const sound_block_list_t &block_list);
void display_profiling(); void display_profiling();
@ -4311,6 +4309,9 @@ protected:
virtual void sound_stream_update(sound_stream &stream, std::vector<read_stream_view> const &inputs, std::vector<write_stream_view> &outputs) override; virtual void sound_stream_update(sound_stream &stream, std::vector<read_stream_view> const &inputs, std::vector<write_stream_view> &outputs) override;
private: private:
typedef std::vector<discrete_dss_input_stream_node *> istream_node_list_t;
typedef std::vector<discrete_sound_output_interface *> node_output_list_t;
/* the output stream */ /* the output stream */
sound_stream *m_stream; sound_stream *m_stream;
@ -4403,28 +4404,18 @@ private:
discrete_sound_output_interface * m_output_intf; discrete_sound_output_interface * m_output_intf;
}; };
class discrete_node_base_factory template <class C>
class discrete_node_factory
{ {
public: public:
virtual std::unique_ptr<discrete_base_node> Create(discrete_device &pdev, const discrete_block &block) = 0; static std::unique_ptr<discrete_base_node> create(discrete_device &pdev, const discrete_block &block)
virtual ~discrete_node_base_factory() {}
};
template <class C>
class discrete_node_factory : public discrete_node_base_factory
{
public:
std::unique_ptr<discrete_base_node> Create(discrete_device &pdev, const discrete_block &block) override;
};
template <class C>
std::unique_ptr<discrete_base_node> discrete_node_factory<C>::Create(discrete_device &pdev, const discrete_block &block)
{ {
auto r = make_unique_clear<C>(); auto r = make_unique_clear<C>();
r->init(&pdev, &block); r->init(&pdev, &block);
return r; return r;
} }
};
/************************************* /*************************************
* *
@ -4441,16 +4432,10 @@ std::unique_ptr<discrete_base_node> discrete_node_factory<C>::Create(discrete_de
* *
*************************************/ *************************************/
template <class C>
std::unique_ptr<discrete_base_node> discrete_create_node(discrete_device &pdev, const discrete_block &block)
{
return discrete_node_factory<C>().Create(pdev, block);
}
#define DISCRETE_SOUND_EXTERN(name) extern const discrete_block name[] #define DISCRETE_SOUND_EXTERN(name) extern const discrete_block name[]
#define DISCRETE_SOUND_START(name) const discrete_block name[] = { #define DISCRETE_SOUND_START(name) const discrete_block name[] = {
//#define DSC_SND_ENTRY(_nod, _class, _dss, _num, _iact, _iinit, _custom, _name) { _nod, new discrete_node_factory< DISCRETE_CLASS_NAME(_class) >, _dss, _num, _iact, _iinit, _custom, _name, # _class } //#define DSC_SND_ENTRY(_nod, _class, _dss, _num, _iact, _iinit, _custom, _name) { _nod, new discrete_node_factory< DISCRETE_CLASS_NAME(_class) >, _dss, _num, _iact, _iinit, _custom, _name, # _class }
#define DSC_SND_ENTRY(_nod, _class, _dss, _num, _iact, _iinit, _custom, _name) { _nod, &discrete_create_node< DISCRETE_CLASS_NAME(_class) >, _dss, _num, _iact, _iinit, _custom, _name, # _class } #define DSC_SND_ENTRY(_nod, _class, _dss, _num, _iact, _iinit, _custom, _name) { _nod, &discrete_node_factory< DISCRETE_CLASS_NAME(_class) >::create, _dss, _num, _iact, _iinit, _custom, _name, # _class }
#define DISCRETE_SOUND_END DSC_SND_ENTRY( NODE_00, special, DSS_NULL , 0, DSE( NODE_NC ), DSE( 0 ) ,nullptr ,"DISCRETE_SOUND_END" ) }; #define DISCRETE_SOUND_END DSC_SND_ENTRY( NODE_00, special, DSS_NULL , 0, DSE( NODE_NC ), DSE( 0 ) ,nullptr ,"DISCRETE_SOUND_END" ) };