diff options
Diffstat (limited to 'src/emu/dislot.cpp')
-rw-r--r-- | src/emu/dislot.cpp | 57 |
1 files changed, 37 insertions, 20 deletions
diff --git a/src/emu/dislot.cpp b/src/emu/dislot.cpp index e89fd8b77bd..37acf1dfddd 100644 --- a/src/emu/dislot.cpp +++ b/src/emu/dislot.cpp @@ -15,8 +15,8 @@ // ctor // ------------------------------------------------- -device_slot_interface::device_slot_interface(const machine_config &mconfig, device_t &device) - : device_interface(device, "slot"), +device_slot_interface::device_slot_interface(const machine_config &mconfig, device_t &device) : + device_interface(device, "slot"), m_default_option(nullptr), m_fixed(false), m_card_device(nullptr) @@ -37,10 +37,10 @@ device_slot_interface::~device_slot_interface() // device_slot_option ctor // ------------------------------------------------- -device_slot_option::device_slot_option(const char *name, const device_type &devtype): +device_slot_interface::slot_option::slot_option(const char *name, const device_type &devtype, bool selectable) : m_name(name), m_devtype(devtype), - m_selectable(true), + m_selectable(selectable), m_default_bios(nullptr), m_machine_config(nullptr), m_input_device_defaults(nullptr), @@ -53,14 +53,33 @@ device_slot_option::device_slot_option(const char *name, const device_type &devt // option_add // ------------------------------------------------- -void device_slot_interface::option_add(const char *name, const device_type &devtype) +device_slot_interface::slot_option &device_slot_interface::option_add(const char *name, const device_type &devtype) { - device_slot_option *slot_option = option(name); + const slot_option *const existing = option(name); + if (existing) + throw emu_fatalerror("slot '%s' duplicate option '%s'\n", device().tag(), name); + + if (m_options.count(name)) + throw tag_add_exception(name); + + return *m_options.emplace(name, std::make_unique<slot_option>(name, devtype, true)).first->second; +} + + +// ------------------------------------------------- +// option_add_internal +// ------------------------------------------------- - if (slot_option != nullptr) +device_slot_interface::slot_option &device_slot_interface::option_add_internal(const char *name, const device_type &devtype) +{ + const slot_option *const existing = option(name); + if (existing) throw emu_fatalerror("slot '%s' duplicate option '%s'\n", device().tag(), name); - if (m_options.count(name) != 0) throw tag_add_exception(name); - m_options.emplace(std::make_pair(name, std::make_unique<device_slot_option>(name, devtype))); + + if (m_options.count(name)) + throw tag_add_exception(name); + + return *m_options.emplace(name, std::make_unique<slot_option>(name, devtype, false)).first->second; } @@ -68,14 +87,13 @@ void device_slot_interface::option_add(const char *name, const device_type &devt // option // ------------------------------------------------- -device_slot_option *device_slot_interface::config_option(const char *name) +device_slot_interface::slot_option *device_slot_interface::config_option(const char *name) { - device_slot_option *slot_option = option(name); - - if (slot_option == nullptr) - throw emu_fatalerror("slot '%s' has no option '%s'\n", device().tag(), name); + auto const search = m_options.find(name); + if (search != m_options.end()) + return search->second.get(); - return slot_option; + throw emu_fatalerror("slot '%s' has no option '%s'\n", device().tag(), name); } @@ -99,16 +117,15 @@ bool device_slot_interface::has_selectable_options() const // option // ------------------------------------------------- -device_slot_option *device_slot_interface::option(const char *name) const +const device_slot_interface::slot_option *device_slot_interface::option(const char *name) const { - device_slot_option *result = nullptr; if (name) { - auto search = m_options.find(name); + auto const search = m_options.find(name); if (search != m_options.end()) - result = search->second.get(); + return search->second.get(); } - return result; + return nullptr; } |