Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(18)

Unified Diff: third_party/libaddressinput/chromium/cpp/src/lookup_key.cc

Issue 116363003: [rac] Validate an address. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/libaddressinput/chromium/cpp/src/lookup_key.cc
diff --git a/third_party/libaddressinput/chromium/cpp/src/lookup_key.cc b/third_party/libaddressinput/chromium/cpp/src/lookup_key.cc
index 278d8940e9e8c2a1eb2aecf13bf328fdbd674716..f595cb19fe9c84dd4dd644b3d3260aa167b51711 100644
--- a/third_party/libaddressinput/chromium/cpp/src/lookup_key.cc
+++ b/third_party/libaddressinput/chromium/cpp/src/lookup_key.cc
@@ -14,12 +14,14 @@
#include "lookup_key.h"
+#include <libaddressinput/address_data.h>
#include <libaddressinput/address_field.h>
#include <libaddressinput/util/basictypes.h>
#include <libaddressinput/util/scoped_ptr.h>
#include <cassert>
#include <cstddef>
+#include <map>
#include <string>
#include <utility>
@@ -29,6 +31,28 @@
namespace i18n {
namespace addressinput {
+namespace {
+
+// Returns the value of the |field| in the |address|. The |field| can be only
+// ADMIN_AREA, LOCALITY, and DEPENDENT_LOCALITY.
+const std::string& GetAddressFieldValue(const AddressData& address,
Evan Stade 2013/12/19 02:12:38 this seems like it should be an AddressData method
please use gerrit instead 2014/01/08 00:55:52 Done.
+ AddressField field) {
+ switch (field) {
+ case ADMIN_AREA:
+ return address.administrative_area;
+ case LOCALITY:
+ return address.locality;
+ case DEPENDENT_LOCALITY:
+ return address.dependent_locality;
+ default:
+ assert(false);
+ static const std::string kEmptyString;
+ return kEmptyString;
+ }
+}
+
+} // namespace
+
LookupKey::LookupKey(const std::string& country_code)
: value_("data/" + country_code),
level_(COUNTRY),
@@ -77,6 +101,43 @@ LookupKey* LookupKey::AddLanguageCodeKey(const std::string& language_code) {
return language_code_key;
}
+const LookupKey* LookupKey::GetSubKey(const std::string& sub_region) const {
+ LookupKeys::const_iterator it = sub_keys_.find(sub_region);
+ return it == sub_keys_.end() ? NULL : it->second;
+}
+
+const LookupKey* LookupKey::GetLanguageCodeKey(
+ const std::string& language_code) const {
+ LookupKeys::const_iterator it = language_code_keys_.find(language_code);
+ return it == language_code_keys_.end() ? NULL : it->second;
+}
+
+std::map<AddressField, const Rule*> LookupKey::BuildFieldRuleMap(
Evan Stade 2013/12/19 02:12:38 this actually feels like it should be a method on
please use gerrit instead 2014/01/08 00:55:52 AddressData is public API, but Rule is not. Moving
+ const AddressData& address) const {
+ static const int kNumberOfLevels = 4;
Evan Stade 2013/12/19 02:12:38 use arraysize()
please use gerrit instead 2014/01/08 00:55:52 No longer applicable.
+ static const AddressField kLevels[kNumberOfLevels] = {
+ COUNTRY,
+ ADMIN_AREA,
+ LOCALITY,
+ DEPENDENT_LOCALITY
+ };
+ std::map<AddressField, const Rule*> result;
+ const LookupKey* key = this;
Evan Stade 2013/12/19 02:12:38 does this assume |this| is a country level LookupK
please use gerrit instead 2014/01/08 00:55:52 No longer applicable.
+ for (int i = 0; i < kNumberOfLevels && key != NULL; ++i) {
+ const LookupKey* language_code_key =
+ key->GetLanguageCodeKey(address.language_code);
+ result.insert(std::make_pair(
+ kLevels[i],
+ language_code_key == NULL
+ ? key->GetRule()
+ : language_code_key->GetRule()));
+ key = i == kNumberOfLevels - 1
+ ? NULL
+ : key->GetSubKey(GetAddressFieldValue(address, kLevels[i + 1]));
+ }
+ return result;
+}
+
LookupKey::LookupKey(const std::string& key_value, AddressField level)
: value_(key_value),
level_(level),

Powered by Google App Engine
This is Rietveld 408576698