mirror of
https://github.com/holub/mame
synced 2025-04-27 10:43:07 +03:00
ioport tagged_list to unordered_map (nw)
This commit is contained in:
parent
cb9d158d57
commit
d705e4a28d
@ -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();
|
||||
|
@ -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());
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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())
|
||||
|
@ -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());
|
||||
}
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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++;
|
||||
|
@ -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;
|
||||
|
@ -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)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user