using std::vector<std::unique_ptr<xxx>> instead of simple_list<xxx> in cheat engine (nw)

This commit is contained in:
Miodrag Milanovic 2016-06-02 20:21:11 +02:00
parent fd02f044b5
commit dcc93232db
4 changed files with 76 additions and 95 deletions

View File

@ -156,10 +156,12 @@ cheat_parameter::cheat_parameter(cheat_manager &manager, symbol_table &symbols,
int format = xml_get_attribute_int_format(itemnode, "value");
// allocate and append a new item
item &curitem = m_itemlist.append(*global_alloc(item(itemnode->value, value, format)));
auto curitem = std::make_unique<item>(itemnode->value, value, format);
// ensure the maximum expands to suit
m_maxval = MAX(m_maxval, curitem.value());
m_maxval = MAX(m_maxval, curitem->value());
m_itemlist.push_back(std::move(curitem));
}
// add a variable to the symbol table for our value
@ -182,10 +184,10 @@ const char *cheat_parameter::text()
{
// if not, we're an item cheat
m_curtext = string_format("??? (%d)", UINT32(m_value));
for (item &curitem : m_itemlist)
if (curitem.value() == m_value)
for (auto &curitem : m_itemlist)
if (curitem->value() == m_value)
{
m_curtext.assign(curitem.text());
m_curtext.assign(curitem->text());
break;
}
}
@ -217,8 +219,8 @@ void cheat_parameter::save(emu_file &cheatfile) const
// iterate over items
else
{
for (const item &curitem : m_itemlist)
cheatfile.printf("\t\t\t<item value=\"%s\">%s</item>\n", curitem.value().format().c_str(), curitem.text());
for (auto &curitem : m_itemlist)
cheatfile.printf("\t\t\t<item value=\"%s\">%s</item>\n", curitem->value().format().c_str(), curitem->text());
cheatfile.printf("\t\t</parameter>\n");
}
}
@ -233,7 +235,7 @@ bool cheat_parameter::set_minimum_state()
UINT64 origvalue = m_value;
// set based on whether we have an item list
m_value = (!has_itemlist()) ? m_minval : m_itemlist.first()->value();
m_value = (!has_itemlist()) ? m_minval : m_itemlist.front()->value();
return (m_value != origvalue);
}
@ -259,10 +261,12 @@ bool cheat_parameter::set_prev_state()
// if not, we're an item cheat
else
{
item *curitem, *previtem = nullptr;
for (curitem = m_itemlist.first(); curitem != nullptr; previtem = curitem, curitem = curitem->next())
item *previtem = nullptr;
for (auto &curitem : m_itemlist) {
if (curitem->value() == m_value)
break;
previtem = curitem.get();
}
if (previtem != nullptr)
m_value = previtem->value();
}
@ -291,12 +295,12 @@ bool cheat_parameter::set_next_state()
// if not, we're an item cheat
else
{
item *curitem;
for (curitem = m_itemlist.first(); curitem != nullptr; curitem = curitem->next())
if (curitem->value() == m_value)
std::vector<std::unique_ptr<item>>::iterator it;
for (it = m_itemlist.begin(); it != m_itemlist.end(); ++it)
if (it->get()->value() == m_value)
break;
if (curitem != nullptr && curitem->next() != nullptr)
m_value = curitem->next()->value();
if (it != m_itemlist.end() && (++it != m_itemlist.end()))
m_value = (++it)->get()->value();
}
return (m_value != origvalue);
@ -331,11 +335,11 @@ cheat_script::cheat_script(cheat_manager &manager, symbol_table &symbols, const
{
// handle action nodes
if (strcmp(entrynode->name, "action") == 0)
m_entrylist.append(*global_alloc(script_entry(manager, symbols, filename, *entrynode, true)));
m_entrylist.push_back(std::make_unique<script_entry>(manager, symbols, filename, *entrynode, true));
// handle output nodes
else if (strcmp(entrynode->name, "output") == 0)
m_entrylist.append(*global_alloc(script_entry(manager, symbols, filename, *entrynode, false)));
m_entrylist.push_back(std::make_unique<script_entry>(manager, symbols, filename, *entrynode, false));
// anything else is ignored
else
@ -358,8 +362,8 @@ void cheat_script::execute(cheat_manager &manager, UINT64 &argindex)
return;
// iterate over entries
for (script_entry &entry : m_entrylist)
entry.execute(manager, argindex);
for (auto &entry : m_entrylist)
entry->execute(manager, argindex);
}
@ -382,8 +386,8 @@ void cheat_script::save(emu_file &cheatfile) const
cheatfile.printf(">\n");
// output entries
for (const script_entry &entry : m_entrylist)
entry.save(cheatfile);
for (auto &entry : m_entrylist)
entry->save(cheatfile);
// close the tag
cheatfile.printf("\t\t</script>\n");
@ -395,9 +399,8 @@ void cheat_script::save(emu_file &cheatfile) const
//-------------------------------------------------
cheat_script::script_entry::script_entry(cheat_manager &manager, symbol_table &symbols, const char *filename, xml_data_node &entrynode, bool isaction)
: m_next(nullptr),
m_condition(&symbols),
m_expression(&symbols)
: m_condition(&symbols),
m_expression(&symbols)
{
const char *expression = nullptr;
try
@ -440,10 +443,12 @@ cheat_script::script_entry::script_entry(cheat_manager &manager, symbol_table &s
int totalargs = 0;
for (xml_data_node *argnode = xml_get_sibling(entrynode.child, "argument"); argnode != nullptr; argnode = xml_get_sibling(argnode->next, "argument"))
{
output_argument &curarg = m_arglist.append(*global_alloc(output_argument(manager, symbols, filename, *argnode)));
auto curarg = std::make_unique<output_argument>(manager, symbols, filename, *argnode);
// verify we didn't overrun the argument count
totalargs += curarg.count();
totalargs += curarg->count();
m_arglist.push_back(std::move(curarg));
if (totalargs > MAX_ARGUMENTS)
throw emu_fatalerror("%s.xml(%d): too many arguments (found %d, max is %d)\n", filename, argnode->line, totalargs, MAX_ARGUMENTS);
}
@ -500,8 +505,8 @@ void cheat_script::script_entry::execute(cheat_manager &manager, UINT64 &arginde
// iterate over arguments and evaluate them
UINT64 params[MAX_ARGUMENTS];
int curarg = 0;
for (output_argument &arg : m_arglist)
curarg += arg.values(argindex, &params[curarg]);
for (auto &arg : m_arglist)
curarg += arg->values(argindex, &params[curarg]);
// generate the astring
manager.get_output_astring(m_line, m_justify) = string_format(m_format,
@ -544,15 +549,15 @@ void cheat_script::script_entry::save(emu_file &cheatfile) const
cheatfile.printf(" align=\"center\"");
else if (m_justify == JUSTIFY_RIGHT)
cheatfile.printf(" align=\"right\"");
if (m_arglist.count() == 0)
if (m_arglist.size() == 0)
cheatfile.printf(" />\n");
// output arguments
else
{
cheatfile.printf(">\n");
for (const output_argument &curarg : m_arglist)
curarg.save(cheatfile);
for (auto &curarg : m_arglist)
curarg->save(cheatfile);
cheatfile.printf("\t\t\t</output>\n");
}
}
@ -568,8 +573,8 @@ void cheat_script::script_entry::validate_format(const char *filename, int line)
{
// first count arguments
int argsprovided = 0;
for (const output_argument &curarg : m_arglist)
argsprovided += curarg.count();
for (auto &curarg : m_arglist)
argsprovided += curarg->count();
// now scan the string for valid argument usage
const char *p = strchr(m_format.c_str(), '%');
@ -603,9 +608,8 @@ void cheat_script::script_entry::validate_format(const char *filename, int line)
//-------------------------------------------------
cheat_script::script_entry::output_argument::output_argument(cheat_manager &manager, symbol_table &symbols, const char *filename, xml_data_node &argnode)
: m_next(nullptr),
m_expression(&symbols),
m_count(0)
: m_expression(&symbols),
m_count(0)
{
// first extract attributes
m_count = xml_get_attribute_int(&argnode, "count", 1);
@ -673,7 +677,6 @@ void cheat_script::script_entry::output_argument::save(emu_file &cheatfile) cons
cheat_entry::cheat_entry(cheat_manager &manager, symbol_table &globaltable, const char *filename, xml_data_node &cheatnode)
: m_manager(manager),
m_next(nullptr),
m_symbols(&manager.machine(), &globaltable),
m_state(SCRIPT_STATE_OFF),
m_numtemp(DEFAULT_TEMP_VARIABLES),
@ -1034,8 +1037,8 @@ std::unique_ptr<cheat_script> &cheat_entry::script_for_state(script_state state)
bool cheat_entry::is_duplicate() const
{
for (cheat_entry &scannode : manager().entries())
if (strcmp(scannode.description(), description()) == 0)
for (auto &scannode : manager().entries())
if (strcmp(scannode->description(), description()) == 0)
return true;
return false;
}
@ -1100,9 +1103,9 @@ void cheat_manager::set_enable(bool enable)
if (!m_disabled && !enable)
{
// iterate over running cheats and execute any OFF Scripts
for (cheat_entry &cheat : m_cheatlist)
if (cheat.state() == SCRIPT_STATE_RUN)
cheat.execute_off_script();
for (auto &cheat : m_cheatlist)
if (cheat->state() == SCRIPT_STATE_RUN)
cheat->execute_off_script();
machine().popmessage("Cheats Disabled");
m_disabled = true;
}
@ -1112,9 +1115,9 @@ void cheat_manager::set_enable(bool enable)
{
// iterate over running cheats and execute any ON Scripts
m_disabled = false;
for (cheat_entry &cheat : m_cheatlist)
if (cheat.state() == SCRIPT_STATE_RUN)
cheat.execute_on_script();
for (auto &cheat : m_cheatlist)
if (cheat->state() == SCRIPT_STATE_RUN)
cheat->execute_on_script();
machine().popmessage("Cheats Enabled");
}
}
@ -1132,7 +1135,7 @@ void cheat_manager::reload()
return;
// free everything
m_cheatlist.reset();
m_cheatlist.clear();
// reset state
m_framecount = 0;
@ -1166,11 +1169,11 @@ void cheat_manager::reload()
}
// if we haven't found the cheats yet, load by basename
if (m_cheatlist.count() == 0)
if (m_cheatlist.size() == 0)
load_cheats(machine().basename());
// temporary: save the file back out as output.xml for comparison
if (m_cheatlist.count() != 0)
if (m_cheatlist.size() != 0)
save_all("output");
}
@ -1199,8 +1202,8 @@ bool cheat_manager::save_all(const char *filename)
cheatfile.printf("<mamecheat version=\"%d\">\n", CHEAT_VERSION);
// iterate over cheats in the list and save them
for (cheat_entry &cheat : m_cheatlist)
cheat.save(cheatfile);
for (auto &cheat : m_cheatlist)
cheat->save(cheatfile);
// close out the file
cheatfile.printf("</mamecheat>\n");
@ -1358,8 +1361,8 @@ void cheat_manager::frame_update()
elem.clear();
// iterate over running cheats and execute them
for (cheat_entry &cheat : m_cheatlist)
cheat.frame_update();
for (auto &cheat : m_cheatlist)
cheat->frame_update();
// increment the frame counter
m_framecount++;
@ -1416,16 +1419,15 @@ void cheat_manager::load_cheats(const char *filename)
for (xml_data_node *cheatnode = xml_get_sibling(mamecheatnode->child, "cheat"); cheatnode != nullptr; cheatnode = xml_get_sibling(cheatnode->next, "cheat"))
{
// load this entry
cheat_entry *curcheat = global_alloc(cheat_entry(*this, m_symtable, filename, *cheatnode));
auto curcheat = std::make_unique<cheat_entry>(*this, m_symtable, filename, *cheatnode);
// make sure we're not a duplicate
if (REMOVE_DUPLICATE_CHEATS && curcheat->is_duplicate())
{
osd_printf_verbose("Ignoring duplicate cheat '%s' from file %s\n", curcheat->description(), cheatfile.fullpath());
global_free(curcheat);
}
else // add to the end of the list
m_cheatlist.append(*curcheat);
m_cheatlist.push_back(std::move(curcheat));
}
// free the file and loop for the next one
@ -1440,7 +1442,7 @@ void cheat_manager::load_cheats(const char *filename)
catch (emu_fatalerror &err)
{
osd_printf_error("%s\n", err.string());
m_cheatlist.reset();
m_cheatlist.clear();
if (rootnode != nullptr)
xml_file_free(rootnode);
}

View File

@ -76,9 +76,9 @@ public:
// queries
const char *text();
bool has_itemlist() const { return (m_itemlist.count() != 0); }
bool is_minimum() const { return (m_value == ((m_itemlist.count() == 0) ? m_minval : m_itemlist.first()->value())); }
bool is_maximum() const { return (m_value == ((m_itemlist.count() == 0) ? m_maxval : m_itemlist.last()->value())); }
bool has_itemlist() const { return (m_itemlist.size() != 0); }
bool is_minimum() const { return (m_value == ((m_itemlist.size() == 0) ? m_minval : m_itemlist.front()->value())); }
bool is_maximum() const { return (m_value == ((m_itemlist.size() == 0) ? m_maxval : m_itemlist.back()->value())); }
// state setters
bool set_minimum_state();
@ -92,23 +92,18 @@ private:
// a single item in a parameter item list
class item
{
friend class simple_list<item>;
public:
// construction/destruction
item(const char *text, UINT64 value, int valformat)
: m_next(nullptr),
m_text(text),
m_value(value, valformat) { }
: m_text(text),
m_value(value, valformat) { }
// getters
item *next() const { return m_next; }
const number_and_format &value() const { return m_value; }
const char *text() const { return m_text.c_str(); }
private:
// internal state
item * m_next; // next item in list
std::string m_text; // name of the item
number_and_format m_value; // value of the item
};
@ -119,7 +114,7 @@ private:
number_and_format m_stepval; // step value
UINT64 m_value; // live value of the parameter
std::string m_curtext; // holding for a value string
simple_list<item> m_itemlist; // list of items
std::vector<std::unique_ptr<item>> m_itemlist; // list of items
};
@ -128,8 +123,6 @@ private:
// a script entry, specifying which state to execute under
class cheat_script
{
friend class simple_list<cheat_script>;
public:
// construction/destruction
cheat_script(cheat_manager &manager, symbol_table &symbols, const char *filename, xml_data_node &scriptnode);
@ -145,15 +138,10 @@ private:
// an entry within the script
class script_entry
{
friend class simple_list<script_entry>;
public:
// construction/destruction
script_entry(cheat_manager &manager, symbol_table &symbols, const char *filename, xml_data_node &entrynode, bool isaction);
// getters
script_entry *next() const { return m_next; }
// actions
void execute(cheat_manager &manager, UINT64 &argindex);
void save(emu_file &cheatfile) const;
@ -162,14 +150,11 @@ private:
// an argument for output
class output_argument
{
friend class simple_list<output_argument>;
public:
// construction/destruction
output_argument(cheat_manager &manager, symbol_table &symbols, const char *filename, xml_data_node &argnode);
// getters
output_argument *next() const { return m_next; }
int count() const { return m_count; }
int values(UINT64 &argindex, UINT64 *result);
@ -178,7 +163,6 @@ private:
private:
// internal state
output_argument * m_next; // link to next argument
parsed_expression m_expression; // expression for argument
UINT64 m_count; // number of repetitions
};
@ -187,11 +171,10 @@ private:
void validate_format(const char *filename, int line);
// internal state
script_entry * m_next; // link to next entry
parsed_expression m_condition; // condition under which this is executed
parsed_expression m_expression; // expression to execute
std::string m_format; // string format to print
simple_list<output_argument> m_arglist; // list of arguments
std::vector<std::unique_ptr<output_argument>> m_arglist; // list of arguments
INT8 m_line; // which line to print on
UINT8 m_justify; // justification when printing
@ -200,7 +183,7 @@ private:
};
// internal state
simple_list<script_entry> m_entrylist; // list of actions to perform
std::vector<std::unique_ptr<script_entry>> m_entrylist; // list of actions to perform
script_state m_state; // which state this script is for
};
@ -210,8 +193,6 @@ private:
// a single cheat
class cheat_entry
{
friend class simple_list<cheat_entry>;
public:
// construction/destruction
cheat_entry(cheat_manager &manager, symbol_table &globaltable, const char *filename, xml_data_node &cheatnode);
@ -219,7 +200,6 @@ public:
// getters
cheat_manager &manager() const { return m_manager; }
cheat_entry *next() const { return m_next; }
script_state state() const { return m_state; }
const char *description() const { return m_description.c_str(); }
const char *comment() const { return m_comment.c_str(); }
@ -265,7 +245,6 @@ private:
// internal state
cheat_manager & m_manager; // reference to our manager
cheat_entry * m_next; // next cheat entry
std::string m_description; // string description/menu title
std::string m_comment; // comment data
std::unique_ptr<cheat_parameter> m_parameter; // parameter
@ -295,7 +274,7 @@ public:
// getters
running_machine &machine() const { return m_machine; }
bool enabled() const { return !m_disabled; }
const simple_list<cheat_entry> &entries() const { return m_cheatlist; }
const std::vector<std::unique_ptr<cheat_entry>> &entries() const { return m_cheatlist; }
// setters
void set_enable(bool enable = true);
@ -320,7 +299,7 @@ private:
// internal state
running_machine & m_machine; // reference to our machine
simple_list<cheat_entry> m_cheatlist; // cheat list
std::vector<std::unique_ptr<cheat_entry>> m_cheatlist; // cheat list
UINT64 m_framecount; // frame count
std::vector<std::string> m_output; // array of output strings
std::vector<UINT8> m_justify; // justification for each string

View File

@ -605,8 +605,8 @@ luabridge::LuaRef lua_engine::l_cheat_get_entries(const cheat_manager *c)
luabridge::LuaRef entry_table = luabridge::LuaRef::newTable(L);
int cheatnum = 0;
for (cheat_entry &entry : cm->entries()) {
entry_table[cheatnum++] = &entry;
for (auto &entry : cm->entries()) {
entry_table[cheatnum++] = entry.get();
}
return entry_table;

View File

@ -52,8 +52,8 @@ void menu_cheat::handle()
/* handle reset all + reset all cheats for reload all option */
if ((menu_event->itemref == ITEMREF_CHEATS_RESET_ALL || menu_event->itemref == ITEMREF_CHEATS_RELOAD_ALL) && menu_event->iptkey == IPT_UI_SELECT)
{
for (cheat_entry &curcheat : mame_machine_manager::instance()->cheat().entries())
if (curcheat.select_default_state())
for (auto &curcheat : mame_machine_manager::instance()->cheat().entries())
if (curcheat->select_default_state())
changed = true;
}
@ -141,11 +141,11 @@ void menu_cheat::populate()
// add other cheats
if (!mame_machine_manager::instance()->cheat().entries().empty()) {
for (cheat_entry &curcheat : mame_machine_manager::instance()->cheat().entries())
for (auto &curcheat : mame_machine_manager::instance()->cheat().entries())
{
UINT32 flags;
curcheat.menu_text(text, subtext, flags);
item_append(text.c_str(), subtext.c_str(), flags, &curcheat);
curcheat->menu_text(text, subtext, flags);
item_append(text.c_str(), subtext.c_str(), flags, curcheat.get());
}
/* add a separator */