Optimize number of moves.

This commit is contained in:
chriseth 2018-04-05 10:22:55 +02:00
parent 12b47a6e0b
commit ca9fa053b7

View File

@ -92,21 +92,27 @@ void InlineModifier::operator()(ForLoop& _loop)
void InlineModifier::operator()(Block& _block) void InlineModifier::operator()(Block& _block)
{ {
// TODO: optimize the number of moves here. // This is only used if needed to minimize the number of move operations.
vector<Statement> modifiedStatements;
for (size_t i = 0; i < _block.statements.size(); ++i) for (size_t i = 0; i < _block.statements.size(); ++i)
{ {
visit(_block.statements.at(i)); visit(_block.statements.at(i));
if (size_t length = m_statementsToPrefix.size()) if (!m_statementsToPrefix.empty())
{ {
_block.statements.insert( if (modifiedStatements.empty())
_block.statements.begin() + i, std::move(
std::make_move_iterator(m_statementsToPrefix.begin()), _block.statements.begin(),
std::make_move_iterator(m_statementsToPrefix.end()) _block.statements.begin() + i,
); back_inserter(modifiedStatements)
i += length; );
modifiedStatements += std::move(m_statementsToPrefix);
m_statementsToPrefix.clear(); m_statementsToPrefix.clear();
} }
if (!modifiedStatements.empty())
modifiedStatements.emplace_back(std::move(_block.statements[i]));
} }
if (!modifiedStatements.empty())
_block.statements = std::move(modifiedStatements);
} }
void InlineModifier::visit(Expression& _expression) void InlineModifier::visit(Expression& _expression)