Home | History | Annotate | Download | only in libaddressinput
      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