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