| 1 | // © 2016 and later: Unicode, Inc. and others. | 
|---|
| 2 | // License & terms of use: http://www.unicode.org/copyright.html | 
|---|
| 3 | /* | 
|---|
| 4 | ******************************************************************************* | 
|---|
| 5 | * Copyright (C) 2014-2016, International Business Machines Corporation and others. | 
|---|
| 6 | * All Rights Reserved. | 
|---|
| 7 | ******************************************************************************* | 
|---|
| 8 | */ | 
|---|
| 9 |  | 
|---|
| 10 | #ifndef REGION_H | 
|---|
| 11 | #define REGION_H | 
|---|
| 12 |  | 
|---|
| 13 | /** | 
|---|
| 14 | * \file | 
|---|
| 15 | * \brief C++ API: Region classes (territory containment) | 
|---|
| 16 | */ | 
|---|
| 17 |  | 
|---|
| 18 | #include "unicode/utypes.h" | 
|---|
| 19 |  | 
|---|
| 20 | #if U_SHOW_CPLUSPLUS_API | 
|---|
| 21 |  | 
|---|
| 22 | #if !UCONFIG_NO_FORMATTING | 
|---|
| 23 |  | 
|---|
| 24 | #include "unicode/uregion.h" | 
|---|
| 25 | #include "unicode/uobject.h" | 
|---|
| 26 | #include "unicode/uniset.h" | 
|---|
| 27 | #include "unicode/unistr.h" | 
|---|
| 28 | #include "unicode/strenum.h" | 
|---|
| 29 |  | 
|---|
| 30 | U_NAMESPACE_BEGIN | 
|---|
| 31 |  | 
|---|
| 32 | /** | 
|---|
| 33 | * <code>Region</code> is the class representing a Unicode Region Code, also known as a | 
|---|
| 34 | * Unicode Region Subtag, which is defined based upon the BCP 47 standard. We often think of | 
|---|
| 35 | * "regions" as "countries" when defining the characteristics of a locale.  Region codes There are different | 
|---|
| 36 | * types of region codes that are important to distinguish. | 
|---|
| 37 | * <p> | 
|---|
| 38 | *  Macroregion - A code for a "macro geographical (continental) region, geographical sub-region, or | 
|---|
| 39 | *  selected economic and other grouping" as defined in | 
|---|
| 40 | *  UN M.49 (http://unstats.un.org/unsd/methods/m49/m49regin.htm). | 
|---|
| 41 | *  These are typically 3-digit codes, but contain some 2-letter codes, such as the LDML code QO | 
|---|
| 42 | *  added for Outlying Oceania.  Not all UNM.49 codes are defined in LDML, but most of them are. | 
|---|
| 43 | *  Macroregions are represented in ICU by one of three region types: WORLD ( region code 001 ), | 
|---|
| 44 | *  CONTINENTS ( regions contained directly by WORLD ), and SUBCONTINENTS ( things contained directly | 
|---|
| 45 | *  by a continent ). | 
|---|
| 46 | *  <p> | 
|---|
| 47 | *  TERRITORY - A Region that is not a Macroregion. These are typically codes for countries, but also | 
|---|
| 48 | *  include areas that are not separate countries, such as the code "AQ" for Antarctica or the code | 
|---|
| 49 | *  "HK" for Hong Kong (SAR China). Overseas dependencies of countries may or may not have separate | 
|---|
| 50 | *  codes. The codes are typically 2-letter codes aligned with the ISO 3166 standard, but BCP47 allows | 
|---|
| 51 | *  for the use of 3-digit codes in the future. | 
|---|
| 52 | *  <p> | 
|---|
| 53 | *  UNKNOWN - The code ZZ is defined by Unicode LDML for use to indicate that the Region is unknown, | 
|---|
| 54 | *  or that the value supplied as a region was invalid. | 
|---|
| 55 | *  <p> | 
|---|
| 56 | *  DEPRECATED - Region codes that have been defined in the past but are no longer in modern usage, | 
|---|
| 57 | *  usually due to a country splitting into multiple territories or changing its name. | 
|---|
| 58 | *  <p> | 
|---|
| 59 | *  GROUPING - A widely understood grouping of territories that has a well defined membership such | 
|---|
| 60 | *  that a region code has been assigned for it.  Some of these are UNM.49 codes that do't fall into | 
|---|
| 61 | *  the world/continent/sub-continent hierarchy, while others are just well known groupings that have | 
|---|
| 62 | *  their own region code. Region "EU" (European Union) is one such region code that is a grouping. | 
|---|
| 63 | *  Groupings will never be returned by the getContainingRegion() API, since a different type of region | 
|---|
| 64 | *  ( WORLD, CONTINENT, or SUBCONTINENT ) will always be the containing region instead. | 
|---|
| 65 | * | 
|---|
| 66 | * The Region class is not intended for public subclassing. | 
|---|
| 67 | * | 
|---|
| 68 | * @author       John Emmons | 
|---|
| 69 | * @stable ICU 51 | 
|---|
| 70 | */ | 
|---|
| 71 |  | 
|---|
| 72 | class U_I18N_API Region : public UObject { | 
|---|
| 73 | public: | 
|---|
| 74 | /** | 
|---|
| 75 | * Destructor. | 
|---|
| 76 | * @stable ICU 51 | 
|---|
| 77 | */ | 
|---|
| 78 | virtual ~Region(); | 
|---|
| 79 |  | 
|---|
| 80 | /** | 
|---|
| 81 | * Returns true if the two regions are equal. | 
|---|
| 82 | * @stable ICU 51 | 
|---|
| 83 | */ | 
|---|
| 84 | UBool operator==(const Region &that) const; | 
|---|
| 85 |  | 
|---|
| 86 | /** | 
|---|
| 87 | * Returns true if the two regions are NOT equal; that is, if operator ==() returns false. | 
|---|
| 88 | * @stable ICU 51 | 
|---|
| 89 | */ | 
|---|
| 90 | UBool operator!=(const Region &that) const; | 
|---|
| 91 |  | 
|---|
| 92 | /** | 
|---|
| 93 | * Returns a pointer to a Region using the given region code.  The region code can be either 2-letter ISO code, | 
|---|
| 94 | * 3-letter ISO code,  UNM.49 numeric code, or other valid Unicode Region Code as defined by the LDML specification. | 
|---|
| 95 | * The identifier will be canonicalized internally using the supplemental metadata as defined in the CLDR. | 
|---|
| 96 | * If the region code is NULL or not recognized, the appropriate error code will be set ( U_ILLEGAL_ARGUMENT_ERROR ) | 
|---|
| 97 | * @stable ICU 51 | 
|---|
| 98 | */ | 
|---|
| 99 | static const Region* U_EXPORT2 getInstance(const char *region_code, UErrorCode &status); | 
|---|
| 100 |  | 
|---|
| 101 | /** | 
|---|
| 102 | * Returns a pointer to a Region using the given numeric region code. If the numeric region code is not recognized, | 
|---|
| 103 | * the appropriate error code will be set ( U_ILLEGAL_ARGUMENT_ERROR ). | 
|---|
| 104 | * @stable ICU 51 | 
|---|
| 105 | */ | 
|---|
| 106 | static const Region* U_EXPORT2 getInstance (int32_t code, UErrorCode &status); | 
|---|
| 107 |  | 
|---|
| 108 | /** | 
|---|
| 109 | * Returns an enumeration over the IDs of all known regions that match the given type. | 
|---|
| 110 | * @stable ICU 55 | 
|---|
| 111 | */ | 
|---|
| 112 | static StringEnumeration* U_EXPORT2 getAvailable(URegionType type, UErrorCode &status); | 
|---|
| 113 |  | 
|---|
| 114 | /** | 
|---|
| 115 | * Returns a pointer to the region that contains this region.  Returns NULL if this region is code "001" (World) | 
|---|
| 116 | * or "ZZ" (Unknown region). For example, calling this method with region "IT" (Italy) returns the | 
|---|
| 117 | * region "039" (Southern Europe). | 
|---|
| 118 | * @stable ICU 51 | 
|---|
| 119 | */ | 
|---|
| 120 | const Region* getContainingRegion() const; | 
|---|
| 121 |  | 
|---|
| 122 | /** | 
|---|
| 123 | * Return a pointer to the region that geographically contains this region and matches the given type, | 
|---|
| 124 | * moving multiple steps up the containment chain if necessary.  Returns NULL if no containing region can be found | 
|---|
| 125 | * that matches the given type. Note: The URegionTypes = "URGN_GROUPING", "URGN_DEPRECATED", or "URGN_UNKNOWN" | 
|---|
| 126 | * are not appropriate for use in this API. NULL will be returned in this case. For example, calling this method | 
|---|
| 127 | * with region "IT" (Italy) for type "URGN_CONTINENT" returns the region "150" ( Europe ). | 
|---|
| 128 | * @stable ICU 51 | 
|---|
| 129 | */ | 
|---|
| 130 | const Region* getContainingRegion(URegionType type) const; | 
|---|
| 131 |  | 
|---|
| 132 | /** | 
|---|
| 133 | * Return an enumeration over the IDs of all the regions that are immediate children of this region in the | 
|---|
| 134 | * region hierarchy. These returned regions could be either macro regions, territories, or a mixture of the two, | 
|---|
| 135 | * depending on the containment data as defined in CLDR.  This API may return NULL if this region doesn't have | 
|---|
| 136 | * any sub-regions. For example, calling this method with region "150" (Europe) returns an enumeration containing | 
|---|
| 137 | * the various sub regions of Europe - "039" (Southern Europe) - "151" (Eastern Europe) - "154" (Northern Europe) | 
|---|
| 138 | * and "155" (Western Europe). | 
|---|
| 139 | * @stable ICU 55 | 
|---|
| 140 | */ | 
|---|
| 141 | StringEnumeration* getContainedRegions(UErrorCode &status) const; | 
|---|
| 142 |  | 
|---|
| 143 | /** | 
|---|
| 144 | * Returns an enumeration over the IDs of all the regions that are children of this region anywhere in the region | 
|---|
| 145 | * hierarchy and match the given type.  This API may return an empty enumeration if this region doesn't have any | 
|---|
| 146 | * sub-regions that match the given type. For example, calling this method with region "150" (Europe) and type | 
|---|
| 147 | * "URGN_TERRITORY" returns a set containing all the territories in Europe ( "FR" (France) - "IT" (Italy) - "DE" (Germany) etc. ) | 
|---|
| 148 | * @stable ICU 55 | 
|---|
| 149 | */ | 
|---|
| 150 | StringEnumeration* getContainedRegions( URegionType type, UErrorCode &status ) const; | 
|---|
| 151 |  | 
|---|
| 152 | /** | 
|---|
| 153 | * Returns true if this region contains the supplied other region anywhere in the region hierarchy. | 
|---|
| 154 | * @stable ICU 51 | 
|---|
| 155 | */ | 
|---|
| 156 | UBool contains(const Region &other) const; | 
|---|
| 157 |  | 
|---|
| 158 | /** | 
|---|
| 159 | * For deprecated regions, return an enumeration over the IDs of the regions that are the preferred replacement | 
|---|
| 160 | * regions for this region.  Returns null for a non-deprecated region.  For example, calling this method with region | 
|---|
| 161 | * "SU" (Soviet Union) would return a list of the regions containing "RU" (Russia), "AM" (Armenia), "AZ" (Azerbaijan), etc... | 
|---|
| 162 | * @stable ICU 55 | 
|---|
| 163 | */ | 
|---|
| 164 | StringEnumeration* getPreferredValues(UErrorCode &status) const; | 
|---|
| 165 |  | 
|---|
| 166 | /** | 
|---|
| 167 | * Return this region's canonical region code. | 
|---|
| 168 | * @stable ICU 51 | 
|---|
| 169 | */ | 
|---|
| 170 | const char* getRegionCode() const; | 
|---|
| 171 |  | 
|---|
| 172 | /** | 
|---|
| 173 | * Return this region's numeric code. | 
|---|
| 174 | * Returns a negative value if the given region does not have a numeric code assigned to it. | 
|---|
| 175 | * @stable ICU 51 | 
|---|
| 176 | */ | 
|---|
| 177 | int32_t getNumericCode() const; | 
|---|
| 178 |  | 
|---|
| 179 | /** | 
|---|
| 180 | * Returns the region type of this region. | 
|---|
| 181 | * @stable ICU 51 | 
|---|
| 182 | */ | 
|---|
| 183 | URegionType getType() const; | 
|---|
| 184 |  | 
|---|
| 185 | #ifndef U_HIDE_INTERNAL_API | 
|---|
| 186 | /** | 
|---|
| 187 | * Cleans up statically allocated memory. | 
|---|
| 188 | * @internal | 
|---|
| 189 | */ | 
|---|
| 190 | static void cleanupRegionData(); | 
|---|
| 191 | #endif  /* U_HIDE_INTERNAL_API */ | 
|---|
| 192 |  | 
|---|
| 193 | private: | 
|---|
| 194 | char id[4]; | 
|---|
| 195 | UnicodeString idStr; | 
|---|
| 196 | int32_t code; | 
|---|
| 197 | URegionType fType; | 
|---|
| 198 | Region *containingRegion; | 
|---|
| 199 | UVector *containedRegions; | 
|---|
| 200 | UVector *preferredValues; | 
|---|
| 201 |  | 
|---|
| 202 | /** | 
|---|
| 203 | * Default Constructor. Internal - use factory methods only. | 
|---|
| 204 | */ | 
|---|
| 205 | Region(); | 
|---|
| 206 |  | 
|---|
| 207 |  | 
|---|
| 208 | /* | 
|---|
| 209 | * Initializes the region data from the ICU resource bundles.  The region data | 
|---|
| 210 | * contains the basic relationships such as which regions are known, what the numeric | 
|---|
| 211 | * codes are, any known aliases, and the territory containment data. | 
|---|
| 212 | * | 
|---|
| 213 | * If the region data has already loaded, then this method simply returns without doing | 
|---|
| 214 | * anything meaningful. | 
|---|
| 215 | */ | 
|---|
| 216 |  | 
|---|
| 217 | static void U_CALLCONV loadRegionData(UErrorCode &status); | 
|---|
| 218 |  | 
|---|
| 219 | }; | 
|---|
| 220 |  | 
|---|
| 221 | U_NAMESPACE_END | 
|---|
| 222 |  | 
|---|
| 223 | #endif /* #if !UCONFIG_NO_FORMATTING */ | 
|---|
| 224 |  | 
|---|
| 225 | #endif /* U_SHOW_CPLUSPLUS_API */ | 
|---|
| 226 |  | 
|---|
| 227 | #endif // REGION_H | 
|---|
| 228 |  | 
|---|
| 229 | //eof | 
|---|
| 230 |  | 
|---|