// © 2018 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html // This file contains utilities to deal with static-allocated UnicodeSets. // // Common use case: you write a "private static final" UnicodeSet in Java, and // want something similarly easy in C++. Originally written for number // parsing, but this header can be used for other applications. // // Main entrypoint: `unisets::get(unisets::MY_SET_ID_HERE)` // // This file is in common instead of i18n because it is needed by ucurr.cpp. // // Author: sffc #include "unicode/utypes.h" #if !UCONFIG_NO_FORMATTING #ifndef __STATIC_UNICODE_SETS_H__ #define __STATIC_UNICODE_SETS_H__ #include "unicode/uniset.h" #include "unicode/unistr.h" U_NAMESPACE_BEGIN namespace unisets { enum Key { // NONE is used to indicate null in chooseFrom(). // EMPTY is used to get an empty UnicodeSet. NONE = -1, EMPTY = 0, // Ignorables DEFAULT_IGNORABLES, STRICT_IGNORABLES, // Separators // Notes: // - COMMA is a superset of STRICT_COMMA // - PERIOD is a superset of SCRICT_PERIOD // - ALL_SEPARATORS is the union of COMMA, PERIOD, and OTHER_GROUPING_SEPARATORS // - STRICT_ALL_SEPARATORS is the union of STRICT_COMMA, STRICT_PERIOD, and OTHER_GRP_SEPARATORS COMMA, PERIOD, STRICT_COMMA, STRICT_PERIOD, APOSTROPHE_SIGN, OTHER_GROUPING_SEPARATORS, ALL_SEPARATORS, STRICT_ALL_SEPARATORS, // Symbols MINUS_SIGN, PLUS_SIGN, PERCENT_SIGN, PERMILLE_SIGN, INFINITY_SIGN, // Currency Symbols DOLLAR_SIGN, POUND_SIGN, RUPEE_SIGN, YEN_SIGN, WON_SIGN, // Other DIGITS, // Combined Separators with Digits (for lead code points) DIGITS_OR_ALL_SEPARATORS, DIGITS_OR_STRICT_ALL_SEPARATORS, // The number of elements in the enum. UNISETS_KEY_COUNT }; /** * Gets the static-allocated UnicodeSet according to the provided key. The * pointer will be deleted during u_cleanup(); the caller should NOT delete it. * * Exported as U_COMMON_API for ucurr.cpp * * This method is always safe and OK to chain: in the case of a memory or other * error, it returns an empty set from static memory. * * Example: * * UBool hasIgnorables = unisets::get(unisets::DEFAULT_IGNORABLES)->contains(...); * * @param key The desired UnicodeSet according to the enum in this file. * @return The requested UnicodeSet. Guaranteed to be frozen and non-null, but * may be empty if an error occurred during data loading. */ U_COMMON_API const UnicodeSet* get(Key key); /** * Checks if the UnicodeSet given by key1 contains the given string. * * Exported as U_COMMON_API for numparse_decimal.cpp * * @param str The string to check. * @param key1 The set to check. * @return key1 if the set contains str, or NONE if not. */ U_COMMON_API Key chooseFrom(UnicodeString str, Key key1); /** * Checks if the UnicodeSet given by either key1 or key2 contains the string. * * Exported as U_COMMON_API for numparse_decimal.cpp * * @param str The string to check. * @param key1 The first set to check. * @param key2 The second set to check. * @return key1 if that set contains str; key2 if that set contains str; or * NONE if neither set contains str. */ U_COMMON_API Key chooseFrom(UnicodeString str, Key key1, Key key2); // TODO: Load these from data: ICU-20108 // Unused in C++: // Key chooseCurrency(UnicodeString str); // Used instead: static const struct { Key key; UChar32 exemplar; } kCurrencyEntries[] = { {DOLLAR_SIGN, u'$'}, {POUND_SIGN, u'£'}, {RUPEE_SIGN, u'₹'}, {YEN_SIGN, u'¥'}, {WON_SIGN, u'₩'}, }; } // namespace unisets U_NAMESPACE_END #endif //__STATIC_UNICODE_SETS_H__ #endif /* #if !UCONFIG_NO_FORMATTING */