diff options
author | Miodrag Milanovic <mmicko@gmail.com> | 2016-06-18 10:59:37 +0200 |
---|---|---|
committer | Miodrag Milanovic <mmicko@gmail.com> | 2016-06-18 15:32:15 +0200 |
commit | d705e4a28d49b9eeeadc9c019a12cf580ae5ee8f (patch) | |
tree | 9f5c5e7c75d3799a398d84fa3f0153ee417eb4c0 /src | |
parent | cb9d158d572edbf2dc665d87d993dc729a85b6ae (diff) |
ioport tagged_list to unordered_map (nw)
Diffstat (limited to 'src')
-rw-r--r-- | src/emu/crsshair.cpp | 4 | ||||
-rw-r--r-- | src/emu/ioport.cpp | 84 | ||||
-rw-r--r-- | src/emu/ioport.h | 5 | ||||
-rw-r--r-- | src/emu/validity.cpp | 12 | ||||
-rw-r--r-- | src/frontend/mame/info.cpp | 30 | ||||
-rw-r--r-- | src/frontend/mame/luaengine.cpp | 8 | ||||
-rw-r--r-- | src/frontend/mame/ui/cheatopt.cpp | 4 | ||||
-rw-r--r-- | src/frontend/mame/ui/devopt.cpp | 4 | ||||
-rw-r--r-- | src/frontend/mame/ui/inputmap.cpp | 12 | ||||
-rw-r--r-- | src/frontend/mame/ui/ui.cpp | 8 |
10 files changed, 86 insertions, 85 deletions
diff --git a/src/emu/crsshair.cpp b/src/emu/crsshair.cpp index 28d5cced1ce..d976e49714f 100644 --- a/src/emu/crsshair.cpp +++ b/src/emu/crsshair.cpp @@ -113,8 +113,8 @@ crosshair_manager::crosshair_manager(running_machine &machine) m_auto_time = CROSSHAIR_VISIBILITY_AUTOTIME_DEFAULT; /* determine who needs crosshairs */ - for (ioport_port &port : machine.ioport().ports()) - for (ioport_field &field : port.fields()) + for (auto &port : machine.ioport().ports()) + for (ioport_field &field : port.second->fields()) if (field.crosshair_axis() != CROSSHAIR_AXIS_NONE) { int player = field.player(); diff --git a/src/emu/ioport.cpp b/src/emu/ioport.cpp index 3e4ae3f71e4..f8c03feeac7 100644 --- a/src/emu/ioport.cpp +++ b/src/emu/ioport.cpp @@ -658,8 +658,8 @@ void ioport_list::append(device_t &device, std::string &errorbuf) (*constructor)(device, *this, errorbuf); // collapse fields and sort the list - for (ioport_port &port : *this) - port.collapse_fields(errorbuf); + for (auto &port : *this) + port.second->collapse_fields(errorbuf); } @@ -1073,8 +1073,8 @@ void natural_keyboard::build_codes(ioport_manager &manager) if (curshift == 0 || shift[curshift - 1] != nullptr) // iterate over ports and fields - for (ioport_port &port : manager.ports()) - for (ioport_field &field : port.fields()) + for (auto &port : manager.ports()) + for (ioport_field &field : port.second->fields()) if (field.type() == IPT_KEYBOARD) { // fetch the code, ignoring 0 @@ -2485,11 +2485,11 @@ time_t ioport_manager::initialize() for (device_t &device : iter) { int players = 0; - for (ioport_port &port : m_portlist) + for (auto &port : m_portlist) { - if (&port.device() == &device) + if (&port.second->device() == &device) { - for (ioport_field &field : port.fields()) + for (ioport_field &field : port.second->fields()) if (field.type_class()==INPUT_CLASS_CONTROLLER) { if (players < field.player() + 1) players = field.player() + 1; @@ -2501,8 +2501,8 @@ time_t ioport_manager::initialize() } // allocate live structures to mirror the configuration - for (ioport_port &port : m_portlist) - port.init_live_state(); + for (auto &port : m_portlist) + port.second->init_live_state(); // handle autoselection of devices init_autoselect_devices(IPT_AD_STICK_X, IPT_AD_STICK_Y, IPT_AD_STICK_Z, OPTION_ADSTICK_DEVICE, "analog joystick"); @@ -2517,8 +2517,8 @@ time_t ioport_manager::initialize() // look for 4-way diagonal joysticks and change the default map if we find any const char *joystick_map_default = machine().options().joystick_map(); if (joystick_map_default[0] == 0 || strcmp(joystick_map_default, "auto") == 0) - for (ioport_port &port : m_portlist) - for (ioport_field &field : port.fields()) + for (auto &port : m_portlist) + for (ioport_field &field : port.second->fields()) if (field.live().joystick != nullptr && field.rotated()) { machine().input().set_global_joystick_map(joystick_map_4way_diagonal); @@ -2537,8 +2537,8 @@ time_t ioport_manager::initialize() m_has_bioses = false; // scan the input port array to see what options we need to enable - for (ioport_port &port : m_portlist) - for (ioport_field &field : port.fields()) + for (auto &port : m_portlist) + for (ioport_field &field : port.second->fields()) { if (field.type() == IPT_DIPSWITCH) m_has_dips = true; @@ -2627,8 +2627,8 @@ void ioport_manager::init_autoselect_devices(int type1, int type2, int type3, co // only scan the list if we haven't already enabled this class of control if (!m_portlist.empty() && !machine().input().device_class(autoenable).enabled()) - for (ioport_port &port : m_portlist) - for (ioport_field &field : port.fields()) + for (auto &port : m_portlist) + for (ioport_field &field : port.second->fields()) // if this port type is in use, apply the autoselect criteria if ((type1 != 0 && field.type() == type1) || (type2 != 0 && field.type() == type2) || (type3 != 0 && field.type() == type3)) @@ -2738,8 +2738,8 @@ bool ioport_manager::type_pressed(ioport_type type, int player) bool ioport_manager::type_class_present(ioport_type_class inputclass) { - for (ioport_port &port : m_portlist) - for (ioport_field &field : port.fields()) + for (auto &port : m_portlist) + for (ioport_field &field : port.second->fields()) if (field.type_class() == inputclass) return true; return false; @@ -2754,8 +2754,8 @@ bool ioport_manager::type_class_present(ioport_type_class inputclass) bool ioport_manager::has_keyboard() const { // iterate over ports and fields - for (ioport_port &port : m_portlist) - for (ioport_field &field : port.fields()) + for (auto &port : m_portlist) + for (ioport_field &field : port.second->fields()) { // if we are at init, check IPT_KEYBOARD if (!m_safe_to_read && field.type() == IPT_KEYBOARD) @@ -2777,8 +2777,8 @@ bool ioport_manager::has_keyboard() const int ioport_manager::count_players() const { int max_player = 0; - for (ioport_port &port : m_portlist) - for (ioport_field &field : port.fields()) + for (auto &port : m_portlist) + for (ioport_field &field : port.second->fields()) if (field.type_class() == INPUT_CLASS_CONTROLLER && max_player <= field.player() + 1) max_player = field.player() + 1; @@ -2795,8 +2795,8 @@ bool ioport_manager::crosshair_position(int player, float &x, float &y) { // read all the lightgun values bool gotx = false, goty = false; - for (ioport_port &port : m_portlist) - for (ioport_field &field : port.fields()) + for (auto &port : m_portlist) + for (ioport_field &field : port.second->fields()) if (field.player() == player && field.crosshair_axis() != CROSSHAIR_AXIS_NONE && field.enabled()) { field.crosshair_position(x, y, gotx, goty); @@ -2863,23 +2863,23 @@ g_profiler.start(PROFILER_INPUT); // compute default values for all the ports // two passes to catch conditionals properly - for (ioport_port &port : m_portlist) - port.update_defvalue(true); - for (ioport_port &port : m_portlist) - port.update_defvalue(false); + for (auto &port : m_portlist) + port.second->update_defvalue(true); + for (auto &port : m_portlist) + port.second->update_defvalue(false); // loop over all input ports - for (ioport_port &port : m_portlist) + for (auto &port : m_portlist) { - port.frame_update(); + port.second->frame_update(); // handle playback/record - playback_port(port); - record_port(port); + playback_port(*port.second.get()); + record_port(*port.second.get()); // call device line write handlers - ioport_value newvalue = port.read(); - for (dynamic_field &dynfield : port.live().writelist) + ioport_value newvalue = port.second->read(); + for (dynamic_field &dynfield : port.second->live().writelist) if (dynfield.field().type() != IPT_OUTPUT) dynfield.write(newvalue); } @@ -3045,9 +3045,9 @@ bool ioport_manager::load_game_config(xml_data_node *portnode, int type, int pla ioport_value defvalue = xml_get_attribute_int(portnode, "defvalue", 0); // find the port we want; if no tag, search them all - for (ioport_port &port : m_portlist) - if (tag == nullptr || strcmp(port.tag(), tag) == 0) - for (ioport_field &field : port.fields()) + for (auto &port : m_portlist) + if (tag == nullptr || strcmp(port.second->tag(), tag) == 0) + for (ioport_field &field : port.second->fields()) // find the matching mask and defvalue if (field.type() == type && field.player() == player && @@ -3206,8 +3206,8 @@ void ioport_manager::save_default_inputs(xml_data_node *parentnode) void ioport_manager::save_game_inputs(xml_data_node *parentnode) { // iterate over ports - for (ioport_port &port : m_portlist) - for (ioport_field &field : port.fields()) + for (auto &port : m_portlist) + for (ioport_field &field : port.second->fields()) if (save_this_input_field_type(field.type())) { // determine if we changed @@ -3239,7 +3239,7 @@ void ioport_manager::save_game_inputs(xml_data_node *parentnode) if (portnode != nullptr) { // add the identifying information and attributes - xml_set_attribute(portnode, "tag", port.tag()); + xml_set_attribute(portnode, "tag", port.second->tag()); xml_set_attribute(portnode, "type", input_type_to_token(field.type(), field.player()).c_str()); xml_set_attribute_int(portnode, "mask", field.mask()); xml_set_attribute_int(portnode, "defvalue", field.defvalue() & field.mask()); @@ -3802,7 +3802,9 @@ void ioport_configurer::port_alloc(const char *tag) std::string fulltag = m_owner.subtag(tag); // add it to the list, and reset current field/setting - m_curport = &m_portlist.append(fulltag.c_str(), *global_alloc(ioport_port(m_owner, fulltag.c_str()))); + if (m_portlist.count(fulltag) != 0) throw add_exception(fulltag.c_str()); + m_portlist.emplace(std::make_pair(fulltag, std::make_unique<ioport_port>(m_owner, fulltag.c_str()))); + m_curport = m_portlist.find(fulltag)->second.get(); m_curfield = nullptr; m_cursetting = nullptr; } @@ -3819,7 +3821,7 @@ void ioport_configurer::port_modify(const char *tag) std::string fulltag = m_owner.subtag(tag); // find the existing port - m_curport = m_portlist.find(fulltag.c_str()); + m_curport = m_portlist.find(fulltag.c_str())->second.get(); if (m_curport == nullptr) throw emu_fatalerror("Requested to modify nonexistent port '%s'", fulltag.c_str()); diff --git a/src/emu/ioport.h b/src/emu/ioport.h index 47574421d89..455ef660e60 100644 --- a/src/emu/ioport.h +++ b/src/emu/ioport.h @@ -1265,14 +1265,13 @@ struct ioport_field_live // ======================> ioport_list // class that holds a list of I/O ports -class ioport_list : public tagged_list<ioport_port> +class ioport_list : public std::unordered_map<std::string, std::unique_ptr<ioport_port>> { DISABLE_COPYING(ioport_list); public: ioport_list() { } - using tagged_list<ioport_port>::append; void append(device_t &device, std::string &errorbuf); }; @@ -1515,7 +1514,7 @@ private: void frame_update_callback(); void frame_update(); - ioport_port *port(const char *tag) const { return m_portlist.find(tag); } + ioport_port *port(const char *tag) const { if (tag) { auto search = m_portlist.find(tag); if (search != m_portlist.end()) return search->second.get(); else return nullptr; } else return nullptr; } void exit(); input_seq_type token_to_seq_type(const char *string); diff --git a/src/emu/validity.cpp b/src/emu/validity.cpp index 27bff60cf56..d732d3e892e 100644 --- a/src/emu/validity.cpp +++ b/src/emu/validity.cpp @@ -849,17 +849,17 @@ void validity_checker::validate_inputs() osd_printf_error("I/O port error during construction:\n%s\n", errorbuf.c_str()); // do a first pass over ports to add their names and find duplicates - for (ioport_port &port : portlist) - if (!port_map.insert(port.tag()).second) - osd_printf_error("Multiple I/O ports with the same tag '%s' defined\n", port.tag()); + for (auto &port : portlist) + if (!port_map.insert(port.second->tag()).second) + osd_printf_error("Multiple I/O ports with the same tag '%s' defined\n", port.second->tag()); // iterate over ports - for (ioport_port &port : portlist) + for (auto &port : portlist) { - m_current_ioport = port.tag(); + m_current_ioport = port.second->tag(); // iterate through the fields on this port - for (ioport_field &field : port.fields()) + for (ioport_field &field : port.second->fields()) { // verify analog inputs if (field.is_analog()) diff --git a/src/frontend/mame/info.cpp b/src/frontend/mame/info.cpp index 423eda91680..db9f003f09d 100644 --- a/src/frontend/mame/info.cpp +++ b/src/frontend/mame/info.cpp @@ -261,9 +261,9 @@ void info_xml_creator::output_one() { int nplayers = 0; bool new_kbd = false; - for (ioport_port &port : portlist) - if (&port.device() == &device) - for (ioport_field &field : port.fields()) + for (auto &port : portlist) + if (&port.second->device() == &device) + for (ioport_field &field : port.second->fields()) if (field.type() >= IPT_START && field.type() < IPT_ANALOG_LAST) { if (field.type() == IPT_KEYBOARD) @@ -366,8 +366,8 @@ void info_xml_creator::output_one_device(device_t &device, const char *devtag) for (device_t &dev : device_iterator(device)) portlist.append(dev, errors); // check if the device adds player inputs (other than dsw and configs) to the system - for (ioport_port &port : portlist) - for (ioport_field &field : port.fields()) + for (auto &port : portlist) + for (ioport_field &field : port.second->fields()) if (field.type() >= IPT_START1 && field.type() < IPT_UI_FIRST) { has_input = TRUE; @@ -891,11 +891,11 @@ void info_xml_creator::output_input(const ioport_list &portlist) bool tilt = false; // iterate over the ports - for (ioport_port &port : portlist) + for (auto &port : portlist) { int ctrl_type = CTRL_DIGITAL_BUTTONS; bool ctrl_analog = FALSE; - for (ioport_field &field : port.fields()) + for (ioport_field &field : port.second->fields()) { // track the highest player number if (nplayer < field.player() + 1) @@ -1317,13 +1317,13 @@ void info_xml_creator::output_input(const ioport_list &portlist) void info_xml_creator::output_switches(const ioport_list &portlist, const char *root_tag, int type, const char *outertag, const char *innertag) { // iterate looking for DIP switches - for (ioport_port &port : portlist) - for (ioport_field &field : port.fields()) + for (auto &port : portlist) + for (ioport_field &field : port.second->fields()) if (field.type() == type) { std::ostringstream output; - std::string newtag(port.tag()), oldtag(":"); + std::string newtag(port.second->tag()), oldtag(":"); newtag = newtag.substr(newtag.find(oldtag.append(root_tag)) + oldtag.length()); // output the switch name information @@ -1351,10 +1351,10 @@ void info_xml_creator::output_switches(const ioport_list &portlist, const char * void info_xml_creator::output_ports(const ioport_list &portlist) { // cycle through ports - for (ioport_port &port : portlist) + for (auto &port : portlist) { - fprintf(m_output,"\t\t<port tag=\"%s\">\n", xml_normalize_string(port.tag())); - for (ioport_field &field : port.fields()) + fprintf(m_output,"\t\t<port tag=\"%s\">\n", xml_normalize_string(port.second->tag())); + for (ioport_field &field : port.second->fields()) { if(field.is_analog()) fprintf(m_output,"\t\t\t<analog mask=\"%u\"/>\n", field.mask()); @@ -1373,8 +1373,8 @@ void info_xml_creator::output_ports(const ioport_list &portlist) void info_xml_creator::output_adjusters(const ioport_list &portlist) { // iterate looking for Adjusters - for (ioport_port &port : portlist) - for (ioport_field &field : port.fields()) + for (auto &port : portlist) + for (ioport_field &field : port.second->fields()) if (field.type() == IPT_ADJUSTER) fprintf(m_output, "\t\t<adjuster name=\"%s\" default=\"%d\"/>\n", xml_normalize_string(field.name()), field.defvalue()); } diff --git a/src/frontend/mame/luaengine.cpp b/src/frontend/mame/luaengine.cpp index 1ab9ba8cc1a..be9a1e5f60d 100644 --- a/src/frontend/mame/luaengine.cpp +++ b/src/frontend/mame/luaengine.cpp @@ -644,8 +644,8 @@ luabridge::LuaRef lua_engine::l_ioport_get_ports(const ioport_manager *m) lua_State *L = luaThis->m_lua_state; luabridge::LuaRef port_table = luabridge::LuaRef::newTable(L); - for (ioport_port &port : im->ports()) { - port_table[port.tag()] = &port; + for (auto &port : im->ports()) { + port_table[port.second->tag()] = &port; } return port_table; @@ -1977,9 +1977,9 @@ void lua_engine::update_machine() if (m_machine!=nullptr) { // Create the ioport array - for (ioport_port &port : machine().ioport().ports()) + for (auto &port : machine().ioport().ports()) { - for (ioport_field &field : port.fields()) + for (ioport_field &field : port.second->fields()) { if (field.type_class() != INPUT_CLASS_INTERNAL) { diff --git a/src/frontend/mame/ui/cheatopt.cpp b/src/frontend/mame/ui/cheatopt.cpp index fdcf26ea0ea..f72eed5d20f 100644 --- a/src/frontend/mame/ui/cheatopt.cpp +++ b/src/frontend/mame/ui/cheatopt.cpp @@ -276,10 +276,10 @@ void menu_autofire::populate() /* iterate over the input ports and add autofire toggle items */ int menu_items = 0; - for (ioport_port &port : machine().ioport().ports()) + for (auto &port : machine().ioport().ports()) { bool is_first_button = true; - for (ioport_field &field : port.fields()) + for (ioport_field &field : port.second->fields()) { if (field.type() >= IPT_BUTTON1 && field.type() <= IPT_BUTTON16) { diff --git a/src/frontend/mame/ui/devopt.cpp b/src/frontend/mame/ui/devopt.cpp index 3b8fa1442c1..52e0264b43f 100644 --- a/src/frontend/mame/ui/devopt.cpp +++ b/src/frontend/mame/ui/devopt.cpp @@ -176,8 +176,8 @@ void menu_device_config::populate() portlist.append(iptdev, errors); // check if the device adds inputs to the system - for (ioport_port &port : portlist) - for (ioport_field &field : port.fields()) + for (auto &port : portlist) + for (ioport_field &field : port.second->fields()) { if (field.type() >= IPT_MAHJONG_FIRST && field.type() < IPT_MAHJONG_LAST) input_mj++; diff --git a/src/frontend/mame/ui/inputmap.cpp b/src/frontend/mame/ui/inputmap.cpp index 5552f46d38c..766ce7cd05c 100644 --- a/src/frontend/mame/ui/inputmap.cpp +++ b/src/frontend/mame/ui/inputmap.cpp @@ -164,10 +164,10 @@ void menu_input_specific::populate() suborder[SEQ_TYPE_INCREMENT] = 2; /* iterate over the input ports and add menu items */ - for (ioport_port &port : machine().ioport().ports()) + for (auto &port : machine().ioport().ports()) { port_count++; - for (ioport_field &field : port.fields()) + for (ioport_field &field : port.second->fields()) { ioport_type_class type_class = field.type_class(); @@ -548,8 +548,8 @@ void menu_settings::populate() diplist_tailptr = &diplist; /* loop over input ports and set up the current values */ - for (ioport_port &port : machine().ioport().ports()) - for (ioport_field &field : port.fields()) + for (auto &port : machine().ioport().ports()) + for (ioport_field &field : port.second->fields()) if (field.type() == type && field.enabled()) { UINT32 flags = 0; @@ -818,8 +818,8 @@ void menu_analog::populate() bool first_entry = true; /* loop over input ports and add the items */ - for (ioport_port &port : machine().ioport().ports()) - for (ioport_field &field : port.fields()) + for (auto &port : machine().ioport().ports()) + for (ioport_field &field : port.second->fields()) if (field.is_analog() && field.enabled()) { ioport_field::user_settings settings; diff --git a/src/frontend/mame/ui/ui.cpp b/src/frontend/mame/ui/ui.cpp index dd99faa9b63..21759412710 100644 --- a/src/frontend/mame/ui/ui.cpp +++ b/src/frontend/mame/ui/ui.cpp @@ -1657,9 +1657,9 @@ std::vector<ui::menu_item> mame_ui_manager::slider_init(running_machine &machine // add analog adjusters int slider_index = 0; - for (ioport_port &port : machine.ioport().ports()) + for (auto &port : machine.ioport().ports()) { - for (ioport_field &field : port.fields()) + for (ioport_field &field : port.second->fields()) { if (field.type() == IPT_ADJUSTER) { @@ -1763,9 +1763,9 @@ std::vector<ui::menu_item> mame_ui_manager::slider_init(running_machine &machine #ifdef MAME_DEBUG slider_index = 0; // add crosshair adjusters - for (ioport_port &port : machine.ioport().ports()) + for (auto &port : machine.ioport().ports()) { - for (ioport_field &field : port.fields()) + for (ioport_field &field : port.second->fields()) { if (field.crosshair_axis() != CROSSHAIR_AXIS_NONE && field.player() == 0) { |