• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (C) 2014 Google Inc.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #ifndef I18N_ADDRESSINPUT_REGION_DATA_BUILDER_H_
16 #define I18N_ADDRESSINPUT_REGION_DATA_BUILDER_H_
17 
18 #include <libaddressinput/util/basictypes.h>
19 
20 #include <map>
21 #include <string>
22 
23 namespace i18n {
24 namespace addressinput {
25 
26 class PreloadSupplier;
27 class RegionData;
28 
29 class RegionDataBuilder {
30  public:
31   // Does not take ownership of |supplier|, which should not be NULL.
32   explicit RegionDataBuilder(PreloadSupplier* supplier);
33   ~RegionDataBuilder();
34 
35   // Returns a tree of administrative subdivisions for the |region_code|.
36   // Examples:
37   //   US with en-US UI language.
38   //   |______________________
39   //   |           |          |
40   //   v           v          v
41   // AL:Alabama  AK:Alaska  AS:American Samoa  ...
42   //
43   //   KR with ko-Latn UI language.
44   //   |______________________________________
45   //       |               |                  |
46   //       v               v                  v
47   // 강원도:Gangwon  경기도:Gyeonggi  경상남도:Gyeongnam  ...
48   //
49   //   KR with ko-KR UI language.
50   //   |_______________________________
51   //       |            |              |
52   //       v            v              v
53   // 강원도:강원  경기도:경기  경상남도:경남  ...
54   //
55   // The BCP 47 |ui_language_tag| is used to choose the best supported language
56   // tag for this region (assigned to |best_region_tree_language_tag|). For
57   // example, Canada has both English and French names for its administrative
58   // subdivisions. If the UI language is French, then the French names are used.
59   // The |best_region_tree_language_tag| value may be an empty string.
60   //
61   // Should be called only if supplier->IsLoaded(region_code) returns true. The
62   // |best_region_tree_language_tag| parameter should not be NULL.
63   const RegionData& Build(const std::string& region_code,
64                           const std::string& ui_language_tag,
65                           std::string* best_region_tree_language_tag);
66 
67  private:
68   typedef std::map<std::string, const RegionData*> LanguageRegionMap;
69   typedef std::map<std::string, LanguageRegionMap*> RegionCodeDataMap;
70 
71   PreloadSupplier* const supplier_;  // Not owned.
72   RegionCodeDataMap cache_;
73 
74   DISALLOW_COPY_AND_ASSIGN(RegionDataBuilder);
75 };
76 
77 }  // namespace addressinput
78 }  // namespace i18n
79 
80 #endif  // I18N_ADDRESSINPUT_REGION_DATA_BUILDER_H_
81