1 /*
2 *******************************************************************************
3 *
4 * Copyright (C) 1999-2003, International Business Machines
5 * Corporation and others. All Rights Reserved.
6 *
7 *******************************************************************************
8 * file name: scrptrun.h
9 *
10 * created on: 10/17/2001
11 * created by: Eric R. Mader
12 */
13
14 #ifndef __SCRPTRUN_H
15 #define __SCRPTRUN_H
16
17 #include "unicode/utypes.h"
18 #include "unicode/uobject.h"
19 #include "unicode/uscript.h"
20
21 struct ScriptRecord
22 {
23 UChar32 startChar;
24 UChar32 endChar;
25 UScriptCode scriptCode;
26 };
27
28 struct ParenStackEntry
29 {
30 int32_t pairIndex;
31 UScriptCode scriptCode;
32 };
33
34 class ScriptRun : public UObject {
35 public:
36 ScriptRun();
37
38 ScriptRun(const UChar chars[], int32_t length);
39
40 ScriptRun(const UChar chars[], int32_t start, int32_t length);
41
42 void reset();
43
44 void reset(int32_t start, int32_t count);
45
46 void reset(const UChar chars[], int32_t start, int32_t length);
47
48 int32_t getScriptStart();
49
50 int32_t getScriptEnd();
51
52 UScriptCode getScriptCode();
53
54 UBool next();
55
56 /**
57 * ICU "poor man's RTTI", returns a UClassID for the actual class.
58 *
59 * @stable ICU 2.2
60 */
getDynamicClassID()61 virtual inline UClassID getDynamicClassID() const { return getStaticClassID(); }
62
63 /**
64 * ICU "poor man's RTTI", returns a UClassID for this class.
65 *
66 * @stable ICU 2.2
67 */
getStaticClassID()68 static inline UClassID getStaticClassID() { return (UClassID)&fgClassID; }
69
70 private:
71
72 static UBool sameScript(int32_t scriptOne, int32_t scriptTwo);
73
74 int32_t charStart;
75 int32_t charLimit;
76 const UChar *charArray;
77
78 int32_t scriptStart;
79 int32_t scriptEnd;
80 UScriptCode scriptCode;
81
82 ParenStackEntry parenStack[128];
83 int32_t parenSP;
84
85 static int8_t highBit(int32_t value);
86 static int32_t getPairIndex(UChar32 ch);
87
88 static UChar32 pairedChars[];
89 static const int32_t pairedCharCount;
90 static const int32_t pairedCharPower;
91 static const int32_t pairedCharExtra;
92
93 /**
94 * The address of this static class variable serves as this class's ID
95 * for ICU "poor man's RTTI".
96 */
97 static const char fgClassID;
98 };
99
ScriptRun()100 inline ScriptRun::ScriptRun()
101 {
102 reset(NULL, 0, 0);
103 }
104
ScriptRun(const UChar chars[],int32_t length)105 inline ScriptRun::ScriptRun(const UChar chars[], int32_t length)
106 {
107 reset(chars, 0, length);
108 }
109
ScriptRun(const UChar chars[],int32_t start,int32_t length)110 inline ScriptRun::ScriptRun(const UChar chars[], int32_t start, int32_t length)
111 {
112 reset(chars, start, length);
113 }
114
getScriptStart()115 inline int32_t ScriptRun::getScriptStart()
116 {
117 return scriptStart;
118 }
119
getScriptEnd()120 inline int32_t ScriptRun::getScriptEnd()
121 {
122 return scriptEnd;
123 }
124
getScriptCode()125 inline UScriptCode ScriptRun::getScriptCode()
126 {
127 return scriptCode;
128 }
129
reset()130 inline void ScriptRun::reset()
131 {
132 scriptStart = charStart;
133 scriptEnd = charStart;
134 scriptCode = USCRIPT_INVALID_CODE;
135 parenSP = -1;
136 }
137
reset(int32_t start,int32_t length)138 inline void ScriptRun::reset(int32_t start, int32_t length)
139 {
140 charStart = start;
141 charLimit = start + length;
142
143 reset();
144 }
145
reset(const UChar chars[],int32_t start,int32_t length)146 inline void ScriptRun::reset(const UChar chars[], int32_t start, int32_t length)
147 {
148 charArray = chars;
149
150 reset(start, length);
151 }
152
153
154 #endif
155