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