uregion.h 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  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, International Business Machines
  6. * Corporation and others. All Rights Reserved.
  7. *****************************************************************************************
  8. */
  9. #ifndef UREGION_H
  10. #define UREGION_H
  11. #include "unicode/utypes.h"
  12. #include "unicode/uenum.h"
  13. /**
  14. * \file
  15. * \brief C API: URegion (territory containment and mapping)
  16. *
  17. * URegion objects represent data associated with a particular Unicode Region Code, also known as a
  18. * Unicode Region Subtag, which is defined based upon the BCP 47 standard. These include:
  19. * * Two-letter codes defined by ISO 3166-1, with special LDML treatment of certain private-use or
  20. * reserved codes;
  21. * * A subset of 3-digit numeric codes defined by UN M.49.
  22. * URegion objects can also provide mappings to and from additional codes. There are different types
  23. * of regions that are important to distinguish:
  24. * <p>
  25. * Macroregion - A code for a "macro geographical (continental) region, geographical sub-region, or
  26. * selected economic and other grouping" as defined in UN M.49. These are typically 3-digit codes,
  27. * but contain some 2-letter codes for LDML extensions, such as "QO" for Outlying Oceania.
  28. * Macroregions are represented in ICU by one of three region types: WORLD (code 001),
  29. * CONTINENTS (regions contained directly by WORLD), and SUBCONTINENTS (regions contained directly
  30. * by a continent ).
  31. * <p>
  32. * TERRITORY - A Region that is not a Macroregion. These are typically codes for countries, but also
  33. * include areas that are not separate countries, such as the code "AQ" for Antarctica or the code
  34. * "HK" for Hong Kong (SAR China). Overseas dependencies of countries may or may not have separate
  35. * codes. The codes are typically 2-letter codes aligned with ISO 3166, but BCP47 allows for the use
  36. * of 3-digit codes in the future.
  37. * <p>
  38. * UNKNOWN - The code ZZ is defined by Unicode LDML for use in indicating that region is unknown,
  39. * or that the value supplied as a region was invalid.
  40. * <p>
  41. * DEPRECATED - Region codes that have been defined in the past but are no longer in modern usage,
  42. * usually due to a country splitting into multiple territories or changing its name.
  43. * <p>
  44. * GROUPING - A widely understood grouping of territories that has a well defined membership such
  45. * that a region code has been assigned for it. Some of these are UN M.49 codes that don't fall into
  46. * the world/continent/sub-continent hierarchy, while others are just well-known groupings that have
  47. * their own region code. Region "EU" (European Union) is one such region code that is a grouping.
  48. * Groupings will never be returned by the uregion_getContainingRegion, since a different type of region
  49. * (WORLD, CONTINENT, or SUBCONTINENT) will always be the containing region instead.
  50. *
  51. * URegion objects are const/immutable, owned and maintained by ICU itself, so there are not functions
  52. * to open or close them.
  53. */
  54. /**
  55. * URegionType is an enumeration defining the different types of regions. Current possible
  56. * values are URGN_WORLD, URGN_CONTINENT, URGN_SUBCONTINENT, URGN_TERRITORY, URGN_GROUPING,
  57. * URGN_DEPRECATED, and URGN_UNKNOWN.
  58. *
  59. * @stable ICU 51
  60. */
  61. typedef enum URegionType {
  62. /**
  63. * Type representing the unknown region.
  64. * @stable ICU 51
  65. */
  66. URGN_UNKNOWN,
  67. /**
  68. * Type representing a territory.
  69. * @stable ICU 51
  70. */
  71. URGN_TERRITORY,
  72. /**
  73. * Type representing the whole world.
  74. * @stable ICU 51
  75. */
  76. URGN_WORLD,
  77. /**
  78. * Type representing a continent.
  79. * @stable ICU 51
  80. */
  81. URGN_CONTINENT,
  82. /**
  83. * Type representing a sub-continent.
  84. * @stable ICU 51
  85. */
  86. URGN_SUBCONTINENT,
  87. /**
  88. * Type representing a grouping of territories that is not to be used in
  89. * the normal WORLD/CONTINENT/SUBCONTINENT/TERRITORY containment tree.
  90. * @stable ICU 51
  91. */
  92. URGN_GROUPING,
  93. /**
  94. * Type representing a region whose code has been deprecated, usually
  95. * due to a country splitting into multiple territories or changing its name.
  96. * @stable ICU 51
  97. */
  98. URGN_DEPRECATED,
  99. #ifndef U_HIDE_DEPRECATED_API
  100. /**
  101. * One more than the highest normal URegionType value.
  102. * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420.
  103. */
  104. URGN_LIMIT
  105. #endif /* U_HIDE_DEPRECATED_API */
  106. } URegionType;
  107. #if !UCONFIG_NO_FORMATTING
  108. /**
  109. * Opaque URegion object for use in C programs.
  110. * @stable ICU 52
  111. */
  112. struct URegion;
  113. typedef struct URegion URegion; /**< @stable ICU 52 */
  114. /**
  115. * Returns a pointer to a URegion for the specified region code: A 2-letter or 3-letter ISO 3166
  116. * code, UN M.49 numeric code (superset of ISO 3166 numeric codes), or other valid Unicode Region
  117. * Code as defined by the LDML specification. The code will be canonicalized internally. If the
  118. * region code is NULL or not recognized, the appropriate error code will be set
  119. * (U_ILLEGAL_ARGUMENT_ERROR).
  120. * @stable ICU 52
  121. */
  122. U_CAPI const URegion* U_EXPORT2
  123. uregion_getRegionFromCode(const char *regionCode, UErrorCode *status);
  124. /**
  125. * Returns a pointer to a URegion for the specified numeric region code. If the numeric region
  126. * code is not recognized, the appropriate error code will be set (U_ILLEGAL_ARGUMENT_ERROR).
  127. * @stable ICU 52
  128. */
  129. U_CAPI const URegion* U_EXPORT2
  130. uregion_getRegionFromNumericCode (int32_t code, UErrorCode *status);
  131. /**
  132. * Returns an enumeration over the canonical codes of all known regions that match the given type.
  133. * The enumeration must be closed with with uenum_close().
  134. * @stable ICU 52
  135. */
  136. U_CAPI UEnumeration* U_EXPORT2
  137. uregion_getAvailable(URegionType type, UErrorCode *status);
  138. /**
  139. * Returns true if the specified uregion is equal to the specified otherRegion.
  140. * @stable ICU 52
  141. */
  142. U_CAPI UBool U_EXPORT2
  143. uregion_areEqual(const URegion* uregion, const URegion* otherRegion);
  144. /**
  145. * Returns a pointer to the URegion that contains the specified uregion. Returns NULL if the
  146. * specified uregion is code "001" (World) or "ZZ" (Unknown region). For example, calling
  147. * this method with region "IT" (Italy) returns the URegion for "039" (Southern Europe).
  148. * @stable ICU 52
  149. */
  150. U_CAPI const URegion* U_EXPORT2
  151. uregion_getContainingRegion(const URegion* uregion);
  152. /**
  153. * Return a pointer to the URegion that geographically contains this uregion and matches the
  154. * specified type, moving multiple steps up the containment chain if necessary. Returns NULL if no
  155. * containing region can be found that matches the specified type. Will return NULL if URegionType
  156. * is URGN_GROUPING, URGN_DEPRECATED, or URGN_UNKNOWN which are not appropriate for this API.
  157. * For example, calling this method with uregion "IT" (Italy) for type URGN_CONTINENT returns the
  158. * URegion "150" (Europe).
  159. * @stable ICU 52
  160. */
  161. U_CAPI const URegion* U_EXPORT2
  162. uregion_getContainingRegionOfType(const URegion* uregion, URegionType type);
  163. /**
  164. * Return an enumeration over the canonical codes of all the regions that are immediate children
  165. * of the specified uregion in the region hierarchy. These returned regions could be either macro
  166. * regions, territories, or a mixture of the two, depending on the containment data as defined in
  167. * CLDR. This API returns NULL if this uregion doesn't have any sub-regions. For example, calling
  168. * this function for uregion "150" (Europe) returns an enumeration containing the various
  169. * sub-regions of Europe: "039" (Southern Europe), "151" (Eastern Europe), "154" (Northern Europe),
  170. * and "155" (Western Europe). The enumeration must be closed with with uenum_close().
  171. * @stable ICU 52
  172. */
  173. U_CAPI UEnumeration* U_EXPORT2
  174. uregion_getContainedRegions(const URegion* uregion, UErrorCode *status);
  175. /**
  176. * Returns an enumeration over the canonical codes of all the regions that are children of the
  177. * specified uregion anywhere in the region hierarchy and match the given type. This API may return
  178. * an empty enumeration if this uregion doesn't have any sub-regions that match the given type.
  179. * For example, calling this method with region "150" (Europe) and type URGN_TERRITORY" returns an
  180. * enumeration containing all the territories in Europe: "FR" (France), "IT" (Italy), "DE" (Germany),
  181. * etc. The enumeration must be closed with with uenum_close().
  182. * @stable ICU 52
  183. */
  184. U_CAPI UEnumeration* U_EXPORT2
  185. uregion_getContainedRegionsOfType(const URegion* uregion, URegionType type, UErrorCode *status);
  186. /**
  187. * Returns true if the specified uregion contains the specified otherRegion anywhere in the region
  188. * hierarchy.
  189. * @stable ICU 52
  190. */
  191. U_CAPI UBool U_EXPORT2
  192. uregion_contains(const URegion* uregion, const URegion* otherRegion);
  193. /**
  194. * If the specified uregion is deprecated, returns an enumeration over the canonical codes of the
  195. * regions that are the preferred replacement regions for the specified uregion. If the specified
  196. * uregion is not deprecated, returns NULL. For example, calling this method with uregion
  197. * "SU" (Soviet Union) returns a list of the regions containing "RU" (Russia), "AM" (Armenia),
  198. * "AZ" (Azerbaijan), etc... The enumeration must be closed with with uenum_close().
  199. * @stable ICU 52
  200. */
  201. U_CAPI UEnumeration* U_EXPORT2
  202. uregion_getPreferredValues(const URegion* uregion, UErrorCode *status);
  203. /**
  204. * Returns the specified uregion's canonical code.
  205. * @stable ICU 52
  206. */
  207. U_CAPI const char* U_EXPORT2
  208. uregion_getRegionCode(const URegion* uregion);
  209. /**
  210. * Returns the specified uregion's numeric code, or a negative value if there is no numeric code
  211. * for the specified uregion.
  212. * @stable ICU 52
  213. */
  214. U_CAPI int32_t U_EXPORT2
  215. uregion_getNumericCode(const URegion* uregion);
  216. /**
  217. * Returns the URegionType of the specified uregion.
  218. * @stable ICU 52
  219. */
  220. U_CAPI URegionType U_EXPORT2
  221. uregion_getType(const URegion* uregion);
  222. #endif /* #if !UCONFIG_NO_FORMATTING */
  223. #endif