From 70e138bbf193e79cb3d879c2f237ac3fd1b666da Mon Sep 17 00:00:00 2001 From: Rodrigo Braz Monteiro Date: Sat, 20 Sep 2008 03:29:41 +0000 Subject: [PATCH] More optimizations. Originally committed to SVN as r2369. --- aegilib/src/action.cpp | 74 ++++++++++++++++++++++++++++++++---------- aegilib/src/action.h | 2 ++ 2 files changed, 59 insertions(+), 17 deletions(-) diff --git a/aegilib/src/action.cpp b/aegilib/src/action.cpp index 133ffb97a..5095ad8c7 100644 --- a/aegilib/src/action.cpp +++ b/aegilib/src/action.cpp @@ -163,31 +163,71 @@ void ActionModify::Execute(IModel& model) ActionModifyBatch::ActionModifyBatch(std::vector _entries, std::vector > _deltas, Selection _selection,const String &_section,bool _noTextFields) : entries(_entries), deltas(_deltas), selection(_selection), section(_section), noTextFields(_noTextFields) {} +ActionModifyBatch::ActionModifyBatch(Selection _selection,const String &_section,bool _noTextFields) +: selection(_selection), section(_section), noTextFields(_noTextFields) {} + Action ActionModifyBatch::GetAntiAction(const IModel& model) const { - // Get section - Section sect = GetSection(model,section); - size_t len = selection->GetCount(); - std::vector _deltas(len); - std::vector oldEntries(len); + // Old, slow method + if (false) { + // Get section + Section sect = GetSection(model,section); + size_t len = selection->GetCount(); + std::vector _deltas(len); + std::vector oldEntries(len); - // For each line... - for (size_t i=0;iGetEntry(selection->GetLine(i)); + // For each line... + for (size_t i=0;iGetEntry(selection->GetLine(i)); - // Try to get a delta - DeltaCoder deltaCoder = oldEntry->GetDeltaCoder(); - if (deltaCoder) { - if (i < deltas.size() && deltas[i]) _deltas[i] = deltaCoder->EncodeReverseDelta(deltas[i],oldEntry); - _deltas[i] = deltaCoder->EncodeDelta(entries[i],oldEntry,!noTextFields); + // Try to get a delta + DeltaCoder deltaCoder = oldEntry->GetDeltaCoder(); + if (deltaCoder) { + if (i < deltas.size() && deltas[i]) _deltas[i] = deltaCoder->EncodeReverseDelta(deltas[i],oldEntry); + _deltas[i] = deltaCoder->EncodeDelta(entries[i],oldEntry,!noTextFields); + } + + // Store the whole original line + else oldEntries[i] = oldEntry; } - // Store the whole original line - else oldEntries[i] = oldEntry; + return Action(new ActionModifyBatch(oldEntries,_deltas,selection,section,noTextFields)); } - return Action(new ActionModifyBatch(oldEntries,_deltas,selection,section,noTextFields)); + else { + // Get section + Section sect = GetSection(model,section); + size_t len = selection->GetCount(); + + // OK, this block warrants some explanation: + // Copying smart pointers around all the time is quite slow, so I just create them once and + // access the final copies. + ActionModifyBatch* antiPtr = new ActionModifyBatch(selection,section,noTextFields); + Action anti = Action(antiPtr); + std::vector& _deltas = antiPtr->deltas; + std::vector& oldEntries = antiPtr->entries; + _deltas.resize(len); + oldEntries.resize(len); + + // For each line... + for (size_t i=0;iGetEntry(selection->GetLine(i)); + + // Try to get a delta + DeltaCoder deltaCoder = oldEntry->GetDeltaCoder(); + if (deltaCoder) { + if (i < deltas.size() && deltas[i]) _deltas[i] = deltaCoder->EncodeReverseDelta(deltas[i],oldEntry); + _deltas[i] = deltaCoder->EncodeDelta(entries[i],oldEntry,!noTextFields); + } + + // Store the whole original line + else oldEntries[i] = oldEntry; + } + + return anti; + } } void ActionModifyBatch::Execute(IModel& model) diff --git a/aegilib/src/action.h b/aegilib/src/action.h index 6701cbdd4..e34b68a57 100644 --- a/aegilib/src/action.h +++ b/aegilib/src/action.h @@ -93,6 +93,8 @@ namespace Athenasub { const String section; bool noTextFields; + ActionModifyBatch(Selection selection,const String §ion,bool noTextFields); + public: ActionModifyBatch(std::vector entries,std::vector deltas,Selection selection,const String §ion,bool noTextFields);