From a107d3e22e128ec343d82f902de4c6ee0e33435f Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Wed, 1 Jun 2011 18:19:57 +0200 Subject: optimization: make the Translator::find() api index-based --- tools/linguist/lupdate/merge.cpp | 52 +++++++++++++++++++----------------- tools/linguist/shared/translator.cpp | 16 +++++------ tools/linguist/shared/translator.h | 5 ++-- 3 files changed, 38 insertions(+), 35 deletions(-) diff --git a/tools/linguist/lupdate/merge.cpp b/tools/linguist/lupdate/merge.cpp index 2d5230b..1c992c3 100644 --- a/tools/linguist/lupdate/merge.cpp +++ b/tools/linguist/lupdate/merge.cpp @@ -348,11 +348,11 @@ Translator merge(const Translator &tor, const Translator &virginTor, if (m.sourceText().isEmpty() && m.id().isEmpty()) { // context/file comment - TranslatorMessage mv = virginTor.find(m.context()); - if (!mv.isNull()) - m.setComment(mv.comment()); + int mvi = virginTor.find(m.context()); + if (mvi >= 0) + m.setComment(virginTor.constMessage(mvi).comment()); } else { - TranslatorMessage mv; + const TranslatorMessage *mv; int mvi = virginTor.find(m); if (mvi < 0) { if (!(options & HeuristicSimilarText)) { @@ -362,16 +362,17 @@ Translator merge(const Translator &tor, const Translator &virginTor, obsoleted++; m.clearReferences(); } else { - mv = virginTor.find(m.context(), m.comment(), m.allReferences()); - if (mv.isNull()) { + mvi = virginTor.find(m.context(), m.comment(), m.allReferences()); + if (mvi < 0) { // did not find it in the virgin, mark it as obsolete goto makeObsolete; } else { + mv = &virginTor.constMessage(mvi); // Do not just accept it if its on the same line number, // but different source text. // Also check if the texts are more or less similar before // we consider them to represent the same message... - if (getSimilarityScore(m.sourceText(), mv.sourceText()) >= textSimilarityThreshold) { + if (getSimilarityScore(m.sourceText(), mv->sourceText()) >= textSimilarityThreshold) { // It is just slightly modified, assume that it is the same string // Mark it as unfinished. (Since the source text @@ -382,7 +383,7 @@ Translator merge(const Translator &tor, const Translator &virginTor, outdateSource: m.setOldSourceText(m.sourceText()); - m.setSourceText(mv.sourceText()); + m.setSourceText(mv->sourceText()); const QString &oldpluralsource = m.extra(QLatin1String("po-msgid_plural")); if (!oldpluralsource.isEmpty()) { m.setExtra(QLatin1String("po-old_msgid_plural"), oldpluralsource); @@ -397,22 +398,22 @@ Translator merge(const Translator &tor, const Translator &virginTor, } } } else { - mv = virginTor.message(mvi); - if (!mv.id().isEmpty() - && (mv.context() != m.context() - || mv.sourceText() != m.sourceText() - || mv.comment() != m.comment())) { + mv = &virginTor.message(mvi); + if (!mv->id().isEmpty() + && (mv->context() != m.context() + || mv->sourceText() != m.sourceText() + || mv->comment() != m.comment())) { known++; newType = TranslatorMessage::Unfinished; - m.setContext(mv.context()); - m.setComment(mv.comment()); - if (mv.sourceText() != m.sourceText()) + m.setContext(mv->context()); + m.setComment(mv->comment()); + if (mv->sourceText() != m.sourceText()) goto outdateSource; } else { switch (m.type()) { case TranslatorMessage::Finished: default: - if (m.isPlural() == mv.isPlural()) { + if (m.isPlural() == mv->isPlural()) { newType = TranslatorMessage::Finished; } else { newType = TranslatorMessage::Unfinished; @@ -435,11 +436,11 @@ Translator merge(const Translator &tor, const Translator &virginTor, // have the element. // why not use operator=()? Because it overwrites e.g. userData. copyAttribs: - m.setReferences(mv.allReferences()); - m.setPlural(mv.isPlural()); - m.setUtf8(mv.isUtf8()); - m.setExtraComment(mv.extraComment()); - m.setId(mv.id()); + m.setReferences(mv->allReferences()); + m.setPlural(mv->isPlural()); + m.setUtf8(mv->isUtf8()); + m.setExtraComment(mv->extraComment()); + m.setId(mv->id()); } } @@ -459,9 +460,10 @@ Translator merge(const Translator &tor, const Translator &virginTor, if (tor.find(mv) >= 0) continue; if (options & HeuristicSimilarText) { - TranslatorMessage m = tor.find(mv.context(), mv.comment(), mv.allReferences()); - if (!m.isNull()) { - if (getSimilarityScore(m.sourceText(), mv.sourceText()) >= textSimilarityThreshold) + int mi = tor.find(mv.context(), mv.comment(), mv.allReferences()); + if (mi >= 0) { + if (getSimilarityScore(tor.constMessage(mi).sourceText(), mv.sourceText()) + >= textSimilarityThreshold) continue; } } diff --git a/tools/linguist/shared/translator.cpp b/tools/linguist/shared/translator.cpp index 2a15fe7..91a5a26 100644 --- a/tools/linguist/shared/translator.cpp +++ b/tools/linguist/shared/translator.cpp @@ -346,7 +346,7 @@ int Translator::find(const TranslatorMessage &msg) const return -1; } -TranslatorMessage Translator::find(const QString &context, +int Translator::find(const QString &context, const QString &comment, const TranslatorMessage::References &refs) const { if (!refs.isEmpty()) { @@ -355,10 +355,10 @@ TranslatorMessage Translator::find(const QString &context, foreach (const TranslatorMessage::Reference &itref, it->allReferences()) foreach (const TranslatorMessage::Reference &ref, refs) if (itref == ref) - return *it; + return it - m_messages.constBegin(); } } - return TranslatorMessage(); + return -1; } bool Translator::contains(const QString &context) const @@ -369,12 +369,12 @@ bool Translator::contains(const QString &context) const return false; } -TranslatorMessage Translator::find(const QString &context) const +int Translator::find(const QString &context) const { - foreach (const TranslatorMessage &msg, m_messages) - if (msg.context() == context && msg.sourceText().isEmpty() && msg.id().isEmpty()) - return msg; - return TranslatorMessage(); + for (TMM::ConstIterator it = m_messages.constBegin(); it != m_messages.constEnd(); ++it) + if (it->context() == context && it->sourceText().isEmpty() && it->id().isEmpty()) + return it - m_messages.constBegin(); + return -1; } void Translator::stripObsoleteMessages() diff --git a/tools/linguist/shared/translator.h b/tools/linguist/shared/translator.h index b9bc94c..41f0396 100644 --- a/tools/linguist/shared/translator.h +++ b/tools/linguist/shared/translator.h @@ -127,11 +127,11 @@ public: bool save(const QString &filename, ConversionData &err, const QString &format /* = "auto" */) const; int find(const TranslatorMessage &msg) const; - TranslatorMessage find(const QString &context, + int find(const QString &context, const QString &comment, const TranslatorMessage::References &refs) const; bool contains(const QString &context) const; - TranslatorMessage find(const QString &context) const; + int find(const QString &context) const; void replaceSorted(const TranslatorMessage &msg); void extend(const TranslatorMessage &msg); // Only for single-location messages @@ -178,6 +178,7 @@ public: int messageCount() const { return m_messages.size(); } TranslatorMessage &message(int i) { return m_messages[i]; } const TranslatorMessage &message(int i) const { return m_messages.at(i); } + const TranslatorMessage &constMessage(int i) const { return m_messages.at(i); } void dump() const; // additional file format specific data -- cgit v0.12