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 | |