ICU4C 79
Loading...
Searching...
No Matches
ucptrie.h
Go to the documentation of this file.
1// © 2017 and later: Unicode, Inc. and others.
2// License & terms of use: http://www.unicode.org/copyright.html
3
4// ucptrie.h (modified from utrie2.h)
5// created: 2017dec29 Markus W. Scherer
6
7#ifndef __UCPTRIE_H__
8#define __UCPTRIE_H__
9
10#include "unicode/utypes.h"
11#include "unicode/ucpmap.h"
12#include "unicode/utf8.h"
13
14#if U_SHOW_CPLUSPLUS_API
16#endif // U_SHOW_CPLUSPLUS_API
17
19
27
28#ifndef U_IN_DOXYGEN
30typedef union UCPTrieData {
32 const void *ptr0;
34 const uint16_t *ptr16;
36 const uint32_t *ptr32;
38 const uint8_t *ptr8;
39} UCPTrieData;
40#endif
41
59struct UCPTrie {
60#ifndef U_IN_DOXYGEN
62 const uint16_t *index;
64 UCPTrieData data;
65
67 int32_t indexLength;
69 int32_t dataLength;
71 UChar32 highStart;
73 uint16_t shifted12HighStart;
74
76 int8_t type; // UCPTrieType
78 int8_t valueWidth; // UCPTrieValueWidth
79
81 uint32_t reserved32;
83 uint16_t reserved16;
84
90 uint16_t index3NullOffset;
96 int32_t dataNullOffset;
98 uint32_t nullValue;
99
100#ifdef UCPTRIE_DEBUG
102 const char *name;
103#endif
104#endif
105};
106#ifndef U_IN_DOXYGEN
107typedef struct UCPTrie UCPTrie;
108#endif
109
137#ifndef U_IN_DOXYGEN
138typedef enum UCPTrieType UCPTrieType;
139#endif
140
174#ifndef U_IN_DOXYGEN
176#endif
177
204U_CAPI UCPTrie* U_EXPORT2
206 UCPTrieValueWidth valueWidth,
207 const void* data U_LIFETIME_BOUND,
208 int32_t length,
209 int32_t* pActualLength,
210 UErrorCode* pErrorCode);
211
218U_CAPI void U_EXPORT2
220
230U_CAPI UCPTrieType U_EXPORT2
232
244
259U_CAPI uint32_t U_EXPORT2
261
298U_CAPI UChar32 U_EXPORT2
300 UCPMapRangeOption option, uint32_t surrogateValue,
301 UCPMapValueFilter *filter, const void *context, uint32_t *pValue);
302
318U_CAPI int32_t U_EXPORT2
319ucptrie_toBinary(const UCPTrie *trie, void *data, int32_t capacity, UErrorCode *pErrorCode);
320
329#define UCPTRIE_16(trie, i) ((trie)->data.ptr16[i])
330
339#define UCPTRIE_32(trie, i) ((trie)->data.ptr32[i])
340
349#define UCPTRIE_8(trie, i) ((trie)->data.ptr8[i])
350
361#define UCPTRIE_FAST_GET(trie, dataAccess, c) dataAccess(trie, _UCPTRIE_CP_INDEX(trie, 0xffff, c))
362
373#define UCPTRIE_SMALL_GET(trie, dataAccess, c) \
374 dataAccess(trie, _UCPTRIE_CP_INDEX(trie, UCPTRIE_SMALL_MAX, c))
375
389#define UCPTRIE_FAST_U16_NEXT(trie, dataAccess, src, limit, c, result) UPRV_BLOCK_MACRO_BEGIN { \
390 (c) = *(src)++; \
391 int32_t __index; \
392 if (!U16_IS_SURROGATE(c)) { \
393 __index = _UCPTRIE_FAST_INDEX(trie, c); \
394 } else { \
395 uint16_t __c2; \
396 if (U16_IS_SURROGATE_LEAD(c) && (src) != (limit) && U16_IS_TRAIL(__c2 = *(src))) { \
397 ++(src); \
398 (c) = U16_GET_SUPPLEMENTARY((c), __c2); \
399 __index = _UCPTRIE_SMALL_INDEX(trie, c); \
400 } else { \
401 __index = (trie)->dataLength - UCPTRIE_ERROR_VALUE_NEG_DATA_OFFSET; \
402 } \
403 } \
404 (result) = dataAccess(trie, __index); \
405} UPRV_BLOCK_MACRO_END
406
420#define UCPTRIE_FAST_U16_PREV(trie, dataAccess, start, src, c, result) UPRV_BLOCK_MACRO_BEGIN { \
421 (c) = *--(src); \
422 int32_t __index; \
423 if (!U16_IS_SURROGATE(c)) { \
424 __index = _UCPTRIE_FAST_INDEX(trie, c); \
425 } else { \
426 uint16_t __c2; \
427 if (U16_IS_SURROGATE_TRAIL(c) && (src) != (start) && U16_IS_LEAD(__c2 = *((src) - 1))) { \
428 --(src); \
429 (c) = U16_GET_SUPPLEMENTARY(__c2, (c)); \
430 __index = _UCPTRIE_SMALL_INDEX(trie, c); \
431 } else { \
432 __index = (trie)->dataLength - UCPTRIE_ERROR_VALUE_NEG_DATA_OFFSET; \
433 } \
434 } \
435 (result) = dataAccess(trie, __index); \
436} UPRV_BLOCK_MACRO_END
437
454#define UCPTRIE_FAST_U8_NEXT(trie, dataAccess, src, limit, result) UPRV_BLOCK_MACRO_BEGIN { \
455 int32_t __lead = (uint8_t)*(src)++; \
456 if (!U8_IS_SINGLE(__lead)) { \
457 uint8_t __t1, __t2, __t3; \
458 if ((src) != (limit) && \
459 (__lead >= 0xe0 ? \
460 __lead < 0xf0 ? /* U+0800..U+FFFF except surrogates */ \
461 U8_LEAD3_T1_BITS[__lead &= 0xf] & (1 << ((__t1 = *(src)) >> 5)) && \
462 ++(src) != (limit) && (__t2 = *(src) - 0x80) <= 0x3f && \
463 (__lead = ((int32_t)(trie)->index[(__lead << 6) + (__t1 & 0x3f)]) + __t2, 1) \
464 : /* U+10000..U+10FFFF */ \
465 (__lead -= 0xf0) <= 4 && \
466 U8_LEAD4_T1_BITS[(__t1 = *(src)) >> 4] & (1 << __lead) && \
467 (__lead = (__lead << 6) | (__t1 & 0x3f), ++(src) != (limit)) && \
468 (__t2 = *(src) - 0x80) <= 0x3f && \
469 ++(src) != (limit) && (__t3 = *(src) - 0x80) <= 0x3f && \
470 (__lead = __lead >= (trie)->shifted12HighStart ? \
471 (trie)->dataLength - UCPTRIE_HIGH_VALUE_NEG_DATA_OFFSET : \
472 ucptrie_internalSmallU8Index((trie), __lead, __t2, __t3), 1) \
473 : /* U+0080..U+07FF */ \
474 __lead >= 0xc2 && (__t1 = *(src) - 0x80) <= 0x3f && \
475 (__lead = (int32_t)(trie)->index[__lead & 0x1f] + __t1, 1))) { \
476 ++(src); \
477 } else { \
478 __lead = (trie)->dataLength - UCPTRIE_ERROR_VALUE_NEG_DATA_OFFSET; /* ill-formed*/ \
479 } \
480 } \
481 (result) = dataAccess(trie, __lead); \
482} UPRV_BLOCK_MACRO_END
483
500#define UCPTRIE_FAST_U8_PREV(trie, dataAccess, start, src, result) UPRV_BLOCK_MACRO_BEGIN { \
501 int32_t __index = (uint8_t)*--(src); \
502 if (!U8_IS_SINGLE(__index)) { \
503 __index = ucptrie_internalU8PrevIndex((trie), __index, (const uint8_t *)(start), \
504 (const uint8_t *)(src)); \
505 (src) -= __index & 7; \
506 __index >>= 3; \
507 } \
508 (result) = dataAccess(trie, __index); \
509} UPRV_BLOCK_MACRO_END
510
520#define UCPTRIE_ASCII_GET(trie, dataAccess, c) dataAccess(trie, c)
521
533#define UCPTRIE_FAST_BMP_GET(trie, dataAccess, c) dataAccess(trie, _UCPTRIE_FAST_INDEX(trie, c))
534
545#define UCPTRIE_FAST_SUPP_GET(trie, dataAccess, c) dataAccess(trie, _UCPTRIE_SMALL_INDEX(trie, c))
546
547/* Internal definitions ----------------------------------------------------- */
548
549#ifndef U_IN_DOXYGEN
550
556enum {
558 UCPTRIE_FAST_SHIFT = 6,
559
561 UCPTRIE_FAST_DATA_BLOCK_LENGTH = 1 << UCPTRIE_FAST_SHIFT,
562
564 UCPTRIE_FAST_DATA_MASK = UCPTRIE_FAST_DATA_BLOCK_LENGTH - 1,
565
567 UCPTRIE_SMALL_MAX = 0xfff,
568
574 UCPTRIE_ERROR_VALUE_NEG_DATA_OFFSET = 1,
580 UCPTRIE_HIGH_VALUE_NEG_DATA_OFFSET = 2
581};
582
583/* Internal functions and macros -------------------------------------------- */
584// Do not conditionalize with #ifndef U_HIDE_INTERNAL_API, needed for public API
585
587U_CAPI int32_t U_EXPORT2
588ucptrie_internalSmallIndex(const UCPTrie *trie, UChar32 c);
589
591U_CAPI int32_t U_EXPORT2
592ucptrie_internalSmallU8Index(const UCPTrie *trie, int32_t lt1, uint8_t t2, uint8_t t3);
593
599U_CAPI int32_t U_EXPORT2
600ucptrie_internalU8PrevIndex(const UCPTrie *trie, UChar32 c,
601 const uint8_t *start, const uint8_t *src);
602
604#define _UCPTRIE_FAST_INDEX(trie, c) \
605 ((int32_t)(trie)->index[(c) >> UCPTRIE_FAST_SHIFT] + ((c) & UCPTRIE_FAST_DATA_MASK))
606
608#define _UCPTRIE_SMALL_INDEX(trie, c) \
609 ((c) >= (trie)->highStart ? \
610 (trie)->dataLength - UCPTRIE_HIGH_VALUE_NEG_DATA_OFFSET : \
611 ucptrie_internalSmallIndex(trie, c))
612
618#define _UCPTRIE_CP_INDEX(trie, fastMax, c) \
619 ((uint32_t)(c) <= (uint32_t)(fastMax) ? \
620 _UCPTRIE_FAST_INDEX(trie, c) : \
621 (uint32_t)(c) <= 0x10ffff ? \
622 _UCPTRIE_SMALL_INDEX(trie, c) : \
623 (trie)->dataLength - UCPTRIE_ERROR_VALUE_NEG_DATA_OFFSET)
624
626
627#endif // U_IN_DOXYGEN
628
629#if U_SHOW_CPLUSPLUS_API
630
631U_NAMESPACE_BEGIN
632
643
644U_NAMESPACE_END
645
646#endif // U_SHOW_CPLUSPLUS_API
647
648#endif
"Smart pointer" class, closes a UCPTrie via ucptrie_close().
C++ API: "Smart pointers" for use with and in ICU4C C++ code.
#define U_DEFINE_LOCAL_OPEN_POINTER(LocalPointerClassName, Type, closeFunction)
"Smart pointer" definition macro, deletes objects via the closeFunction.
Immutable Unicode code point trie structure.
Definition ucptrie.h:59
C API: This file defines an abstract map from Unicode code points to integer values.
uint32_t UCPMapValueFilter(const void *context, uint32_t value)
Callback function type: Modifies a map value.
Definition ucpmap.h:113
UCPMapRangeOption
Selectors for how ucpmap_getRange() etc.
Definition ucpmap.h:41
UCPTrieType
Selectors for the type of a UCPTrie.
Definition ucptrie.h:119
@ UCPTRIE_TYPE_FAST
Fast/simple/larger BMP data structure.
Definition ucptrie.h:130
@ UCPTRIE_TYPE_SMALL
Small/slower BMP data structure.
Definition ucptrie.h:135
@ UCPTRIE_TYPE_ANY
For ucptrie_openFromBinary() to accept any type.
Definition ucptrie.h:125
U_CAPI void ucptrie_close(UCPTrie *trie)
Closes a trie and releases associated memory.
U_CAPI UCPTrieValueWidth ucptrie_getValueWidth(const UCPTrie *trie)
Returns the number of bits in a trie data value.
U_CAPI UChar32 ucptrie_getRange(const UCPTrie *trie, UChar32 start, UCPMapRangeOption option, uint32_t surrogateValue, UCPMapValueFilter *filter, const void *context, uint32_t *pValue)
Returns the last code point such that all those from start to there have the same value.
U_CAPI UCPTrie * ucptrie_openFromBinary(UCPTrieType type, UCPTrieValueWidth valueWidth, const void *data, int32_t length, int32_t *pActualLength, UErrorCode *pErrorCode)
Opens a trie from its binary form, stored in 32-bit-aligned memory.
U_CAPI int32_t ucptrie_toBinary(const UCPTrie *trie, void *data, int32_t capacity, UErrorCode *pErrorCode)
Writes a memory-mappable form of the trie into 32-bit aligned memory.
U_CAPI UCPTrieType ucptrie_getType(const UCPTrie *trie)
Returns the trie type.
UCPTrieValueWidth
Selectors for the number of bits in a UCPTrie data value.
Definition ucptrie.h:149
@ UCPTRIE_VALUE_BITS_ANY
For ucptrie_openFromBinary() to accept any data value width.
Definition ucptrie.h:155
@ UCPTRIE_VALUE_BITS_8
The trie stores 8 bits per data value.
Definition ucptrie.h:172
@ UCPTRIE_VALUE_BITS_16
The trie stores 16 bits per data value.
Definition ucptrie.h:161
@ UCPTRIE_VALUE_BITS_32
The trie stores 32 bits per data value.
Definition ucptrie.h:166
U_CAPI uint32_t ucptrie_get(const UCPTrie *trie, UChar32 c)
Returns the value for a code point as stored in the trie, with range checking.
int32_t UChar32
Define UChar32 as a type for single Unicode code points.
Definition umachine.h:449
#define U_CDECL_END
This is used to end a declaration of a library private ICU C API.
Definition umachine.h:86
#define U_CAPI
This is used to declare a function as a public ICU C API.
Definition umachine.h:110
#define U_CDECL_BEGIN
This is used to begin a declaration of a library private ICU C API.
Definition umachine.h:85
C API: 8-bit Unicode handling macros.
Basic definitions for ICU, for both C and C++ APIs.
UErrorCode
Standard ICU4C error code type, a substitute for exceptions.
Definition utypes.h:509