Coverage Report

Created: 2026-01-22 06:31

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/icu/icu4c/source/common/unicode/locid.h
Line
Count
Source
1
// © 2016 and later: Unicode, Inc. and others.
2
// License & terms of use: http://www.unicode.org/copyright.html
3
/*
4
******************************************************************************
5
*
6
*   Copyright (C) 1996-2015, International Business Machines
7
*   Corporation and others.  All Rights Reserved.
8
*
9
******************************************************************************
10
*
11
* File locid.h
12
*
13
* Created by: Helena Shih
14
*
15
* Modification History:
16
*
17
*   Date        Name        Description
18
*   02/11/97    aliu        Changed gLocPath to fgLocPath and added methods to
19
*                           get and set it.
20
*   04/02/97    aliu        Made operator!= inline; fixed return value of getName().
21
*   04/15/97    aliu        Cleanup for AIX/Win32.
22
*   04/24/97    aliu        Numerous changes per code review.
23
*   08/18/98    stephen     Added tokenizeString(),changed getDisplayName()
24
*   09/08/98    stephen     Moved definition of kEmptyString for Mac Port
25
*   11/09/99    weiv        Added const char * getName() const;
26
*   04/12/00    srl         removing unicodestring api's and cached hash code
27
*   08/10/01    grhoten     Change the static Locales to accessor functions
28
******************************************************************************
29
*/
30
31
#ifndef LOCID_H
32
#define LOCID_H
33
34
#include "unicode/utypes.h"
35
36
#if U_SHOW_CPLUSPLUS_API
37
38
#include <cstdint>
39
#include <string_view>
40
41
#include "unicode/bytestream.h"
42
#include "unicode/localpointer.h"
43
#include "unicode/strenum.h"
44
#include "unicode/stringpiece.h"
45
#include "unicode/uobject.h"
46
#include "unicode/putil.h"
47
#include "unicode/uloc.h"
48
49
/**
50
 * \file
51
 * \brief C++ API: Locale ID object.
52
 */
53
54
U_NAMESPACE_BEGIN
55
56
// Forward Declarations
57
void U_CALLCONV locale_available_init(); /**< @internal */
58
59
class StringEnumeration;
60
class UnicodeString;
61
62
/**
63
 * A <code>Locale</code> object represents a specific geographical, political,
64
 * or cultural region. An operation that requires a <code>Locale</code> to perform
65
 * its task is called <em>locale-sensitive</em> and uses the <code>Locale</code>
66
 * to tailor information for the user. For example, displaying a number
67
 * is a locale-sensitive operation--the number should be formatted
68
 * according to the customs/conventions of the user's native country,
69
 * region, or culture.
70
 *
71
 * The Locale class is not suitable for subclassing.
72
 *
73
 * <P>
74
 * You can create a <code>Locale</code> object using the constructor in
75
 * this class:
76
 * \htmlonly<blockquote>\endhtmlonly
77
 * <pre>
78
 *       Locale( const   char*  language,
79
 *               const   char*  country,
80
 *               const   char*  variant);
81
 * </pre>
82
 * \htmlonly</blockquote>\endhtmlonly
83
 * The first argument to the constructors is a valid <STRONG>ISO
84
 * Language Code.</STRONG> These codes are the lower-case two-letter
85
 * codes as defined by ISO-639.
86
 * You can find a full list of these codes at:
87
 * <BR><a href ="http://www.loc.gov/standards/iso639-2/">
88
 * http://www.loc.gov/standards/iso639-2/</a>
89
 *
90
 * <P>
91
 * The second argument to the constructors is a valid <STRONG>ISO Country
92
 * Code.</STRONG> These codes are the upper-case two-letter codes
93
 * as defined by ISO-3166.
94
 * You can find a full list of these codes at a number of sites, such as:
95
 * <BR><a href="http://www.iso.org/iso/en/prods-services/iso3166ma/index.html">
96
 * http://www.iso.org/iso/en/prods-services/iso3166ma/index.html</a>
97
 *
98
 * <P>
99
 * The third constructor requires a third argument--the <STRONG>Variant.</STRONG>
100
 * The Variant codes are vendor and browser-specific.
101
 * For example, use REVISED for a language's revised script orthography, and POSIX for POSIX.
102
 * Where there are two variants, separate them with an underscore, and
103
 * put the most important one first. For
104
 * example, a Traditional Spanish collation might be referenced, with
105
 * "ES", "ES", "Traditional_POSIX".
106
 *
107
 * <P>
108
 * Because a <code>Locale</code> object is just an identifier for a region,
109
 * no validity check is performed when you construct a <code>Locale</code>.
110
 * If you want to see whether particular resources are available for the
111
 * <code>Locale</code> you construct, you must query those resources. For
112
 * example, ask the <code>NumberFormat</code> for the locales it supports
113
 * using its <code>getAvailableLocales</code> method.
114
 * <BR><STRONG>Note:</STRONG> When you ask for a resource for a particular
115
 * locale, you get back the best available match, not necessarily
116
 * precisely what you asked for. For more information, look at
117
 * <code>ResourceBundle</code>.
118
 *
119
 * <P>
120
 * The <code>Locale</code> class provides a number of convenient constants
121
 * that you can use to create <code>Locale</code> objects for commonly used
122
 * locales. For example, the following refers to a <code>Locale</code> object
123
 * for the United States:
124
 * \htmlonly<blockquote>\endhtmlonly
125
 * <pre>
126
 *       Locale::getUS()
127
 * </pre>
128
 * \htmlonly</blockquote>\endhtmlonly
129
 *
130
 * <P>
131
 * Once you've created a <code>Locale</code> you can query it for information about
132
 * itself. Use <code>getCountry</code> to get the ISO Country Code and
133
 * <code>getLanguage</code> to get the ISO Language Code. You can
134
 * use <code>getDisplayCountry</code> to get the
135
 * name of the country suitable for displaying to the user. Similarly,
136
 * you can use <code>getDisplayLanguage</code> to get the name of
137
 * the language suitable for displaying to the user. Interestingly,
138
 * the <code>getDisplayXXX</code> methods are themselves locale-sensitive
139
 * and have two versions: one that uses the default locale and one
140
 * that takes a locale as an argument and displays the name or country in
141
 * a language appropriate to that locale.
142
 *
143
 * <P>
144
 * ICU provides a number of classes that perform locale-sensitive
145
 * operations. For example, the <code>NumberFormat</code> class formats
146
 * numbers, currency, or percentages in a locale-sensitive manner. Classes
147
 * such as <code>NumberFormat</code> have a number of convenience methods
148
 * for creating a default object of that type. For example, the
149
 * <code>NumberFormat</code> class provides these three convenience methods
150
 * for creating a default <code>NumberFormat</code> object:
151
 * \htmlonly<blockquote>\endhtmlonly
152
 * <pre>
153
 *     UErrorCode success = U_ZERO_ERROR;
154
 *     Locale myLocale;
155
 *     NumberFormat *nf;
156
 *
157
 *     nf = NumberFormat::createInstance( success );          delete nf;
158
 *     nf = NumberFormat::createCurrencyInstance( success );  delete nf;
159
 *     nf = NumberFormat::createPercentInstance( success );   delete nf;
160
 * </pre>
161
 * \htmlonly</blockquote>\endhtmlonly
162
 * Each of these methods has two variants; one with an explicit locale
163
 * and one without; the latter using the default locale.
164
 * \htmlonly<blockquote>\endhtmlonly
165
 * <pre>
166
 *     nf = NumberFormat::createInstance( myLocale, success );          delete nf;
167
 *     nf = NumberFormat::createCurrencyInstance( myLocale, success );  delete nf;
168
 *     nf = NumberFormat::createPercentInstance( myLocale, success );   delete nf;
169
 * </pre>
170
 * \htmlonly</blockquote>\endhtmlonly
171
 * A <code>Locale</code> is the mechanism for identifying the kind of object
172
 * (<code>NumberFormat</code>) that you would like to get. The locale is
173
 * <STRONG>just</STRONG> a mechanism for identifying objects,
174
 * <STRONG>not</STRONG> a container for the objects themselves.
175
 *
176
 * <P>
177
 * Each class that performs locale-sensitive operations allows you
178
 * to get all the available objects of that type. You can sift
179
 * through these objects by language, country, or variant,
180
 * and use the display names to present a menu to the user.
181
 * For example, you can create a menu of all the collation objects
182
 * suitable for a given language. Such classes implement these
183
 * three class methods:
184
 * \htmlonly<blockquote>\endhtmlonly
185
 * <pre>
186
 *       static Locale* getAvailableLocales(int32_t& numLocales)
187
 *       static UnicodeString& getDisplayName(const Locale&  objectLocale,
188
 *                                            const Locale&  displayLocale,
189
 *                                            UnicodeString& displayName)
190
 *       static UnicodeString& getDisplayName(const Locale&  objectLocale,
191
 *                                            UnicodeString& displayName)
192
 * </pre>
193
 * \htmlonly</blockquote>\endhtmlonly
194
 *
195
 * @stable ICU 2.0
196
 * @see ResourceBundle
197
 */
