1// © 2021 and later: Unicode, Inc. and others.
2// License & terms of use: https://www.unicode.org/copyright.html
3
4// emojiprops.h
5// created: 2021sep03 Markus W. Scherer
6
7#ifndef __EMOJIPROPS_H__
8#define __EMOJIPROPS_H__
9
10#include "unicode/utypes.h"
11#include "unicode/ucptrie.h"
12#include "unicode/udata.h"
13#include "unicode/uobject.h"
14#include "uset_imp.h"
15
16U_NAMESPACE_BEGIN
17
18class EmojiProps : public UMemory {
19public:
20 // @internal
21 EmojiProps(UErrorCode &errorCode) { load(errorCode); }
22 ~EmojiProps();
23
24 static const EmojiProps *getSingleton(UErrorCode &errorCode);
25 static UBool hasBinaryProperty(UChar32 c, UProperty which);
26 static UBool hasBinaryProperty(const char16_t *s, int32_t length, UProperty which);
27
28 void addPropertyStarts(const USetAdder *sa, UErrorCode &errorCode) const;
29 void addStrings(const USetAdder *sa, UProperty which, UErrorCode &errorCode) const;
30
31 enum {
32 // Byte offsets from the start of the data, after the generic header,
33 // in ascending order.
34 // UCPTrie=CodePointTrie, follows the indexes
35 IX_CPTRIE_OFFSET,
36 IX_RESERVED1,
37 IX_RESERVED2,
38 IX_RESERVED3,
39
40 // UCharsTrie=CharsTrie
41 IX_BASIC_EMOJI_TRIE_OFFSET,
42 IX_EMOJI_KEYCAP_SEQUENCE_TRIE_OFFSET,
43 IX_RGI_EMOJI_MODIFIER_SEQUENCE_TRIE_OFFSET,
44 IX_RGI_EMOJI_FLAG_SEQUENCE_TRIE_OFFSET,
45 IX_RGI_EMOJI_TAG_SEQUENCE_TRIE_OFFSET,
46 IX_RGI_EMOJI_ZWJ_SEQUENCE_TRIE_OFFSET,
47 IX_RESERVED10,
48 IX_RESERVED11,
49 IX_RESERVED12,
50 IX_TOTAL_SIZE,
51
52 // Not initially byte offsets.
53 IX_RESERVED14,
54 IX_RESERVED15,
55 IX_COUNT // 16
56 };
57
58 // Properties in the code point trie.
59 enum {
60 // https://www.unicode.org/reports/tr51/#Emoji_Properties
61 BIT_EMOJI,
62 BIT_EMOJI_PRESENTATION,
63 BIT_EMOJI_MODIFIER,
64 BIT_EMOJI_MODIFIER_BASE,
65 BIT_EMOJI_COMPONENT,
66 BIT_EXTENDED_PICTOGRAPHIC,
67 // https://www.unicode.org/reports/tr51/#Emoji_Sets
68 BIT_BASIC_EMOJI
69 };
70
71private:
72 static UBool U_CALLCONV
73 isAcceptable(void *context, const char *type, const char *name, const UDataInfo *pInfo);
74 /** Input i: One of the IX_..._TRIE_OFFSET indexes into the data file indexes[] array. */
75 static int32_t getStringTrieIndex(int32_t i) {
76 return i - IX_BASIC_EMOJI_TRIE_OFFSET;
77 }
78
79 void load(UErrorCode &errorCode);
80 UBool hasBinaryPropertyImpl(UChar32 c, UProperty which) const;
81 UBool hasBinaryPropertyImpl(const char16_t *s, int32_t length, UProperty which) const;
82
83 UDataMemory *memory = nullptr;
84 UCPTrie *cpTrie = nullptr;
85 const char16_t *stringTries[6] = { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr };
86};
87
88U_NAMESPACE_END
89
90#endif // __EMOJIPROPS_H__
91