summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--src/emu/softlist.cpp78
-rw-r--r--src/emu/softlist.h53
-rw-r--r--src/frontend/mame/audit.cpp2
-rw-r--r--src/frontend/mame/clifront.cpp18
-rw-r--r--src/frontend/mame/ui/imgcntrl.cpp2
-rw-r--r--src/frontend/mame/ui/inifile.cpp4
-rw-r--r--src/frontend/mame/ui/selsoft.cpp12
-rw-r--r--src/frontend/mame/ui/swlist.cpp4
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)
{