198
class U_COMMON_API_CLASS Locale : public UObject {
199
public:
200
    /** Useful constant for the Root locale. @stable ICU 4.4 */
201
    U_COMMON_API static const Locale& U_EXPORT2 getRoot();
202
    /** Useful constant for this language. @stable ICU 2.0 */
203
    U_COMMON_API static const Locale& U_EXPORT2 getEnglish();
204
    /** Useful constant for this language. @stable ICU 2.0 */
205
    U_COMMON_API static const Locale& U_EXPORT2 getFrench();
206
    /** Useful constant for this language. @stable ICU 2.0 */
207
    U_COMMON_API static const Locale& U_EXPORT2 getGerman();
208
    /** Useful constant for this language. @stable ICU 2.0 */
209
    U_COMMON_API static const Locale& U_EXPORT2 getItalian();
210
    /** Useful constant for this language. @stable ICU 2.0 */
211
    U_COMMON_API static const Locale& U_EXPORT2 getJapanese();
212
    /** Useful constant for this language. @stable ICU 2.0 */
213
    U_COMMON_API static const Locale& U_EXPORT2 getKorean();
214
    /** Useful constant for this language. @stable ICU 2.0 */
215
    U_COMMON_API static const Locale& U_EXPORT2 getChinese();
216
    /** Useful constant for this language. @stable ICU 2.0 */
217
    U_COMMON_API static const Locale& U_EXPORT2 getSimplifiedChinese();
218
    /** Useful constant for this language. @stable ICU 2.0 */
219
    U_COMMON_API static const Locale& U_EXPORT2 getTraditionalChinese();
220
221
    /** Useful constant for this country/region. @stable ICU 2.0 */
222
    U_COMMON_API static const Locale& U_EXPORT2 getFrance();
223
    /** Useful constant for this country/region. @stable ICU 2.0 */
224
    U_COMMON_API static const Locale& U_EXPORT2 getGermany();
225
    /** Useful constant for this country/region. @stable ICU 2.0 */
226
    U_COMMON_API static const Locale& U_EXPORT2 getItaly();
227
    /** Useful constant for this country/region. @stable ICU 2.0 */
228
    U_COMMON_API static const Locale& U_EXPORT2 getJapan();
229
    /** Useful constant for this country/region. @stable ICU 2.0 */
230
    U_COMMON_API static const Locale& U_EXPORT2 getKorea();
231
    /** Useful constant for this country/region. @stable ICU 2.0 */
232
    U_COMMON_API static const Locale& U_EXPORT2 getChina();
233
    /** Useful constant for this country/region. @stable ICU 2.0 */
234
    U_COMMON_API static const Locale& U_EXPORT2 getPRC();
235
    /** Useful constant for this country/region. @stable ICU 2.0 */
236
    U_COMMON_API static const Locale& U_EXPORT2 getTaiwan();
237
    /** Useful constant for this country/region. @stable ICU 2.0 */
238
    U_COMMON_API static const Locale& U_EXPORT2 getUK();
239
    /** Useful constant for this country/region. @stable ICU 2.0 */
240
    U_COMMON_API static const Locale& U_EXPORT2 getUS();
241
    /** Useful constant for this country/region. @stable ICU 2.0 */
242
    U_COMMON_API static const Locale& U_EXPORT2 getCanada();
243
    /** Useful constant for this country/region. @stable ICU 2.0 */
244
    U_COMMON_API static const Locale& U_EXPORT2 getCanadaFrench();
245
246
    /**
247
     * Construct a default locale object, a Locale for the default locale ID.
248
     *
249
     * @see getDefault
250
     * @see uloc_getDefault
251
     * @stable ICU 2.0
252
     */
253
    U_COMMON_API Locale();
254
255
    /**
256
     * Construct a locale from language, country, variant.
257
     * If an error occurs, then the constructed object will be "bogus"
258
     * (isBogus() will return true).
259
     *
260
     * @param language Lowercase two-letter or three-letter ISO-639 code.
261
     *  This parameter can instead be an ICU style C locale (e.g. "en_US"),
262
     *  but the other parameters must not be used.
263
     *  This parameter can be nullptr; if so,
264
     *  the locale is initialized to match the current default locale.
265
     *  (This is the same as using the default constructor.)
266
     *  Please note: The Java Locale class does NOT accept the form
267
     *  'new Locale("en_US")' but only 'new Locale("en","US")'
268
     *
269
     * @param country  Uppercase two-letter ISO-3166 code. (optional)
270
     * @param variant  Uppercase vendor and browser specific code. See class
271
     *                 description. (optional)
272
     * @param keywordsAndValues A string consisting of keyword/values pairs, such as
273
     *                 "collation=phonebook;currency=euro"
274
     *
275
     * @see getDefault
276
     * @see uloc_getDefault
277
     * @stable ICU 2.0
278
     */
279
    U_COMMON_API Locale(const char* language,
280
                        const char* country = nullptr,
281
                        const char* variant = nullptr,
282
                        const char* keywordsAndValues = nullptr);
283
284
    /**
285
     * Initializes a Locale object from another Locale object.
286
     *
287
     * @param other The Locale object being copied in.
288
     * @stable ICU 2.0
289
     */
290
    U_COMMON_API Locale(const Locale& other);
291
292
    /**
293
     * Move constructor; might leave source in bogus state.
294
     * This locale will have the same contents that the source locale had.
295
     *
296
     * @param other The Locale object being moved in.
297
     * @stable ICU 63
298
     */
299
    U_COMMON_API Locale(Locale&& other) noexcept;
300
301
    /**
302
     * Destructor
303
     * @stable ICU 2.0
304
     */
305
    U_COMMON_API virtual ~Locale();
306
307
    /**
308
     * Replaces the entire contents of *this with the specified value.
309
     *
310
     * @param other The Locale object being copied in.
311
     * @return      *this
312
     * @stable ICU 2.0
313
     */
314
    U_COMMON_API Locale& operator=(const Locale& other);
315
316
    /**
317
     * Move assignment operator; might leave source in bogus state.
318
     * This locale will have the same contents that the source locale had.
319
     * The behavior is undefined if *this and the source are the same object.
320
     *
321
     * @param other The Locale object being moved in.
322
     * @return      *this
323
     * @stable ICU 63
324
     */
325
    U_COMMON_API Locale& operator=(Locale&& other) noexcept;
326
327
    /**
328
     * Checks if two locale keys are the same.
329
     *
330
     * @param other The locale key object to be compared with this.
331
     * @return      true if the two locale keys are the same, false otherwise.
332
     * @stable ICU 2.0
333
     */
334
    U_COMMON_API bool operator==(const Locale& other) const;
335
336
    /**
337
     * Checks if two locale keys are not the same.
338
     *
339
     * @param other The locale key object to be compared with this.
340
     * @return      true if the two locale keys are not the same, false
341
     *              otherwise.
342
     * @stable ICU 2.0
343
     */
344
    U_COMMON_API inline bool operator!=(const Locale& other) const;
345
346
    /**
347
     * Clone this object.
348
     * Clones can be used concurrently in multiple threads.
349
     * If an error occurs, then nullptr is returned.
350
     * The caller must delete the clone.
351
     *
352
     * @return a clone of this object
353
     *
354
     * @see getDynamicClassID
355
     * @stable ICU 2.8
356
     */
357
    U_COMMON_API Locale* clone() const;
358
359
#ifndef U_HIDE_SYSTEM_API
360
    /**
361
     * Common methods of getting the current default Locale. Used for the
362
     * presentation: menus, dialogs, etc. Generally set once when your applet or
363
     * application is initialized, then never reset. (If you do reset the
364
     * default locale, you probably want to reload your GUI, so that the change
365
     * is reflected in your interface.)
366
     *
367
     * More advanced programs will allow users to use different locales for
368
     * different fields, e.g. in a spreadsheet.
369
     *
370
     * Note that the initial setting will match the host system.
371
     * @return a reference to the Locale object for the default locale ID
372
     * @system
373
     * @stable ICU 2.0
374
     */
375
    U_COMMON_API static const Locale& U_EXPORT2 getDefault();
376
377
    /**
378
     * Sets the default. Normally set once at the beginning of a process,
379
     * then never reset.
380
     * setDefault() only changes ICU's default locale ID, <strong>not</strong>
381
     * the default locale ID of the runtime environment.
382
     *
383
     * @param newLocale Locale to set to.  If nullptr, set to the value obtained
384
     *                  from the runtime environment.
385
     * @param success The error code.
386
     * @system
387
     * @stable ICU 2.0
388
     */
389
    U_COMMON_API static void U_EXPORT2 setDefault(const Locale& newLocale, UErrorCode& success);
390
#endif  /* U_HIDE_SYSTEM_API */
391
392
    /**
393
     * Returns a Locale for the specified BCP47 language tag string.
394
     * If the specified language tag contains any ill-formed subtags,
395
     * the first such subtag and all following subtags are ignored.
396
     * <p>
397
     * This implements the 'Language-Tag' production of BCP 47, and so
398
     * supports legacy language tags (marked as “Type: grandfathered” in BCP 47)
399
     * (regular and irregular) as well as private use language tags.
400
     *
401
     * Private use tags are represented as 'x-whatever',
402
     * and legacy tags are converted to their canonical replacements where they exist.
403
     *
404
     * Note that a few legacy tags have no modern replacement;
405
     * these will be converted using the fallback described in
406
     * the first paragraph, so some information might be lost.
407
     *
408
     * @param tag     the input BCP47 language tag.
409
     * @param status  error information if creating the Locale failed.
410
     * @return        the Locale for the specified BCP47 language tag.
411
     * @stable ICU 63
412
     */
413
    U_COMMON_API static Locale U_EXPORT2 forLanguageTag(StringPiece tag, UErrorCode& status);
414
415
    /**
416
     * Returns a well-formed language tag for this Locale.
417
     * <p>
418
     * <b>Note</b>: Any locale fields which do not satisfy the BCP47 syntax
419
     * requirement will be silently omitted from the result.
420
     *
421
     * If this function fails, partial output may have been written to the sink.
422
     *
423
     * @param sink    the output sink receiving the BCP47 language
424
     *                tag for this Locale.
425
     * @param status  error information if creating the language tag failed.
426
     * @stable ICU 63
427
     */
428
    U_COMMON_API void toLanguageTag(ByteSink& sink, UErrorCode& status) const;
429
430
    /**
431
     * Returns a well-formed language tag for this Locale.
432
     * <p>
433
     * <b>Note</b>: Any locale fields which do not satisfy the BCP47 syntax
434
     * requirement will be silently omitted from the result.
435
     *
436
     * @param status  error information if creating the language tag failed.
437
     * @return        the BCP47 language tag for this Locale.
438
     * @stable ICU 63
439
     */
440
    template<typename StringClass>
441
    inline StringClass toLanguageTag(UErrorCode& status) const;
442
443
    /**
444
     * Creates a locale which has had minimal canonicalization
445
     * as per uloc_getName().
446
     * @param name The name to create from.  If name is null,
447
     *  the default Locale is used.
448
     * @return new locale object
449
     * @stable ICU 2.0
450
     * @see uloc_getName
451
     */
452
    U_COMMON_API static Locale U_EXPORT2 createFromName(const char* name);
453
454
#ifndef U_HIDE_INTERNAL_API
455
    /** @internal */
456
    U_COMMON_API static Locale U_EXPORT2 createFromName(StringPiece name);
457
#endif  /* U_HIDE_INTERNAL_API */
458
459
    /**
460
     * Creates a locale from the given string after canonicalizing
461
     * the string according to CLDR by calling uloc_canonicalize().
462
     * @param name the locale ID to create from.  Must not be nullptr.
463
     * @return a new locale object corresponding to the given name
464
     * @stable ICU 3.0
465
     * @see uloc_canonicalize
466
     */
467
    U_COMMON_API static Locale U_EXPORT2 createCanonical(const char* name);
468
469
    /**
470
     * Returns the locale's ISO-639 language code.
471
     * @return      An alias to the code
472
     * @stable ICU 2.0
473
     */
474
    U_COMMON_API const char* getLanguage() const;
475
476
    /**
477
     * Returns the locale's ISO-15924 abbreviation script code.
478
     * @return      An alias to the code
479
     * @see uscript_getShortName
480
     * @see uscript_getCode
481
     * @stable ICU 2.8
482
     */
483
    U_COMMON_API const char* getScript() const;
484
485
    /**
486
     * Returns the locale's ISO-3166 country code.
487
     * @return      An alias to the code
488
     * @stable ICU 2.0
489
     */
490
    U_COMMON_API const char* getCountry() const;
491
492
    /**
493
     * Returns the locale's variant code.
494
     * @return      An alias to the code
495
     * @stable ICU 2.0
496
     */
497
    U_COMMON_API const char* getVariant() const;
498
499
    /**
500
     * Returns the programmatic name of the entire locale, with the language,
501
     * country and variant separated by underbars. If a field is missing, up
502
     * to two leading underbars will occur. Example: "en", "de_DE", "en_US_WIN",
503
     * "de__POSIX", "fr__MAC", "__MAC", "_MT", "_FR_EURO"
504
     * @return      A pointer to "name".
505
     * @stable ICU 2.0
506
     */
507
    U_COMMON_API const char* getName() const;
508
509
    /**
510
     * Returns the programmatic name of the entire locale as getName() would return,
511
     * but without keywords.
512
     * @return      A pointer to "name".
513
     * @see getName
514
     * @stable ICU 2.8
515
     */
516
    U_COMMON_API const char* getBaseName() const;
517
518
    /**
519
     * Add the likely subtags for this Locale, per the algorithm described
520
     * in the following CLDR technical report:
521
     *
522
     *   http://www.unicode.org/reports/tr35/#Likely_Subtags
523
     *
524
     * If this Locale is already in the maximal form, or not valid, or there is
525
     * no data available for maximization, the Locale will be unchanged.
526
     *
527
     * For example, "sh" cannot be maximized, since there is no
528
     * reasonable maximization.
529
     *
530
     * Examples:
531
     *
532
     * "und_Zzzz" maximizes to "en_Latn_US"
533
     *
534
     * "en" maximizes to "en_Latn_US"
535
     *
536
     * "de" maximizes to "de_Latn_DE"
537
     *
538
     * "sr" maximizes to "sr_Cyrl_RS"
539
     *
540
     * "zh_Hani" maximizes to "zh_Hani_CN"
541
     *
542
     * @param status  error information if maximizing this Locale failed.
543
     *                If this Locale is not well-formed, the error code is
544
     *                U_ILLEGAL_ARGUMENT_ERROR.
545
     * @stable ICU 63
546
     */
547
    U_COMMON_API void addLikelySubtags(UErrorCode& status);
548
549
    /**
550
     * Minimize the subtags for this Locale, per the algorithm described
551
     * in the following CLDR technical report:
552
     *
553
     *   http://www.unicode.org/reports/tr35/#Likely_Subtags
554
     *
555
     * If this Locale is already in the minimal form, or not valid, or there is
556
     * no data available for minimization, the Locale will be unchanged.
557
     *
558
     * Since the minimization algorithm relies on proper maximization, see the
559
     * comments for addLikelySubtags for reasons why there might not be any
560
     * data.
561
     *
562
     * Examples:
563
     *
564
     * "en_Latn_US" minimizes to "en"
565
     *
566
     * "de_Latn_US" minimizes to "de"
567
     *
568
     * "sr_Cyrl_RS" minimizes to "sr"
569
     *
570
     * "zh_Hant_TW" minimizes to "zh_TW" (The region is preferred to the
571
     * script, and minimizing to "zh" would imply "zh_Hans_CN".)
572
     *
573
     * @param status  error information if maximizing this Locale failed.
574
     *                If this Locale is not well-formed, the error code is
575
     *                U_ILLEGAL_ARGUMENT_ERROR.
576
     * @stable ICU 63
577
     */
578
    U_COMMON_API void minimizeSubtags(UErrorCode& status);
579
580
    /**
581
     * Canonicalize the locale ID of this object according to CLDR.
582
     * @param status the status code
583
     * @stable ICU 67
584
     * @see createCanonical
585
     */
586
    U_COMMON_API void canonicalize(UErrorCode& status);
587
588
    /**
589
     * Gets the list of keywords for the specified locale.
590
     *
591
     * @param status the status code
592
     * @return pointer to StringEnumeration class, or nullptr if there are no keywords.
593
     * Client must dispose of it by calling delete.
594
     * @see getKeywords
595
     * @stable ICU 2.8
596
     */
597
    U_COMMON_API StringEnumeration* createKeywords(UErrorCode& status) const;
598
599
    /**
600
     * Gets the list of Unicode keywords for the specified locale.
601
     *
602
     * @param status the status code
603
     * @return pointer to StringEnumeration class, or nullptr if there are no keywords.
604
     * Client must dispose of it by calling delete.
605
     * @see getUnicodeKeywords
606
     * @stable ICU 63
607
     */
608
    U_COMMON_API StringEnumeration* createUnicodeKeywords(UErrorCode& status) const;
609
610
    /**
611
     * Gets the set of keywords for this Locale.
612
     *
613
     * A wrapper to call createKeywords() and write the resulting
614
     * keywords as standard strings (or compatible objects) into any kind of
615
     * container that can be written to by an STL style output iterator.
616
     *
617
     * @param iterator  an STL style output iterator to write the keywords to.
618
     * @param status    error information if creating set of keywords failed.
619
     * @stable ICU 63
620
     */
621
    template<typename StringClass, typename OutputIterator>
622
    inline void getKeywords(OutputIterator iterator, UErrorCode& status) const;
623
624
    /**
625
     * Gets the set of Unicode keywords for this Locale.
626
     *
627
     * A wrapper to call createUnicodeKeywords() and write the resulting
628
     * keywords as standard strings (or compatible objects) into any kind of
629
     * container that can be written to by an STL style output iterator.
630
     *
631
     * @param iterator  an STL style output iterator to write the keywords to.
632
     * @param status    error information if creating set of keywords failed.
633
     * @stable ICU 63
634
     */
635
    template<typename StringClass, typename OutputIterator>
636
    inline void getUnicodeKeywords(OutputIterator iterator, UErrorCode& status) const;
637
638
    /**
639
     * Gets the value for a keyword.
640
     *
641
     * This uses legacy keyword=value pairs, like "collation=phonebook".
642
     *
643
     * ICU4C doesn't do automatic conversion between legacy and Unicode
644
     * keywords and values in getters and setters (as opposed to ICU4J).
645
     *
646
     * @param keywordName name of the keyword for which we want the value. Case insensitive.
647
     * @param buffer The buffer to receive the keyword value.
648
     * @param bufferCapacity The capacity of receiving buffer
649
     * @param status Returns any error information while performing this operation.
650
     * @return the length of the keyword value
651
     *
652
     * @stable ICU 2.8
653
     */
654
    U_COMMON_API int32_t getKeywordValue(const char* keywordName,
655
                                         char* buffer,
656
                                         int32_t bufferCapacity,
657
                                         UErrorCode& status) const;
658
659
    /**
660
     * Gets the value for a keyword.
661
     *
662
     * This uses legacy keyword=value pairs, like "collation=phonebook".
663
     *
664
     * ICU4C doesn't do automatic conversion between legacy and Unicode
665
     * keywords and values in getters and setters (as opposed to ICU4J).
666
     *
667
     * @param keywordName  name of the keyword for which we want the value.
668
     * @param sink         the sink to receive the keyword value.
669
     * @param status       error information if getting the value failed.
670
     * @stable ICU 63
671
     */
672
    U_COMMON_API void getKeywordValue(StringPiece keywordName, ByteSink& sink, UErrorCode& status) const;
673
674
    /**
675
     * Gets the value for a keyword.
676
     *
677
     * This uses legacy keyword=value pairs, like "collation=phonebook".
678
     *
679
     * ICU4C doesn't do automatic conversion between legacy and Unicode
680
     * keywords and values in getters and setters (as opposed to ICU4J).
681
     *
682
     * @param keywordName  name of the keyword for which we want the value.
683
     * @param status       error information if getting the value failed.
684
     * @return             the keyword value.
685
     * @stable ICU 63
686
     */
687
    template<typename StringClass>
688
    inline StringClass getKeywordValue(StringPiece keywordName, UErrorCode& status) const;
689
690
    /**
691
     * Gets the Unicode value for a Unicode keyword.
692
     *
693
     * This uses Unicode key-value pairs, like "co-phonebk".
694
     *
695
     * ICU4C doesn't do automatic conversion between legacy and Unicode
696
     * keywords and values in getters and setters (as opposed to ICU4J).
697
     *
698
     * @param keywordName  name of the keyword for which we want the value.
699
     * @param sink         the sink to receive the keyword value.
700
     * @param status       error information if getting the value failed.
701
     * @stable ICU 63
702
     */
703
    U_COMMON_API void getUnicodeKeywordValue(StringPiece keywordName,
704
                                             ByteSink& sink,
705
                                             UErrorCode& status) const;
706
707
    /**
708
     * Gets the Unicode value for a Unicode keyword.
709
     *
710
     * This uses Unicode key-value pairs, like "co-phonebk".
711
     *
712
     * ICU4C doesn't do automatic conversion between legacy and Unicode
713
     * keywords and values in getters and setters (as opposed to ICU4J).
714
     *
715
     * @param keywordName  name of the keyword for which we want the value.
716
     * @param status       error information if getting the value failed.
717
     * @return             the keyword value.
718
     * @stable ICU 63
719
     */
720
    template<typename StringClass>
721
    inline StringClass getUnicodeKeywordValue(StringPiece keywordName, UErrorCode& status) const;
722
723
    /**
724
     * Sets or removes the value for a keyword.
725
     *
726
     * For removing all keywords, use getBaseName(),
727
     * and construct a new Locale if it differs from getName().
728
     *
729
     * This uses legacy keyword=value pairs, like "collation=phonebook".
730
     *
731
     * ICU4C doesn't do automatic conversion between legacy and Unicode
732
     * keywords and values in getters and setters (as opposed to ICU4J).
733
     *
734
     * @param keywordName name of the keyword to be set. Case insensitive.
735
     * @param keywordValue value of the keyword to be set. If 0-length or
736
     *  nullptr, will result in the keyword being removed. No error is given if
737
     *  that keyword does not exist.
738
     * @param status Returns any error information while performing this operation.
739
     *
740
     * @stable ICU 49
741
     */
742
    U_COMMON_API void setKeywordValue(const char* keywordName,
743
                                      const char* keywordValue,
744
10.9k
                                      UErrorCode& status) {
745
10.9k
        setKeywordValue(StringPiece{keywordName}, StringPiece{keywordValue}, status);
746
10.9k
    }
747
748
    /**
749
     * Sets or removes the value for a keyword.
750
     *
751
     * For removing all keywords, use getBaseName(),
752
     * and construct a new Locale if it differs from getName().
753
     *
754
     * This uses legacy keyword=value pairs, like "collation=phonebook".
755
     *
756
     * ICU4C doesn't do automatic conversion between legacy and Unicode
757
     * keywords and values in getters and setters (as opposed to ICU4J).
758
     *
759
     * @param keywordName name of the keyword to be set.
760
     * @param keywordValue value of the keyword to be set. If 0-length or
761
     *  nullptr, will result in the keyword being removed. No error is given if
762
     *  that keyword does not exist.
763
     * @param status Returns any error information while performing this operation.
764
     * @stable ICU 63
765
     */
766
    U_COMMON_API void setKeywordValue(StringPiece keywordName,
767
                                      StringPiece keywordValue,
768
                                      UErrorCode& status);
769
770
    /**
771
     * Sets or removes the Unicode value for a Unicode keyword.
772
     *
773
     * For removing all keywords, use getBaseName(),
774
     * and construct a new Locale if it differs from getName().
775
     *
776
     * This uses Unicode key-value pairs, like "co-phonebk".
777
     *
778
     * ICU4C doesn't do automatic conversion between legacy and Unicode
779
     * keywords and values in getters and setters (as opposed to ICU4J).
780
     *
781
     * @param keywordName name of the keyword to be set.
782
     * @param keywordValue value of the keyword to be set. If 0-length or
783
     *  nullptr, will result in the keyword being removed. No error is given if
784
     *  that keyword does not exist.
785
     * @param status Returns any error information while performing this operation.
786
     * @stable ICU 63
787
     */
788
    U_COMMON_API void setUnicodeKeywordValue(StringPiece keywordName,
789
                                             StringPiece keywordValue,
790
                                             UErrorCode& status);
791
792
    /**
793
     * returns the locale's three-letter language code, as specified
794
     * in ISO draft standard ISO-639-2.
795
     * @return      An alias to the code, or an empty string
796
     * @stable ICU 2.0
797
     */
798
    U_COMMON_API const char* getISO3Language() const;
799
800
    /**
801
     * Fills in "name" with the locale's three-letter ISO-3166 country code.
802
     * @return      An alias to the code, or an empty string
803
     * @stable ICU 2.0
804
     */
805
    U_COMMON_API const char* getISO3Country() const;
806
807
    /**
808
     * Returns the Windows LCID value corresponding to this locale.
809
     * This value is stored in the resource data for the locale as a one-to-four-digit
810
     * hexadecimal number.  If the resource is missing, in the wrong format, or
811
     * there is no Windows LCID value that corresponds to this locale, returns 0.
812
     * @stable ICU 2.0
813
     */
814
    U_COMMON_API uint32_t getLCID() const;
815
816
    /**
817
     * Returns whether this locale's script is written right-to-left.
818
     * If there is no script subtag, then the likely script is used, see uloc_addLikelySubtags().
819
     * If no likely script is known, then false is returned.
820
     *
821
     * A script is right-to-left according to the CLDR script metadata
822
     * which corresponds to whether the script's letters have Bidi_Class=R or AL.
823
     *
824
     * Returns true for "ar" and "en-Hebr", false for "zh" and "fa-Cyrl".
825
     *
826
     * @return true if the locale's script is written right-to-left
827
     * @stable ICU 54
828
     */
829
    U_COMMON_API UBool isRightToLeft() const;
830
831
    /**
832
     * Fills in "dispLang" with the name of this locale's language in a format suitable for
833
     * user display in the default locale.  For example, if the locale's language code is
834
     * "fr" and the default locale's language code is "en", this function would set
835
     * dispLang to "French".
836
     * @param dispLang  Receives the language's display name.
837
     * @return          A reference to "dispLang".
838
     * @stable ICU 2.0
839
     */
840
    U_COMMON_API UnicodeString& getDisplayLanguage(UnicodeString& dispLang) const;
841
842
    /**
843
     * Fills in "dispLang" with the name of this locale's language in a format suitable for
844
     * user display in the locale specified by "displayLocale".  For example, if the locale's
845
     * language code is "en" and displayLocale's language code is "fr", this function would set
846
     * dispLang to "Anglais".
847
     * @param displayLocale  Specifies the locale to be used to display the name.  In other words,
848
     *                  if the locale's language code is "en", passing Locale::getFrench() for
849
     *                  displayLocale would result in "Anglais", while passing Locale::getGerman()
850
     *                  for displayLocale would result in "Englisch".
851
     * @param dispLang  Receives the language's display name.
852
     * @return          A reference to "dispLang".
853
     * @stable ICU 2.0
854
     */
855
    U_COMMON_API UnicodeString& getDisplayLanguage(const Locale& displayLocale,
856
                                                   UnicodeString& dispLang) const;
857
858
    /**
859
     * Fills in "dispScript" with the name of this locale's script in a format suitable
860
     * for user display in the default locale.  For example, if the locale's script code
861
     * is "LATN" and the default locale's language code is "en", this function would set
862
     * dispScript to "Latin".
863
     * @param dispScript    Receives the scripts's display name.
864
     * @return              A reference to "dispScript".
865
     * @stable ICU 2.8
866
     */
867
    U_COMMON_API UnicodeString& getDisplayScript(UnicodeString& dispScript) const;
868
869
    /**
870
     * Fills in "dispScript" with the name of this locale's country in a format suitable
871
     * for user display in the locale specified by "displayLocale".  For example, if the locale's
872
     * script code is "LATN" and displayLocale's language code is "en", this function would set
873
     * dispScript to "Latin".
874
     * @param displayLocale      Specifies the locale to be used to display the name.  In other
875
     *                      words, if the locale's script code is "LATN", passing
876
     *                      Locale::getFrench() for displayLocale would result in "", while
877
     *                      passing Locale::getGerman() for displayLocale would result in
878
     *                      "".
879
     * @param dispScript    Receives the scripts's display name.
880
     * @return              A reference to "dispScript".
881
     * @stable ICU 2.8
882
     */
883
    U_COMMON_API UnicodeString& getDisplayScript(const Locale& displayLocale,
884
                                                 UnicodeString& dispScript) const;
885
886
    /**
887
     * Fills in "dispCountry" with the name of this locale's country in a format suitable
888
     * for user display in the default locale.  For example, if the locale's country code
889
     * is "FR" and the default locale's language code is "en", this function would set
890
     * dispCountry to "France".
891
     * @param dispCountry   Receives the country's display name.
892
     * @return              A reference to "dispCountry".
893
     * @stable ICU 2.0
894
     */
895
    U_COMMON_API UnicodeString& getDisplayCountry(UnicodeString& dispCountry) const;
896
897
    /**
898
     * Fills in "dispCountry" with the name of this locale's country in a format suitable
899
     * for user display in the locale specified by "displayLocale".  For example, if the locale's
900
     * country code is "US" and displayLocale's language code is "fr", this function would set
901
     * dispCountry to "&Eacute;tats-Unis".
902
     * @param displayLocale      Specifies the locale to be used to display the name.  In other
903
     *                      words, if the locale's country code is "US", passing
904
     *                      Locale::getFrench() for displayLocale would result in "&Eacute;tats-Unis", while
905
     *                      passing Locale::getGerman() for displayLocale would result in
906
     *                      "Vereinigte Staaten".
907
     * @param dispCountry   Receives the country's display name.
908
     * @return              A reference to "dispCountry".
909
     * @stable ICU 2.0
910
     */
911
    U_COMMON_API UnicodeString& getDisplayCountry(const Locale& displayLocale,
912
                                                  UnicodeString& dispCountry) const;
913
914
    /**
915
     * Fills in "dispVar" with the name of this locale's variant code in a format suitable
916
     * for user display in the default locale.
917
     * @param dispVar   Receives the variant's name.
918
     * @return          A reference to "dispVar".
919
     * @stable ICU 2.0
920
     */
921
    U_COMMON_API UnicodeString& getDisplayVariant(UnicodeString& dispVar) const;
922
923
    /**
924
     * Fills in "dispVar" with the name of this locale's variant code in a format
925
     * suitable for user display in the locale specified by "displayLocale".
926
     * @param displayLocale  Specifies the locale to be used to display the name.
927
     * @param dispVar   Receives the variant's display name.
928
     * @return          A reference to "dispVar".
929
     * @stable ICU 2.0
930
     */
931
    U_COMMON_API UnicodeString& getDisplayVariant(const Locale& displayLocale,
932
                                                  UnicodeString& dispVar) const;
933
934
    /**
935
     * Fills in "name" with the name of this locale in a format suitable for user display
936
     * in the default locale.  This function uses getDisplayLanguage(), getDisplayCountry(),
937
     * and getDisplayVariant() to do its work, and outputs the display name in the format
938
     * "language (country[,variant])".  For example, if the default locale is en_US, then
939
     * fr_FR's display name would be "French (France)", and es_MX_Traditional's display name
940
     * would be "Spanish (Mexico,Traditional)".
941
     * @param name  Receives the locale's display name.
942
     * @return      A reference to "name".
943
     * @stable ICU 2.0
944
     */
945
    U_COMMON_API UnicodeString& getDisplayName(UnicodeString& name) const;
946
947
    /**
948
     * Fills in "name" with the name of this locale in a format suitable for user display
949
     * in the locale specified by "displayLocale".  This function uses getDisplayLanguage(),
950
     * getDisplayCountry(), and getDisplayVariant() to do its work, and outputs the display
951
     * name in the format "language (country[,variant])".  For example, if displayLocale is
952
     * fr_FR, then en_US's display name would be "Anglais (&Eacute;tats-Unis)", and no_NO_NY's
953
     * display name would be "norv&eacute;gien (Norv&egrave;ge,NY)".
954
     * @param displayLocale  Specifies the locale to be used to display the name.
955
     * @param name      Receives the locale's display name.
956
     * @return          A reference to "name".
957
     * @stable ICU 2.0
958
     */
959
    U_COMMON_API UnicodeString& getDisplayName(const Locale& displayLocale, UnicodeString& name) const;
960
961
    /**
962
     * Generates a hash code for the locale.
963
     * @stable ICU 2.0
964
     */
965
    U_COMMON_API int32_t hashCode() const;
966
967
    /**
968
     * Sets the locale to bogus
969
     * A bogus locale represents a non-existing locale associated
970
     * with services that can be instantiated from non-locale data
971
     * in addition to locale (for example, collation can be
972
     * instantiated from a locale and from a rule set).
973
     * @stable ICU 2.1
974
     */
975
    U_COMMON_API void setToBogus();
976
977
    /**
978
     * Gets the bogus state. Locale object can be bogus if it doesn't exist
979
     * @return false if it is a real locale, true if it is a bogus locale
980
     * @stable ICU 2.1
981
     */
982
    U_COMMON_API inline UBool isBogus() const;
983
984
    /**
985
     * Returns a list of all installed locales.
986
     * @param count Receives the number of locales in the list.
987
     * @return      A pointer to an array of Locale objects.  This array is the list
988
     *              of all locales with installed resource files.  The called does NOT
989
     *              get ownership of this list, and must NOT delete it.
990
     * @stable ICU 2.0
991
     */
992
    U_COMMON_API static const Locale* U_EXPORT2 getAvailableLocales(int32_t& count);
993
994
    /**
995
     * Gets a list of all available 2-letter country codes defined in ISO 3166.  This is a
996
     * pointer to an array of pointers to arrays of char.  All of these pointers are
997
     * owned by ICU-- do not delete them, and do not write through them.  The array is
998
     * terminated with a null pointer.
999
     * @return a list of all available country codes
1000
     * @stable ICU 2.0
1001
     */
1002
    U_COMMON_API static const char* const* U_EXPORT2 getISOCountries();
1003
1004
    /**
1005
     * Returns a list of all unique language codes defined in ISO 639.
1006
     * They can be 2 or 3 letter codes, as defined by
1007
     * <a href="https://www.ietf.org/rfc/bcp/bcp47.html#section-2.2.1">
1008
     * BCP 47, section 2.2.1</a>. This is a pointer
1009
     * to an array of pointers to arrays of char.  All of these pointers are owned
1010
     * by ICU-- do not delete them, and do not write through them.  The array is
1011
     * terminated with a null pointer.
1012
     * @return a list of all available language codes
1013
     * @stable ICU 2.0
1014
     */
1015
    U_COMMON_API static const char* const* U_EXPORT2 getISOLanguages();
1016
1017
    /**
1018
     * ICU "poor man's RTTI", returns a UClassID for this class.
1019
     *
1020
     * @stable ICU 2.2
1021
     */
1022
    U_COMMON_API static UClassID U_EXPORT2 getStaticClassID();
1023
1024
    /**
1025
     * ICU "poor man's RTTI", returns a UClassID for the actual class.
1026
     *
1027
     * @stable ICU 2.2
1028
     */
1029
    U_COMMON_API virtual UClassID getDynamicClassID() const override;
1030
1031
    /**
1032
     * A Locale iterator interface similar to a Java Iterator<Locale>.
1033
     * @stable ICU 65
1034
     */
1035
    class U_COMMON_API Iterator /* not : public UObject because this is an interface/mixin class */ {
1036
    public:
1037
        /** @stable ICU 65 */
1038
        virtual ~Iterator();
1039
1040
        /**
1041
         * @return true if next() can be called again.
1042
         * @stable ICU 65
1043
         */
1044
        virtual UBool hasNext() const = 0;
1045
1046
        /**
1047
         * @return the next locale.
1048
         * @stable ICU 65
1049
         */
1050
        virtual const Locale &next() = 0;
1051
    };
1052
1053
    /**
1054
     * A generic Locale iterator implementation over Locale input iterators.
1055
     * @stable ICU 65
1056
     */
1057
    template<typename Iter>
1058
    class RangeIterator : public Iterator, public UMemory {
1059
    public:
1060
        /**
1061
         * Constructs an iterator from a begin/end range.
1062
         * Each of the iterator parameter values must be an
1063
         * input iterator whose value is convertible to const Locale &.
1064
         *
1065
         * @param begin Start of range.
1066
         * @param end Exclusive end of range.
1067
         * @stable ICU 65
1068
         */
1069
        RangeIterator(Iter begin, Iter end) : it_(begin), end_(end) {}
1070
1071
        /**
1072
         * @return true if next() can be called again.
1073
         * @stable ICU 65
1074
         */
1075
        UBool hasNext() const override { return it_ != end_; }
1076
1077
        /**
1078
         * @return the next locale.
1079
         * @stable ICU 65
1080
         */
1081
        const Locale &next() override { return *it_++; }
1082
1083
    private:
1084
        Iter it_;
1085
        const Iter end_;
1086
    };
1087
1088
    /**
1089
     * A generic Locale iterator implementation over Locale input iterators.
1090
     * Calls the converter to convert each *begin to a const Locale &.
1091
     * @stable ICU 65
1092
     */
1093
    template<typename Iter, typename Conv>
1094
    class ConvertingIterator : public Iterator, public UMemory {
1095
    public:
1096
        /**
1097
         * Constructs an iterator from a begin/end range.
1098
         * Each of the iterator parameter values must be an
1099
         * input iterator whose value the converter converts to const Locale &.
1100
         *
1101
         * @param begin Start of range.
1102
         * @param end Exclusive end of range.
1103
         * @param converter Converter from *begin to const Locale & or compatible.
1104
         * @stable ICU 65
1105
         */
1106
        ConvertingIterator(Iter begin, Iter end, Conv converter) :
1107
                it_(begin), end_(end), converter_(converter) {}
1108
1109
        /**
1110
         * @return true if next() can be called again.
1111
         * @stable ICU 65
1112
         */
1113
        UBool hasNext() const override { return it_ != end_; }
1114
1115
        /**
1116
         * @return the next locale.
1117
         * @stable ICU 65
1118
         */
1119
        const Locale &next() override { return converter_(*it_++); }
1120
1121
    private:
1122
        Iter it_;
1123
        const Iter end_;
1124
        Conv converter_;
1125
    };
1126
1127
protected: /* only protected for testing purposes. DO NOT USE. */
1128
#ifndef U_HIDE_INTERNAL_API
1129
    /**
1130
     * Set this from a single POSIX style locale string.
1131
     * @internal
1132
     */
1133
    U_COMMON_API void setFromPOSIXID(const char* posixID);
1134
    /**
1135
     * Minimize the subtags for this Locale, per the algorithm described
1136
     * @param favorScript favor to keep script if true, to keep region if false.
1137
     * @param status  error information if maximizing this Locale failed.
1138
     *                If this Locale is not well-formed, the error code is
1139
     *                U_ILLEGAL_ARGUMENT_ERROR.
1140
     * @internal
1141
     */
1142
    U_COMMON_API void minimizeSubtags(bool favorScript, UErrorCode& status);
1143
#endif  /* U_HIDE_INTERNAL_API */
1144
1145
private:
1146
    /**
1147
     * Initialize the locale object with a new name.
1148
     * Was deprecated - used in implementation - moved internal
1149
     *
1150
     * @param cLocaleID The new locale name.
1151
     * @param canonicalize whether to call uloc_canonicalize on cLocaleID
1152
     */
1153
    Locale& init(const char* localeID, UBool canonicalize);
1154
    Locale& init(StringPiece localeID, UBool canonicalize);
1155
1156
    /*
1157
     * Internal constructor to allow construction of a locale object with
1158
     *   NO side effects.   (Default constructor tries to get
1159
     *   the default locale.)
1160
     */
1161
    enum ELocaleType : uint8_t {
1162
        eBOGUS,
1163
        eNEST,
1164
        eHEAP,
1165
    };
1166
    Locale(ELocaleType);
1167
1168
    /**
1169
     * Initialize the locale cache for commonly used locales
1170
     */
1171
    static Locale* getLocaleCache();
1172
1173
    union Payload;
1174
    struct Nest;
1175
    struct Heap;
1176
1177
    /**
1178
     * Locale data that can be nested directly within the union Payload object.
1179
     */
1180
    struct Nest {
1181
        static constexpr size_t SIZE = 32;
1182
1183
        ELocaleType type = eNEST;
1184
        char language[4];
1185
        char script[5];
1186
        char region[4];
1187
        uint8_t variantBegin;
1188
        char baseName[SIZE -
1189
                      sizeof type -
1190
                      sizeof language -
1191
                      sizeof script -
1192
                      sizeof region -
1193
                      sizeof variantBegin];
1194
1195
128k
        const char* getLanguage() const { return language; }
1196
59.6k
        const char* getScript() const { return script; }
1197
89.4k
        const char* getRegion() const { return region; }
1198
48.2k
        const char* getVariant() const { return variantBegin == 0 ? "" : getBaseName() + variantBegin; }
1199
18.3M
        const char* getBaseName() const { return baseName; }
1200
1201
        // Doesn't inherit from UMemory, shouldn't be heap allocated.
1202
        static void* U_EXPORT2 operator new(size_t) noexcept = delete;
1203
        static void* U_EXPORT2 operator new[](size_t) noexcept = delete;
1204
1205
1.44M
        Nest() : language{'\0'}, script{'\0'}, region{'\0'}, variantBegin{0}, baseName{'\0'} {}
1206
1207
        void init(std::string_view language,
1208
                  std::string_view script,
1209
                  std::string_view region,
1210
                  uint8_t variantBegin);
1211
1212
        static bool fits(int32_t length,
1213
                         std::string_view language,
1214
                         std::string_view script,
1215
1.38M
                         std::string_view region) {
1216
1.38M
            return length < static_cast<int32_t>(sizeof Nest::baseName) &&
1217
1.36M
                   language.size() < sizeof Nest::language &&
1218
1.35M
                   script.size() < sizeof Nest::script &&
1219
1.35M
                   region.size() < sizeof Nest::region;
1220
1.38M
        }
1221
1222
      private:
1223
        friend union Payload;
1224
        Nest(Heap&& heap, uint8_t variantBegin);
1225
    };
1226
    static_assert(sizeof(Nest) == Nest::SIZE);
1227
1228
    /**
1229
     * Locale data that needs to be heap allocated in the union Payload object.
1230
     */
1231
    struct Heap {
1232
        struct Alloc;
1233
1234
        ELocaleType type;
1235
        char language[ULOC_LANG_CAPACITY];
1236
        char script[ULOC_SCRIPT_CAPACITY];
1237
        char region[ULOC_COUNTRY_CAPACITY];
1238
        Alloc* ptr;
1239
1240
49.2k
        const char* getLanguage() const { return language; }
1241
31.4k
        const char* getScript() const { return script; }
1242
48.5k
        const char* getRegion() const { return region; }
1243
        const char* getVariant() const;
1244
        const char* getFullName() const;
1245
        const char* getBaseName() const;
1246
1247
        // Doesn't inherit from UMemory, shouldn't be heap allocated.
1248
        static void* U_EXPORT2 operator new(size_t) noexcept = delete;
1249
        static void* U_EXPORT2 operator new[](size_t) noexcept = delete;
1250
1251
        Heap(std::string_view language,
1252
             std::string_view script,
1253
             std::string_view region,
1254
             int32_t variantBegin);
1255
        ~Heap();
1256
1257
        Heap& operator=(const Heap& other);
1258
        Heap& operator=(Heap&& other) noexcept;
1259
    };
1260
    static_assert(sizeof(Heap) <= sizeof(Nest));
1261
1262
    /**
1263
     * This is kind of std::variant but customized to not waste any space on the
1264
     * discriminator or on any padding, and to copy any heap allocated object.
1265
     */
1266
    union Payload {
1267
      private:
1268
        Nest nest;
1269
        Heap heap;
1270
        ELocaleType type;
1271
1272
        void copy(const Payload& other);
1273
        void move(Payload&& other) noexcept;
1274
1275
      public:
1276
        // Doesn't inherit from UMemory, shouldn't be heap allocated.
1277
        static void* U_EXPORT2 operator new(size_t) noexcept = delete;
1278
        static void* U_EXPORT2 operator new[](size_t) noexcept = delete;
1279
1280
8.82M
        Payload() : type{eBOGUS} {}
1281
        ~Payload();
1282
1283
        Payload(const Payload& other);
1284
        Payload(Payload&& other) noexcept;
1285
1286
        Payload& operator=(const Payload& other);
1287
        Payload& operator=(Payload&& other) noexcept;
1288
1289
        void setToBogus();
1290
317k
        bool isBogus() const { return type == eBOGUS; }
1291
1292
        template <typename T, typename... Args> T& emplace(Args&&... args);
1293
1294
        template <typename T> T* get();
1295
1296
        template <typename BogusFn, typename NestFn, typename HeapFn, typename... Args>
1297
        auto visit(BogusFn bogusFn, NestFn nestFn, HeapFn heapFn, Args... args) const;
1298
    } payload;
1299
1300
    /**
1301
     * Call a field getter function on either Nest or Heap in payload.
1302
     * (This is kind of std::visit but simpler and without exceptions.)
1303
     *
1304
     * @tparam NEST Pointer to the Nest getter function.
1305
     * @tparam HEAP Pointer to the Heap getter function.
1306
     * @return the result from the getter, or the empty string if isBogus().
1307
     */
1308
    template <const char* (Nest::*const NEST)() const,
1309
              const char* (Heap::*const HEAP)() const>
1310
    const char* getField() const;
1311
1312
    static const Locale &getLocale(int locid);
1313
1314
    /**
1315
     * A friend to allow the default locale to be set by either the C or C++ API.
1316
     */
1317
    friend Locale *locale_set_default_internal(const char *, UErrorCode& status);
1318
1319
    /**
1320
     */
1321
    friend void U_CALLCONV locale_available_init();
1322
};
1323
1324
U_COMMON_API inline bool
1325
Locale::operator!=(const    Locale&     other) const
1326
16.4k
{
1327
16.4k
    return !operator==(other);
1328
16.4k
}
1329
1330
template<typename StringClass> inline StringClass
1331
Locale::toLanguageTag(UErrorCode& status) const
1332
1.25k
{
1333
1.25k
    if (U_FAILURE(status)) { return {}; }
1334
1.07k
    StringClass result;
1335
1.07k
    StringByteSink<StringClass> sink(&result);
1336
1.07k
    toLanguageTag(sink, status);
1337
1.07k
    return result;
1338
1.25k
}
1339
1340
template<typename StringClass, typename OutputIterator> inline void
1341
Locale::getKeywords(OutputIterator iterator, UErrorCode& status) const
1342
249
{
1343
249
    if (U_FAILURE(status)) { return; }
1344
249
    LocalPointer<StringEnumeration> keys(createKeywords(status));
1345
249
    if (U_FAILURE(status) || keys.isNull()) {
1346
46
        return;
1347
46
    }
1348
915
    for (;;) {
1349
915
        int32_t resultLength;
1350
915
        const char* buffer = keys->next(&resultLength, status);
1351
915
        if (U_FAILURE(status) || buffer == nullptr) {
1352
203
            return;
1353
203
        }
1354
712
        *iterator++ = StringClass(buffer, resultLength);
1355
712
    }
1356
203
}
1357
1358
template<typename StringClass, typename OutputIterator> inline void
1359
Locale::getUnicodeKeywords(OutputIterator iterator, UErrorCode& status) const
1360
504
{
1361
504
    if (U_FAILURE(status)) { return; }
1362
504
    LocalPointer<StringEnumeration> keys(createUnicodeKeywords(status));
1363
504
    if (U_FAILURE(status) || keys.isNull()) {
1364
91
        return;
1365
91
    }
1366
2.28k
    for (;;) {
1367
2.28k
        int32_t resultLength;
1368
2.28k
        const char* buffer = keys->next(&resultLength, status);
1369
2.28k
        if (U_FAILURE(status) || buffer == nullptr) {
1370
413
            return;
1371
413
        }
1372
1.87k
        *iterator++ = StringClass(buffer, resultLength);
1373
1.87k
    }
1374
413
}
1375
1376
template<typename StringClass> inline StringClass
1377
Locale::getKeywordValue(StringPiece keywordName, UErrorCode& status) const
1378
15.3k
{
1379
15.3k
    if (U_FAILURE(status)) { return {}; }
1380
15.3k
    StringClass result;
1381
15.3k
    StringByteSink<StringClass> sink(&result);
1382
15.3k
    getKeywordValue(keywordName, sink, status);
1383
15.3k
    return result;
1384
15.3k
}
1385
1386
template<typename StringClass> inline StringClass
1387
Locale::getUnicodeKeywordValue(StringPiece keywordName, UErrorCode& status) const
1388
{
1389
    if (U_FAILURE(status)) { return {}; }
1390
    StringClass result;
1391
    StringByteSink<StringClass> sink(&result);
1392
    getUnicodeKeywordValue(keywordName, sink, status);
1393
    return result;
1394
}
1395
1396
U_COMMON_API inline UBool
1397
317k
Locale::isBogus() const {
1398
317k
    return payload.isBogus();
1399
317k
}
1400
1401
U_NAMESPACE_END
1402
1403
#endif /* U_SHOW_CPLUSPLUS_API */
1404
1405
#endif