Removed manual memory management in CBrain in program list

master
krzys-h 2015-07-17 19:53:17 +02:00
parent 5e44092144
commit dffeff929e
3 changed files with 37 additions and 45 deletions

View File

@ -108,12 +108,6 @@ CBrain::CBrain(COldObject* object)
CBrain::~CBrain() CBrain::~CBrain()
{ {
for(auto x : m_program)
{
delete x->script;
x->script = nullptr;
delete x;
}
m_program.clear(); m_program.clear();
delete m_primaryTask; delete m_primaryTask;
@ -320,7 +314,7 @@ bool CBrain::EventProcess(const Event &event)
{ {
if(m_selScript < m_program.size()) if(m_selScript < m_program.size())
{ {
RunProgram(m_program[m_selScript]); RunProgram(m_program[m_selScript].get());
} }
} }
else else
@ -333,7 +327,7 @@ bool CBrain::EventProcess(const Event &event)
m_main->SaveOneScript(m_object); m_main->SaveOneScript(m_object);
if(m_selScript < m_program.size()) if(m_selScript < m_program.size())
{ {
RunProgram(m_program[m_selScript]); RunProgram(m_program[m_selScript].get());
} }
} }
if ( action == EVENT_OBJECT_PROGSTOP ) if ( action == EVENT_OBJECT_PROGSTOP )
@ -353,7 +347,7 @@ bool CBrain::EventProcess(const Event &event)
if( action == EVENT_STUDIO_CLONE ) if( action == EVENT_STUDIO_CLONE )
{ {
StopEditScript(false); StopEditScript(false);
Program* newProgram = CloneProgram(m_program[m_selScript]); Program* newProgram = CloneProgram(m_program[m_selScript].get());
m_selScript = m_program.size()-1; m_selScript = m_program.size()-1;
m_main->SaveOneScript(m_object); m_main->SaveOneScript(m_object);
@ -445,7 +439,7 @@ bool CBrain::EventProcess(const Event &event)
{ {
if(m_selScript < m_program.size()) if(m_selScript < m_program.size())
{ {
StartEditScript(m_program[m_selScript], m_main->GetScriptName()); StartEditScript(m_program[m_selScript].get(), m_main->GetScriptName());
} }
} }
@ -473,7 +467,7 @@ bool CBrain::EventProcess(const Event &event)
{ {
if(m_selScript < m_program.size()) if(m_selScript < m_program.size())
{ {
RemoveProgram(m_program[m_selScript]); RemoveProgram(m_program[m_selScript].get());
if(m_selScript >= m_program.size()) if(m_selScript >= m_program.size())
m_selScript = m_program.size()-1; m_selScript = m_program.size()-1;
m_main->SaveOneScript(m_object); m_main->SaveOneScript(m_object);
@ -492,7 +486,7 @@ bool CBrain::EventProcess(const Event &event)
{ {
if(m_selScript < m_program.size()) if(m_selScript < m_program.size())
{ {
CloneProgram(m_program[m_selScript]); CloneProgram(m_program[m_selScript].get());
m_selScript = m_program.size()-1; m_selScript = m_program.size()-1;
m_main->SaveOneScript(m_object); m_main->SaveOneScript(m_object);
@ -602,7 +596,7 @@ bool CBrain::EventProcess(const Event &event)
{ {
if(m_selScript < m_program.size()) if(m_selScript < m_program.size())
{ {
StartEditScript(m_program[m_selScript], m_main->GetScriptName()); StartEditScript(m_program[m_selScript].get(), m_main->GetScriptName());
} }
} }
@ -611,7 +605,7 @@ bool CBrain::EventProcess(const Event &event)
StopProgram(); // stops the current program StopProgram(); // stops the current program
if(m_selScript < m_program.size()) if(m_selScript < m_program.size())
{ {
RunProgram(m_program[m_selScript]); RunProgram(m_program[m_selScript].get());
} }
UpdateInterface(); UpdateInterface();
} }
@ -1056,7 +1050,7 @@ void CBrain::StartEditScript(Program* program, char* name)
CreateInterface(false); // removes the control buttons CreateInterface(false); // removes the control buttons
m_studio = new Ui::CStudio(); m_studio = new Ui::CStudio();
m_studio->StartEditScript(program->script, name, program); m_studio->StartEditScript(program->script.get(), name, program);
} }
// End of editing a program. // End of editing a program.
@ -2778,7 +2772,7 @@ int CBrain::GetProgram()
for(unsigned int i = 0; i < m_program.size(); i++) for(unsigned int i = 0; i < m_program.size(); i++)
{ {
if(m_program[i] == m_currentProgram) if(m_program[i].get() == m_currentProgram)
{ {
return i; return i;
} }
@ -2822,10 +2816,10 @@ bool CBrain::ReadSoluce(char* filename)
for(unsigned int i = 0; i < m_program.size(); i++) for(unsigned int i = 0; i < m_program.size(); i++)
{ {
if(m_program[i] == prog) continue; if(m_program[i].get() == prog) continue;
//TODO: This is bad. It's very sensitive to things like \n vs \r\n etc. //TODO: This is bad. It's very sensitive to things like \n vs \r\n etc.
if ( m_program[i]->script->Compare(prog->script) ) // the same already? if ( m_program[i]->script->Compare(prog->script.get()) ) // the same already?
{ {
m_program[i]->readOnly = true; // Mark is as read-only m_program[i]->readOnly = true; // Mark is as read-only
RemoveProgram(prog); RemoveProgram(prog);
@ -2910,7 +2904,7 @@ bool CBrain::WriteStack(FILE *file)
} }
const std::vector<Program*>& CBrain::GetPrograms() std::vector<std::unique_ptr<Program>>& CBrain::GetPrograms()
{ {
return m_program; return m_program;
} }
@ -3096,19 +3090,16 @@ bool CBrain::TraceRecordPut(std::stringstream& buffer, TraceOper oper, float par
Program* CBrain::AddProgram() Program* CBrain::AddProgram()
{ {
Program* program = new Program(); Program* program = new Program();
program->script = new CScript(m_object, &m_secondaryTask); program->script.reset(new CScript(m_object, &m_secondaryTask));
program->readOnly = false; program->readOnly = false;
program->runnable = true; program->runnable = true;
AddProgram(program); AddProgram(std::move(std::unique_ptr<Program>{program}));
return program; return program;
} }
bool CBrain::AddProgram(Program* program) void CBrain::AddProgram(std::unique_ptr<Program> program)
{ {
if(std::find(m_program.begin(), m_program.end(), program) != m_program.end()) m_program.push_back(std::move(program));
return false;
m_program.push_back(program);
if(m_object->GetSelect()) if(m_object->GetSelect())
{ {
@ -3119,7 +3110,6 @@ bool CBrain::AddProgram(Program* program)
UpdateScript(pw); UpdateScript(pw);
} }
} }
return true;
} }
void CBrain::RemoveProgram(Program* program) void CBrain::RemoveProgram(Program* program)
@ -3128,10 +3118,10 @@ void CBrain::RemoveProgram(Program* program)
{ {
StopProgram(); StopProgram();
} }
m_program.erase(std::remove(m_program.begin(), m_program.end(), program), m_program.end()); m_program.erase(
delete program->script; std::remove_if(m_program.begin(), m_program.end(),
program->script = nullptr; [program](std::unique_ptr<Program>& prog) { return prog.get() == program; }),
delete program; m_program.end());
if(m_object->GetSelect()) if(m_object->GetSelect())
{ {
@ -3162,7 +3152,7 @@ int CBrain::GetProgramIndex(Program* program)
{ {
for(unsigned int i = 0; i < m_program.size(); i++) for(unsigned int i = 0; i < m_program.size(); i++)
{ {
if(m_program[i] == program) if(m_program[i].get() == program)
{ {
return i; return i;
} }
@ -3175,7 +3165,7 @@ Program* CBrain::GetProgram(int index)
if(index < 0 || index >= static_cast<int>(m_program.size())) if(index < 0 || index >= static_cast<int>(m_program.size()))
return nullptr; return nullptr;
return m_program[index]; return m_program[index].get();
} }
Program* CBrain::GetOrAddProgram(int index) Program* CBrain::GetOrAddProgram(int index)
@ -3184,7 +3174,7 @@ Program* CBrain::GetOrAddProgram(int index)
return nullptr; return nullptr;
if(index < static_cast<int>(m_program.size())) if(index < static_cast<int>(m_program.size()))
return m_program[index]; return m_program[index].get();
for(int i = m_program.size(); i < index; i++) for(int i = m_program.size(); i < index; i++)
{ {

View File

@ -35,6 +35,7 @@
#include <vector> #include <vector>
#include <sstream> #include <sstream>
#include <memory>
class COldObject; class COldObject;
class CPhysics; class CPhysics;
@ -78,7 +79,7 @@ struct TraceRecord
struct Program struct Program
{ {
CScript* script; std::unique_ptr<CScript> script;
std::string filename; std::string filename;
bool readOnly; bool readOnly;
bool runnable; bool runnable;
@ -128,7 +129,7 @@ public:
bool WriteProgram(Program* program, const char* filename); bool WriteProgram(Program* program, const char* filename);
bool ReadStack(FILE *file); bool ReadStack(FILE *file);
bool WriteStack(FILE *file); bool WriteStack(FILE *file);
const std::vector<Program*>& GetPrograms(); std::vector<std::unique_ptr<Program>>& GetPrograms();
Error StartTaskTake(); Error StartTaskTake();
Error StartTaskManip(TaskManipOrder order, TaskManipArm arm); Error StartTaskManip(TaskManipOrder order, TaskManipArm arm);
@ -148,7 +149,7 @@ public:
void UpdateInterface(); void UpdateInterface();
Program* AddProgram(); Program* AddProgram();
bool AddProgram(Program* program); void AddProgram(std::unique_ptr<Program> program);
void RemoveProgram(Program* program); void RemoveProgram(Program* program);
Program* CloneProgram(Program* program); Program* CloneProgram(Program* program);
@ -207,7 +208,7 @@ protected:
CTaskManager* m_primaryTask; CTaskManager* m_primaryTask;
CTaskManager* m_secondaryTask; CTaskManager* m_secondaryTask;
std::vector<Program*> m_program; std::vector<std::unique_ptr<Program>> m_program;
Program* m_currentProgram; Program* m_currentProgram;
unsigned int m_selScript; // rank of the selected script unsigned int m_selScript; // rank of the selected script

View File

@ -4537,9 +4537,10 @@ void CRobotMain::CompileScript(bool soluce)
if (! obj->Implements(ObjectInterfaceType::Programmable)) continue; if (! obj->Implements(ObjectInterfaceType::Programmable)) continue;
CBrain* brain = dynamic_cast<CProgrammableObject*>(obj)->GetBrain(); CBrain* brain = dynamic_cast<CProgrammableObject*>(obj)->GetBrain();
for (Program* program : brain->GetPrograms()) for (std::unique_ptr<Program>& prog : brain->GetPrograms())
{ {
//? if (brain->GetCompile(j)) continue; Program* program = prog.get();
if (program->filename.empty()) continue; if (program->filename.empty()) continue;
std::string name = "ai/" + program->filename; std::string name = "ai/" + program->filename;
@ -4677,7 +4678,7 @@ void CRobotMain::SaveOneScript(CObject *obj)
char* name = m_dialog->GetSceneName(); char* name = m_dialog->GetSceneName();
int rank = m_dialog->GetSceneRank(); int rank = m_dialog->GetSceneRank();
auto programs = brain->GetPrograms(); auto& programs = brain->GetPrograms();
// TODO: Find a better way to do that // TODO: Find a better way to do that
for (unsigned int i = 0; i <= 999; i++) for (unsigned int i = 0; i <= 999; i++)
{ {
@ -4686,7 +4687,7 @@ void CRobotMain::SaveOneScript(CObject *obj)
GetSavegameDir(), m_gamerName.c_str(), name[0], rank, objRank, i); GetSavegameDir(), m_gamerName.c_str(), name[0], rank, objRank, i);
if (i < programs.size()) if (i < programs.size())
{ {
brain->WriteProgram(programs[i], filename); brain->WriteProgram(programs[i].get(), filename);
} }
else else
{ {
@ -4712,14 +4713,14 @@ void CRobotMain::SaveFileScript(CObject *obj, const char* filename, int objRank)
dirname = dirname.substr(0, dirname.find_last_of("/")); dirname = dirname.substr(0, dirname.find_last_of("/"));
char fn[MAX_FNAME]; //TODO: Refactor to std::string char fn[MAX_FNAME]; //TODO: Refactor to std::string
auto programs = brain->GetPrograms(); auto& programs = brain->GetPrograms();
// TODO: Find a better way to do that // TODO: Find a better way to do that
for (unsigned int i = 0; i <= 999; i++) for (unsigned int i = 0; i <= 999; i++)
{ {
sprintf(fn, "%s/prog%.3d%.3d.txt", dirname.c_str(), objRank, i); sprintf(fn, "%s/prog%.3d%.3d.txt", dirname.c_str(), objRank, i);
if (i < programs.size()) if (i < programs.size())
{ {
brain->WriteProgram(programs[i], fn); brain->WriteProgram(programs[i].get(), fn);
} }
else else
{ {
@ -4879,7 +4880,7 @@ void CRobotMain::IOWriteObject(CLevelParserLine* line, CObject* obj)
line->AddParam("run", CLevelParserParamUPtr{new CLevelParserParam(run+1)}); line->AddParam("run", CLevelParserParamUPtr{new CLevelParserParam(run+1)});
} }
auto programs = brain->GetPrograms(); auto& programs = brain->GetPrograms();
for (unsigned int i = 0; i < programs.size(); i++) for (unsigned int i = 0; i < programs.size(); i++)
{ {
if (programs[i]->readOnly) if (programs[i]->readOnly)