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 16 U_NAMESPACE_BEGIN 17 18 class EmojiProps : public UMemory { 19 public: 20 // @internal EmojiProps(UErrorCode & errorCode)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 UChar *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 71 private: 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. */ getStringTrieIndex(int32_t i)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 UChar *s, int32_t length, UProperty which) const; 82 83 UDataMemory *memory = nullptr; 84 UCPTrie *cpTrie = nullptr; 85 const UChar *stringTries[6] = { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }; 86 }; 87 88 U_NAMESPACE_END 89 90 #endif // __EMOJIPROPS_H__ 91