diff options
-rw-r--r-- | src/emu/softlist.cpp | 78 | ||||
-rw-r--r-- | src/emu/softlist.h | 53 | ||||
-rw-r--r-- | src/frontend/mame/audit.cpp | 2 | ||||
-rw-r--r-- | src/frontend/mame/clifront.cpp | 18 | ||||
-rw-r--r-- | src/frontend/mame/ui/imgcntrl.cpp | 2 | ||||
-rw-r--r-- | src/frontend/mame/ui/inifile.cpp | 4 | ||||
-rw-r--r-- | src/frontend/mame/ui/selsoft.cpp | 12 | ||||
-rw-r--r-- | src/frontend/mame/ui/swlist.cpp | 4 |
8 files changed, 104 insertions, 69 deletions
diff --git a/src/emu/softlist.cpp b/src/emu/softlist.cpp index 647a2198ed3..62e6feeecaa 100644 --- a/src/emu/softlist.cpp +++ b/src/emu/softlist.cpp @@ -21,7 +21,7 @@ // TYPE DEFINITIONS //************************************************************************** -typedef std::unordered_map<std::string,software_info *> softlist_map; +typedef std::unordered_map<std::string,const software_info *> softlist_map; // ======================> softlist_parser @@ -95,6 +95,34 @@ const device_type SOFTWARE_LIST = &device_creator<software_list_device>; //************************************************************************** +// FEATURE LIST ITEM +//************************************************************************** + +//------------------------------------------------- +// feature_list_item - constructor +//------------------------------------------------- + +feature_list_item::feature_list_item(const std::string &name, const std::string &value) + : m_next(nullptr), + m_name(name), + m_value(value) +{ +} + + +//------------------------------------------------- +// feature_list_item - constructor +//------------------------------------------------- + +feature_list_item::feature_list_item(std::string &&name, std::string &&value) + : m_next(nullptr), + m_name(std::move(name)), + m_value(std::move(value)) +{ +} + + +//************************************************************************** // SOFTWARE PART //************************************************************************** @@ -263,7 +291,7 @@ const software_part *software_info::find_part(const char *partname, const char * if (partname != nullptr && strlen(partname)==0) partname = nullptr; if (partname == nullptr && interface == nullptr) - return m_partdata.first(); + return &m_partdata.front(); // look for the part by name and match against the interface if provided for (const software_part &part : m_partdata) @@ -289,7 +317,7 @@ bool software_info::has_multiple_parts(const char *interface) const int count = 0; // increment the count for each match and stop if we hit more than 1 - for (software_part &part : m_partdata) + for (const software_part &part : m_partdata) if (part.matches_interface(interface)) if (++count > 1) return true; @@ -374,8 +402,8 @@ void software_list_device::find_approx_matches(const char *name, int matches, co // iterate over our info (will cause a parse if needed) for (const software_info &swinfo : get_info()) { - const software_part *part = swinfo.first_part(); - if ((interface == nullptr || part->matches_interface(interface)) && part->is_compatible(*this) == SOFTWARE_IS_COMPATIBLE) + const software_part &part = swinfo.parts().front(); + if ((interface == nullptr || part.matches_interface(interface)) && part.is_compatible(*this) == SOFTWARE_IS_COMPATIBLE) { // pick the best match between driver name and description int longpenalty = driver_list::penalty_compare(name, swinfo.longname().c_str()); @@ -413,7 +441,7 @@ void software_list_device::release() m_parsed = false; m_description.clear(); m_errors.clear(); - m_infolist.reset(); + m_infolist.clear(); } @@ -481,7 +509,7 @@ void software_list_device::display_matches(const machine_config &config, const c // from an intermediate point //------------------------------------------------- -const software_info *software_list_device::find(const char *look_for, const software_info *prev) +const software_info *software_list_device::find(const char *look_for) { // nullptr search returns nothing if (look_for == nullptr) @@ -490,11 +518,13 @@ const software_info *software_list_device::find(const char *look_for, const soft bool iswild = strchr(look_for, '*') != nullptr || strchr(look_for, '?'); // find a match (will cause a parse if needed when calling get_info) - for (prev = (prev != nullptr) ? prev->next() : get_info().first(); prev != nullptr; prev = prev->next()) - if ((iswild && core_strwildcmp(look_for, prev->shortname().c_str()) == 0) || core_stricmp(look_for, prev->shortname().c_str()) == 0) - break; + for (const software_info &info : get_info()) + { + if ((iswild && core_strwildcmp(look_for, info.shortname().c_str()) == 0) || core_stricmp(look_for, info.shortname().c_str()) == 0) + return &info; + } - return prev; + return nullptr; } @@ -561,7 +591,7 @@ void software_list_device::internal_validity_check(validity_checker &valid) softlist_map names; softlist_map descriptions; - for (software_info &swinfo : get_info()) + for (const software_info &swinfo : get_info()) { // first parse and output core errors if any if (m_errors.length() > 0) @@ -605,7 +635,7 @@ void software_list_device::internal_validity_check(validity_checker &valid) // check for duplicate names if (!names.insert(std::make_pair(swinfo.shortname(), &swinfo)).second) { - software_info *match = names.find(swinfo.shortname())->second; + const software_info *match = names.find(swinfo.shortname())->second; osd_printf_error("%s: %s is a duplicate name (%s)\n", filename(), swinfo.shortname().c_str(), match->shortname().c_str()); } @@ -647,7 +677,7 @@ void software_list_device::internal_validity_check(validity_checker &valid) } softlist_map part_names; - for (software_part &part : swinfo.parts()) + for (const software_part &part : swinfo.parts()) { if (part.interface().empty()) osd_printf_error("%s: %s has a part (%s) without interface\n", filename(), swinfo.shortname().c_str(), part.name().c_str()); @@ -940,7 +970,10 @@ void softlist_parser::parse_main_start(const char *tagname, const char **attribu auto attrvalues = parse_attributes(attributes, attrnames); if (!attrvalues[0].empty()) - m_current_info = &m_list.m_infolist.append(*global_alloc(software_info(m_list, std::move(attrvalues[0]), std::move(attrvalues[1]), attrvalues[2].c_str()))); + { + m_list.m_infolist.emplace_back(m_list, std::move(attrvalues[0]), std::move(attrvalues[1]), attrvalues[2].c_str()); + m_current_info = &m_list.m_infolist.back(); + } else parse_error("No name defined for item"); } @@ -982,7 +1015,7 @@ void softlist_parser::parse_soft_start(const char *tagname, const char **attribu auto attrvalues = parse_attributes(attributes, attrnames); if (!attrvalues[0].empty() && !attrvalues[1].empty()) - m_current_info->m_other_info.append(*global_alloc(feature_list_item(std::move(attrvalues[0]), std::move(attrvalues[1])))); + m_current_info->m_other_info.emplace_back(std::move(attrvalues[0]), std::move(attrvalues[1])); else parse_error("Incomplete other_info definition"); } @@ -994,7 +1027,7 @@ void softlist_parser::parse_soft_start(const char *tagname, const char **attribu auto attrvalues = parse_attributes(attributes, attrnames); if (!attrvalues[0].empty() && !attrvalues[1].empty()) - m_current_info->m_shared_info.append(*global_alloc(feature_list_item(std::move(attrvalues[0]), std::move(attrvalues[1])))); + m_current_info->m_shared_info.emplace_back(std::move(attrvalues[0]), std::move(attrvalues[1])); else parse_error("Incomplete sharedfeat definition"); } @@ -1006,7 +1039,10 @@ void softlist_parser::parse_soft_start(const char *tagname, const char **attribu auto attrvalues = parse_attributes(attributes, attrnames); if (!attrvalues[0].empty() && !attrvalues[1].empty()) - m_current_part = &m_current_info->m_partdata.append(*global_alloc(software_part(*m_current_info, std::move(attrvalues[0]), std::move(attrvalues[1])))); + { + m_current_info->m_partdata.emplace_back(*m_current_info, std::move(attrvalues[0]), std::move(attrvalues[1])); + m_current_part = &m_current_info->m_partdata.back(); + } else parse_error("Incomplete part definition"); } @@ -1090,7 +1126,7 @@ void softlist_parser::parse_part_start(const char *tagname, const char **attribu auto attrvalues = parse_attributes(attributes, attrnames); if (!attrvalues[0].empty()) - m_current_part->m_featurelist.append(*global_alloc(feature_list_item(std::move(attrvalues[0]), std::move(attrvalues[1])))); + m_current_part->m_featurelist.emplace_back(std::move(attrvalues[0]), std::move(attrvalues[1])); else parse_error("Incomplete feature definition"); } @@ -1258,7 +1294,7 @@ void softlist_parser::parse_soft_end(const char *tagname) // get the info; if present, copy shared data (we assume name/value strings live // in the string pool and don't need to be reallocated) if (m_current_info != nullptr) - for (feature_list_item &item : m_current_info->shared_info()) - m_current_part->m_featurelist.append(*global_alloc(feature_list_item(item.name(), item.value()))); + for (const feature_list_item &item : m_current_info->shared_info()) + m_current_part->m_featurelist.emplace_back(item.name(), item.value()); } } diff --git a/src/emu/softlist.h b/src/emu/softlist.h index c0356e5ce4d..e6b649c7a5f 100644 --- a/src/emu/softlist.h +++ b/src/emu/softlist.h @@ -78,19 +78,14 @@ enum software_compatibility // an item in a list of name/value pairs class feature_list_item { - friend class simple_list<feature_list_item>; - public: // construction/destruction - feature_list_item(std::string &&name, std::string &&value) - : m_next(nullptr), - m_name(std::move(name)), - m_value(std::move(value)) { } - - feature_list_item(const std::string &name, const std::string &value) - : m_next(nullptr), - m_name(name), - m_value(value) { } + feature_list_item(std::string &&name, std::string &&value); + feature_list_item(const std::string &name, const std::string &value); + feature_list_item(feature_list_item const &) = delete; + feature_list_item(feature_list_item &&) = delete; + feature_list_item& operator=(feature_list_item const &) = delete; + feature_list_item& operator=(feature_list_item &&) = delete; // getters feature_list_item *next() const { return m_next; } @@ -111,18 +106,21 @@ private: class software_part { friend class softlist_parser; - friend class simple_list<software_part>; public: // construction/destruction software_part(software_info &info, std::string &&name, std::string &&interface); + software_part(software_part const &) = delete; + software_part(software_part &&) = delete; + software_part& operator=(software_part const &) = delete; + software_part& operator=(software_part &&) = delete; // getters software_part *next() const { return m_next; } software_info &info() const { return m_info; } const std::string &name() const { return m_name; } const std::string &interface() const { return m_interface; } - const simple_list<feature_list_item> &featurelist() const { return m_featurelist; } + const std::list<feature_list_item> &featurelist() const { return m_featurelist; } const rom_entry *romdata(unsigned int index = 0) const { return (index < m_romdata.size()) ? &m_romdata[index] : nullptr; } // helpers @@ -137,9 +135,8 @@ private: software_info & m_info; std::string m_name; std::string m_interface; - simple_list<feature_list_item> m_featurelist; + std::list<feature_list_item> m_featurelist; std::vector<rom_entry> m_romdata; - std::vector<std::string> m_romdata_strings; }; @@ -149,11 +146,14 @@ private: class software_info { friend class softlist_parser; - friend class simple_list<software_info>; public: // construction/destruction software_info(software_list_device &list, std::string &&name, std::string &&parent, const char *supported); + software_info(software_info const &) = delete; + software_info(software_info &&) = delete; + software_info& operator=(software_info const &) = delete; + software_info& operator=(software_info &&) = delete; // getters software_info *next() const { return m_next; } @@ -163,11 +163,10 @@ public: const std::string &parentname() const { return m_parentname; } const std::string &year() const { return m_year; } const std::string &publisher() const { return m_publisher; } - const simple_list<feature_list_item> &other_info() const { return m_other_info; } - const simple_list<feature_list_item> &shared_info() const { return m_shared_info; } + const std::list<feature_list_item> &other_info() const { return m_other_info; } + const std::list<feature_list_item> &shared_info() const { return m_shared_info; } UINT32 supported() const { return m_supported; } - const simple_list<software_part> &parts() const { return m_partdata; } - const software_part *first_part() const { return m_partdata.first(); } + const std::list<software_part> &parts() const { return m_partdata; } // additional operations const software_part *find_part(const char *partname, const char *interface = nullptr) const; @@ -183,10 +182,10 @@ private: std::string m_parentname; std::string m_year; // Copyright year on title screen, actual release dates can be tracked in external resources std::string m_publisher; - simple_list<feature_list_item> m_other_info; // Here we store info like developer, serial #, etc. which belong to the software entry as a whole - simple_list<feature_list_item> m_shared_info; // Here we store info like TV standard compatibility, or add-on requirements, etc. which get inherited + std::list<feature_list_item> m_other_info; // Here we store info like developer, serial #, etc. which belong to the software entry as a whole + std::list<feature_list_item> m_shared_info; // Here we store info like TV standard compatibility, or add-on requirements, etc. which get inherited // by each part of this software entry (after loading these are stored in partdata->featurelist) - simple_list<software_part> m_partdata; + std::list<software_part> m_partdata; }; @@ -213,12 +212,12 @@ public: // getters that may trigger a parse const char *description() { if (!m_parsed) parse(); return m_description.c_str(); } - bool valid() { if (!m_parsed) parse(); return m_infolist.count() > 0; } + bool valid() { if (!m_parsed) parse(); return !m_infolist.empty(); } const char *errors_string() { if (!m_parsed) parse(); return m_errors.c_str(); } - const simple_list<software_info> &get_info() { if (!m_parsed) parse(); return m_infolist; } + const std::list<software_info> &get_info() { if (!m_parsed) parse(); return m_infolist; } // operations - const software_info *find(const char *look_for, const software_info *prev = nullptr); + const software_info *find(const char *look_for); void find_approx_matches(const char *name, int matches, const software_info **list, const char *interface); void release(); @@ -248,7 +247,7 @@ protected: emu_file m_file; std::string m_description; std::string m_errors; - simple_list<software_info> m_infolist; + std::list<software_info> m_infolist; const_string_pool m_stringpool; }; diff --git a/src/frontend/mame/audit.cpp b/src/frontend/mame/audit.cpp index b551ed4d666..c5fe77a254a 100644 --- a/src/frontend/mame/audit.cpp +++ b/src/frontend/mame/audit.cpp @@ -170,7 +170,7 @@ media_auditor::summary media_auditor::audit_software(const char *list_name, cons std::size_t required = 0; // now iterate over software parts - for (software_part &part : swinfo->parts()) + for (const software_part &part : swinfo->parts()) audit_regions(part.romdata(), locationtag.c_str(), found, required); if ((found == 0) && (required > 0)) diff --git a/src/frontend/mame/clifront.cpp b/src/frontend/mame/clifront.cpp index 06834d3c2c2..5f73c8ddea0 100644 --- a/src/frontend/mame/clifront.cpp +++ b/src/frontend/mame/clifront.cpp @@ -372,8 +372,8 @@ int media_identifier::find_by_hash(const hash_collection &hashes, int length) { if (listnames.insert(swlistdev.list_name()).second) { - for (software_info &swinfo : swlistdev.get_info()) - for (software_part &part : swinfo.parts()) + for (const software_info &swinfo : swlistdev.get_info()) + for (const software_part &part : swinfo.parts()) for (const rom_entry *region = part.romdata(); region != nullptr; region = rom_next_region(region)) for (const rom_entry *rom = rom_first_file(region); rom != nullptr; rom = rom_next_file(rom)) { @@ -524,7 +524,7 @@ int cli_frontend::execute(int argc, char **argv) if (swinfo != nullptr) { // loop through all parts - for (software_part &swpart : swinfo->parts()) + for (const software_part &swpart : swinfo->parts()) { // only load compatible software this way if (swpart.is_compatible(swlistdev) == SOFTWARE_IS_COMPATIBLE) @@ -1388,7 +1388,7 @@ void cli_frontend::verifysamples(const char *gamename) void cli_frontend::output_single_softlist(FILE *out, software_list_device &swlistdev) { fprintf(out, "\t<softwarelist name=\"%s\" description=\"%s\">\n", swlistdev.list_name(), xml_normalize_string(swlistdev.description())); - for (software_info &swinfo : swlistdev.get_info()) + for (const software_info &swinfo : swlistdev.get_info()) { fprintf(out, "\t\t<software name=\"%s\"", swinfo.shortname().c_str()); if (!swinfo.parentname().empty()) @@ -1402,10 +1402,10 @@ void cli_frontend::output_single_softlist(FILE *out, software_list_device &swlis fprintf(out, "\t\t\t<year>%s</year>\n", xml_normalize_string(swinfo.year().c_str())); fprintf(out, "\t\t\t<publisher>%s</publisher>\n", xml_normalize_string(swinfo.publisher().c_str())); - for (feature_list_item &flist : swinfo.other_info()) + for (const feature_list_item &flist : swinfo.other_info()) fprintf( out, "\t\t\t<info name=\"%s\" value=\"%s\"/>\n", flist.name().c_str(), xml_normalize_string( flist.value().c_str()) ); - for (software_part &part : swinfo.parts()) + for (const software_part &part : swinfo.parts()) { fprintf(out, "\t\t\t<part name=\"%s\"", part.name().c_str()); if (!part.interface().empty()) @@ -1413,7 +1413,7 @@ void cli_frontend::output_single_softlist(FILE *out, software_list_device &swlis fprintf(out, ">\n"); - for (feature_list_item &flist : part.featurelist()) + for (const feature_list_item &flist : part.featurelist()) fprintf(out, "\t\t\t\t<feature name=\"%s\" value=\"%s\" />\n", flist.name().c_str(), xml_normalize_string(flist.value().c_str())); /* TODO: display rom region information */ @@ -1574,7 +1574,7 @@ void cli_frontend::verifysoftware(const char *gamename) if (!swlistdev.get_info().empty()) { nrlists++; - for (software_info &swinfo : swlistdev.get_info()) + for (const software_info &swinfo : swlistdev.get_info()) { media_auditor::summary summary = auditor.audit_software(swlistdev.list_name(), &swinfo, AUDIT_VALIDATE_FAST); @@ -1667,7 +1667,7 @@ void cli_frontend::verifysoftlist(const char *gamename) matched++; // Get the actual software list contents - for (software_info &swinfo : swlistdev.get_info()) + for (const software_info &swinfo : swlistdev.get_info()) { media_auditor::summary summary = auditor.audit_software(swlistdev.list_name(), &swinfo, AUDIT_VALIDATE_FAST); diff --git a/src/frontend/mame/ui/imgcntrl.cpp b/src/frontend/mame/ui/imgcntrl.cpp index 806d6c682ec..ee93381d52a 100644 --- a/src/frontend/mame/ui/imgcntrl.cpp +++ b/src/frontend/mame/ui/imgcntrl.cpp @@ -220,7 +220,7 @@ void menu_control_device_image::handle() } else { - m_swp = m_swi->first_part(); + m_swp = &m_swi->parts().front(); load_software_part(); } break; diff --git a/src/frontend/mame/ui/inifile.cpp b/src/frontend/mame/ui/inifile.cpp index 531604465b4..fd93bb6d1f7 100644 --- a/src/frontend/mame/ui/inifile.cpp +++ b/src/frontend/mame/ui/inifile.cpp @@ -210,7 +210,7 @@ void favorite_manager::add_favorite_game() if (!swinfo->parentname().empty()) { auto swlist = software_list_device::find_by_name(machine().config(), image.software_list_name()); - for (software_info &c_swinfo : swlist->get_info()) + for (const software_info &c_swinfo : swlist->get_info()) { std::string c_parent(c_swinfo.parentname()); if (!c_parent.empty() && c_parent == swinfo->shortname()) @@ -222,7 +222,7 @@ void favorite_manager::add_favorite_game() } tmpmatches.usage.clear(); - for (feature_list_item &flist : swinfo->other_info()) + for (const feature_list_item &flist : swinfo->other_info()) if (!strcmp(flist.name().c_str(), "usage")) tmpmatches.usage = flist.value(); diff --git a/src/frontend/mame/ui/selsoft.cpp b/src/frontend/mame/ui/selsoft.cpp index 11a1d1551b5..dfb97546fe7 100644 --- a/src/frontend/mame/ui/selsoft.cpp +++ b/src/frontend/mame/ui/selsoft.cpp @@ -527,8 +527,8 @@ void menu_select_software::build_software_list() m_filter.swlist.description.push_back(swlist.description()); for (const software_info &swinfo : swlist.get_info()) { - const software_part *part = swinfo.first_part(); - if (part->is_compatible(swlist) == SOFTWARE_IS_COMPATIBLE) + const software_part &part = swinfo.parts().front(); + if (part.is_compatible(swlist) == SOFTWARE_IS_COMPATIBLE) { const char *instance_name = nullptr; const char *type_name = nullptr; @@ -536,7 +536,7 @@ void menu_select_software::build_software_list() for (device_image_interface &image : image_interface_iterator(config.root_device())) { const char *interface = image.image_interface(); - if (interface != nullptr && part->matches_interface(interface)) + if (interface != nullptr && part.matches_interface(interface)) { instance_name = image.instance_name(); if (instance_name != nullptr) @@ -558,16 +558,16 @@ void menu_select_software::build_software_list() tmpmatches.year = swinfo.year(); tmpmatches.publisher = swinfo.publisher(); tmpmatches.supported = swinfo.supported(); - tmpmatches.part = part->name(); + tmpmatches.part = part.name(); tmpmatches.driver = m_driver; tmpmatches.listname = strensure(swlist.list_name()); - tmpmatches.interface = part->interface(); + tmpmatches.interface = part.interface(); tmpmatches.startempty = 0; tmpmatches.parentlongname.clear(); tmpmatches.usage.clear(); tmpmatches.available = false; - for (feature_list_item &flist : swinfo.other_info()) + for (const feature_list_item &flist : swinfo.other_info()) if (!strcmp(flist.name().c_str(), "usage")) tmpmatches.usage = flist.value(); diff --git a/src/frontend/mame/ui/swlist.cpp b/src/frontend/mame/ui/swlist.cpp index 0aad599864b..b9a25a18535 100644 --- a/src/frontend/mame/ui/swlist.cpp +++ b/src/frontend/mame/ui/swlist.cpp @@ -364,7 +364,7 @@ void menu_software::populate() { bool found = false; for (const software_info &swinfo : swlistdev.get_info()) - if (swinfo.first_part()->matches_interface(m_interface)) + if (swinfo.parts().front().matches_interface(m_interface)) found = true; if (found) item_append(swlistdev.description(), "", 0, (void *)&swlistdev); @@ -377,7 +377,7 @@ void menu_software::populate() { bool found = false; for (const software_info &swinfo : swlistdev.get_info()) - if (swinfo.first_part()->matches_interface(m_interface)) + if (swinfo.parts().front().matches_interface(m_interface)) found = true; if (found) { |