blob: 0530d7264c38dbd32cc01bf584a3ab9a9168621c [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/language/content/browser/language_code_locator.h"
#include "base/strings/string_split.h"
#include "third_party/s2cellid/src/s2/s2cellid.h"
#include "third_party/s2cellid/src/s2/s2latlng.h"
namespace language {
namespace {
#include "components/language/content/browser/language_code_locator_helper.h"
} // namespace
LanguageCodeLocator::LanguageCodeLocator() {
int pos = 0;
int index = 0;
std::vector<std::pair<uint32_t, char>> items(arraysize(kDistrictPositions));
for (const uint16_t language_count : kLanguageCodeCounts) {
for (int i = 0; i < language_count; ++i) {
items[pos] = std::make_pair(kDistrictPositions[pos], index);
++pos;
}
++index;
}
district_languages_ = base::flat_map<uint32_t, char>(items);
}
LanguageCodeLocator::~LanguageCodeLocator() {}
std::vector<std::string> LanguageCodeLocator::GetLanguageCode(
double latitude,
double longitude) const {
S2CellId current_cell(S2LatLng::FromDegrees(latitude, longitude));
while (current_cell.level() > 0) {
auto search = district_languages_.find(current_cell.id() >> 32);
if (search != district_languages_.end()) {
return base::SplitString(
kLanguageEnumCodeMapping[static_cast<uint8_t>(search->second)], ";",
base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL);
}
current_cell = current_cell.parent();
}
return {};
}
} // namespace language