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