1 // © 2019 and later: Unicode, Inc. and others. 2 // License & terms of use: http://www.unicode.org/copyright.html 3 4 // lsr.h 5 // created: 2019may08 Markus W. Scherer 6 7 #ifndef __LSR_H__ 8 #define __LSR_H__ 9 10 #include "unicode/utypes.h" 11 #include "unicode/uobject.h" 12 #include "cstring.h" 13 14 U_NAMESPACE_BEGIN 15 16 struct LSR final : public UMemory { 17 static constexpr int32_t REGION_INDEX_LIMIT = 1001 + 26 * 26; 18 19 static constexpr int32_t EXPLICIT_LSR = 7; 20 static constexpr int32_t EXPLICIT_LANGUAGE = 4; 21 static constexpr int32_t EXPLICIT_SCRIPT = 2; 22 static constexpr int32_t EXPLICIT_REGION = 1; 23 static constexpr int32_t IMPLICIT_LSR = 0; 24 static constexpr int32_t DONT_CARE_FLAGS = 0; 25 26 const char *language; 27 const char *script; 28 const char *region; 29 char *owned = nullptr; 30 /** Index for region, 0 if ill-formed. @see indexForRegion */ 31 int32_t regionIndex = 0; 32 int32_t flags = 0; 33 /** Only set for LSRs that will be used in a hash table. */ 34 int32_t hashCode = 0; 35 LSRfinal36 LSR() : language("und"), script(""), region("") {} 37 38 /** Constructor which aliases all subtag pointers. */ LSRfinal39 LSR(const char *lang, const char *scr, const char *r, int32_t f) : 40 language(lang), script(scr), region(r), 41 regionIndex(indexForRegion(region)), flags(f) {} 42 /** 43 * Constructor which prepends the prefix to the language and script, 44 * copies those into owned memory, and aliases the region. 45 */ 46 LSR(char prefix, const char *lang, const char *scr, const char *r, int32_t f, 47 UErrorCode &errorCode); 48 LSR(LSR &&other) U_NOEXCEPT; 49 LSR(const LSR &other) = delete; ~LSRfinal50 inline ~LSR() { 51 // Pure inline code for almost all instances. 52 if (owned != nullptr) { 53 deleteOwned(); 54 } 55 } 56 57 LSR &operator=(LSR &&other) U_NOEXCEPT; 58 LSR &operator=(const LSR &other) = delete; 59 60 /** 61 * Returns a positive index (>0) for a well-formed region code. 62 * Do not rely on a particular region->index mapping; it may change. 63 * Returns 0 for ill-formed strings. 64 */ 65 static int32_t indexForRegion(const char *region); 66 67 UBool isEquivalentTo(const LSR &other) const; 68 UBool operator==(const LSR &other) const; 69 70 inline UBool operator!=(const LSR &other) const { 71 return !operator==(other); 72 } 73 74 LSR &setHashCode(); 75 76 private: 77 void deleteOwned(); 78 }; 79 80 U_NAMESPACE_END 81 82 #endif // __LSR_H__ 83