diff options
Diffstat (limited to 'src/osd/modules/osdmodule.h')
-rw-r--r-- | src/osd/modules/osdmodule.h | 86 |
1 files changed, 46 insertions, 40 deletions
diff --git a/src/osd/modules/osdmodule.h b/src/osd/modules/osdmodule.h index 95178b27f70..b690f874706 100644 --- a/src/osd/modules/osdmodule.h +++ b/src/osd/modules/osdmodule.h @@ -7,62 +7,68 @@ OSD module management *******************************************************************c********/ - -//#pragma once - #ifndef MAME_OSD_MODULES_OSDMODULE_H #define MAME_OSD_MODULES_OSDMODULE_H -#include "osdcore.h" -#include "osdepend.h" +#pragma once + +#include <functional> +#include <memory> +#include <string> +#include <string_view> +#include <vector> + //============================================================ // TYPE DEFINITIONS //============================================================ +class osd_interface; class osd_options; -class osd_module; -// ======================> osd_module + +//============================================================ +// TYPE DEFINITIONS +//============================================================ class osd_module { public: - - osd_module(const char *type, const char *name) - : m_name(name), m_type(type) - {} virtual ~osd_module() { } - const char * name() const { return m_name.c_str(); } - const char * type() const { return m_type.c_str(); } + std::string const &name() const { return m_name; } + std::string const &type() const { return m_type; } virtual bool probe() { return true; } - virtual int init(const osd_options &options) = 0; + virtual int init(osd_interface &osd, const osd_options &options) = 0; virtual void exit() { } +protected: + osd_module(const char *type, const char *name) : m_name(name), m_type(type) { } + osd_module(osd_module const &) = delete; + private: - std::string m_name; - std::string m_type; + std::string const m_name; + std::string const m_type; }; + // a module_type is simply a pointer to its alloc function -typedef osd_module *(*module_type)(); +typedef std::unique_ptr<osd_module> (*module_type)(); + // this template function creates a stub which constructs a module -template<class ModuleClass> -osd_module *module_creator() +template <class ModuleClass> +std::unique_ptr<osd_module> module_creator() { - return global_alloc(ModuleClass()); + return std::unique_ptr<osd_module>(new ModuleClass); } + class osd_module_manager { public: - - static const int MAX_MODULES = 64; - osd_module_manager(); ~osd_module_manager(); @@ -72,38 +78,38 @@ public: osd_module *get_module_generic(const char *type, const char *name); template<class C> - C select_module(const char *type, const char *name = "") + C &select_module(osd_interface &osd, const osd_options &options, const char *type, const char *name = "") { - return dynamic_cast<C>(select_module(type, name)); + return dynamic_cast<C &>(select_module(osd, options, type, name)); } - osd_module *select_module(const char *type, const char *name = ""); + osd_module &select_module(osd_interface &osd, const osd_options &options, const char *type, const char *name = ""); - void get_module_names(const char *type, const int max, int *num, const char *names[]) const; - - void init(const osd_options &options); + std::vector<std::string_view> get_module_names(const char *type) const; void exit(); private: int get_module_index(const char *type, const char *name) const; - osd_module *m_modules[MAX_MODULES]; - osd_module *m_selected[MAX_MODULES]; + std::vector<std::unique_ptr<osd_module> > m_modules; + std::vector<std::reference_wrapper<osd_module> > m_selected; }; + #define MODULE_DEFINITION(mod_id, mod_class) \ - extern const module_type mod_id ; \ - const module_type mod_id = &module_creator< mod_class >; + extern const module_type mod_id ; \ + const module_type mod_id = &module_creator<mod_class>; #define MODULE_NOT_SUPPORTED(mod_class, mod_type, mod_name) \ - class mod_class : public osd_module { \ - public: \ - mod_class () : osd_module(mod_type, mod_name) { } \ - virtual ~mod_class() { } \ - virtual int init(const osd_options &options) override { return -1; } \ - virtual bool probe() override { return false; } \ - }; + class mod_class : public osd_module \ + { \ + public: \ + mod_class () : osd_module(mod_type, mod_name) { } \ + virtual ~mod_class() { } \ + virtual int init(osd_interface &osd, const osd_options &options) override { return -1; } \ + virtual bool probe() override { return false; } \ + }; #endif /* MAME_OSD_MODULES_OSDMODULE_H */ |