Commit 98209e54 authored by Scott Little's avatar Scott Little Committed by Commit Bot

Change translate_ui_delegate to use nlogn sorting instead of n^2.

Before this CL, translate_ui_delegate.cc sorts the list of supported
translate languages using insertion sort. This CL changes it to use
std::sort.

Bug: 1109032
Change-Id: I6687ad1ba6c4da6dbb263446ed86d416ac9637b5
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2333996
Commit-Queue: Megan Jablonski <megjablon@chromium.org>
Reviewed-by: default avatarMegan Jablonski <megjablon@chromium.org>
Auto-Submit: Scott Little <sclittle@chromium.org>
Cr-Commit-Position: refs/heads/master@{#794578}
parent 7fd0b562
...@@ -4,6 +4,8 @@ ...@@ -4,6 +4,8 @@
#include "components/translate/core/browser/translate_ui_delegate.h" #include "components/translate/core/browser/translate_ui_delegate.h"
#include <algorithm>
#include "base/i18n/string_compare.h" #include "base/i18n/string_compare.h"
#include "base/metrics/histogram_macros.h" #include "base/metrics/histogram_macros.h"
#include "base/strings/string_number_conversions.h" #include "base/strings/string_number_conversions.h"
...@@ -90,34 +92,41 @@ TranslateUIDelegate::TranslateUIDelegate( ...@@ -90,34 +92,41 @@ TranslateUIDelegate::TranslateUIDelegate(
std::unique_ptr<icu::Collator> collator = CreateCollator(locale); std::unique_ptr<icu::Collator> collator = CreateCollator(locale);
languages_.reserve(language_codes.size()); languages_.reserve(language_codes.size());
for (std::vector<std::string>::const_iterator iter = language_codes.begin(); for (std::string& language_code : language_codes) {
iter != language_codes.end(); ++iter) {
std::string language_code = *iter;
base::string16 language_name = base::string16 language_name =
l10n_util::GetDisplayNameForLocale(language_code, locale, true); l10n_util::GetDisplayNameForLocale(language_code, locale, true);
// Insert the language in languages_ in alphabetical order. languages_.emplace_back(std::move(language_code), std::move(language_name));
std::vector<LanguageNamePair>::iterator iter2;
if (collator) {
for (iter2 = languages_.begin(); iter2 != languages_.end(); ++iter2) {
int result = base::i18n::CompareString16WithCollator(
*collator, language_name, iter2->second);
if (result == UCOL_LESS)
break;
}
} else {
// |locale| may not be supported by ICU collator (crbug/54833). In this
// case, let's order the languages in UTF-8.
for (iter2 = languages_.begin(); iter2 != languages_.end(); ++iter2) {
if (language_name.compare(iter2->second) < 0)
break;
}
}
languages_.insert(iter2, LanguageNamePair(language_code, language_name));
} }
// Sort |languages_| in alphabetical order according to the display name.
std::sort(
languages_.begin(), languages_.end(),
[&collator](const LanguageNamePair& lhs, const LanguageNamePair& rhs) {
if (collator) {
switch (base::i18n::CompareString16WithCollator(*collator, lhs.second,
rhs.second)) {
case UCOL_LESS:
return true;
case UCOL_GREATER:
return false;
case UCOL_EQUAL:
break;
}
} else {
// |locale| may not be supported by ICU collator (crbug/54833). In
// this case, let's order the languages in UTF-8.
int result = lhs.second.compare(rhs.second);
if (result != 0)
return result < 0;
}
// Matching display names will be ordered alphabetically according to
// the language codes.
return lhs.first < rhs.first;
});
for (std::vector<LanguageNamePair>::const_iterator iter = languages_.begin(); for (std::vector<LanguageNamePair>::const_iterator iter = languages_.begin();
iter != languages_.end(); ++iter) { iter != languages_.end(); ++iter) {
std::string language_code = iter->first; const std::string& language_code = iter->first;
if (language_code == original_language) { if (language_code == original_language) {
original_language_index_ = iter - languages_.begin(); original_language_index_ = iter - languages_.begin();
initial_original_language_index_ = original_language_index_; initial_original_language_index_ = original_language_index_;
...@@ -125,7 +134,6 @@ TranslateUIDelegate::TranslateUIDelegate( ...@@ -125,7 +134,6 @@ TranslateUIDelegate::TranslateUIDelegate(
if (language_code == target_language) if (language_code == target_language)
target_language_index_ = iter - languages_.begin(); target_language_index_ = iter - languages_.begin();
} }
} }
TranslateUIDelegate::~TranslateUIDelegate() {} TranslateUIDelegate::~TranslateUIDelegate() {}
...@@ -149,10 +157,6 @@ size_t TranslateUIDelegate::GetNumberOfLanguages() const { ...@@ -149,10 +157,6 @@ size_t TranslateUIDelegate::GetNumberOfLanguages() const {
return languages_.size(); return languages_.size();
} }
size_t TranslateUIDelegate::GetOriginalLanguageIndex() const {
return original_language_index_;
}
void TranslateUIDelegate::UpdateOriginalLanguageIndex(size_t language_index) { void TranslateUIDelegate::UpdateOriginalLanguageIndex(size_t language_index) {
if (original_language_index_ == language_index) if (original_language_index_ == language_index)
return; return;
...@@ -174,10 +178,6 @@ void TranslateUIDelegate::UpdateOriginalLanguage( ...@@ -174,10 +178,6 @@ void TranslateUIDelegate::UpdateOriginalLanguage(
} }
} }
size_t TranslateUIDelegate::GetTargetLanguageIndex() const {
return target_language_index_;
}
void TranslateUIDelegate::UpdateTargetLanguageIndex(size_t language_index) { void TranslateUIDelegate::UpdateTargetLanguageIndex(size_t language_index) {
if (target_language_index_ == language_index) if (target_language_index_ == language_index)
return; return;
......
...@@ -53,7 +53,7 @@ class TranslateUIDelegate { ...@@ -53,7 +53,7 @@ class TranslateUIDelegate {
size_t GetNumberOfLanguages() const; size_t GetNumberOfLanguages() const;
// Returns the original language index. // Returns the original language index.
size_t GetOriginalLanguageIndex() const; size_t GetOriginalLanguageIndex() const { return original_language_index_; }
// Returns the original language code. // Returns the original language code.
std::string GetOriginalLanguageCode() const; std::string GetOriginalLanguageCode() const;
...@@ -64,7 +64,7 @@ class TranslateUIDelegate { ...@@ -64,7 +64,7 @@ class TranslateUIDelegate {
void UpdateOriginalLanguage(const std::string& language_code); void UpdateOriginalLanguage(const std::string& language_code);
// Returns the target language index. // Returns the target language index.
size_t GetTargetLanguageIndex() const; size_t GetTargetLanguageIndex() const { return target_language_index_; }
// Returns the target language code. // Returns the target language code.
std::string GetTargetLanguageCode() const; std::string GetTargetLanguageCode() const;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment