// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * * Copyright (C) 2001-2008, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** * file name: utrie2_impl.h * encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * * created on: 2008sep26 (split off from utrie2.c) * created by: Markus W. Scherer * * Definitions needed for both runtime and builder code for UTrie2, * used by utrie2.c and utrie2_builder.c. */ #ifndef __UTRIE2_IMPL_H__ #define __UTRIE2_IMPL_H__ #ifdef UCPTRIE_DEBUG #include "unicode/umutablecptrie.h" #endif #include "utrie2.h" /* Public UTrie2 API implementation ----------------------------------------- */ /* * These definitions are mostly needed by utrie2.cpp, * but also by utrie2_serialize() and utrie2_swap(). */ // UTrie2 signature values, in platform endianness and opposite endianness. // The UTrie2 signature ASCII byte values spell "Tri2". #define UTRIE2_SIG … #define UTRIE2_OE_SIG … /** * Trie data structure in serialized form: * * UTrie2Header header; * uint16_t index[header.index2Length]; * uint16_t data[header.shiftedDataLength<<2]; -- or uint32_t data[...] * @internal */ UTrie2Header; /** * Constants for use with UTrie2Header.options. * @internal */ enum { … }; /* Building a trie ---------------------------------------------------------- */ /* * These definitions are mostly needed by utrie2_builder.c, but also by * utrie2_get32() and utrie2_enum(). */ enum { … }; /** * Maximum length of the build-time data array. * One entry per 0x110000 code points, plus the illegal-UTF-8 block and the null block, * plus values for the 0x400 surrogate code units. */ #define UNEWTRIE2_MAX_DATA_LENGTH … /* * Build-time trie structure. * * Just using a boolean flag for "repeat use" could lead to data array overflow * because we would not be able to detect when a data block becomes unused. * It also leads to orphan data blocks that are kept through serialization. * * Need to use reference counting for data blocks, * and allocDataBlock() needs to look for a free block before increasing dataLength. * * This scheme seems like overkill for index-2 blocks since the whole index array is * preallocated anyway (unlike the growable data array). * Just allocating multiple index-2 blocks as needed. */ struct UNewTrie2 { … }; #endif