summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/dislot.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/emu/dislot.cpp')
-rw-r--r--src/emu/dislot.cpp57
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;
}