michael@0: /* michael@0: ******************************************************************************* michael@0: * michael@0: * Copyright (C) 1999-2003, International Business Machines michael@0: * Corporation and others. All Rights Reserved. michael@0: * michael@0: ******************************************************************************* michael@0: * file name: scrptrun.h michael@0: * michael@0: * created on: 10/17/2001 michael@0: * created by: Eric R. Mader michael@0: */ michael@0: michael@0: #ifndef __SCRPTRUN_H michael@0: #define __SCRPTRUN_H michael@0: michael@0: #include "unicode/utypes.h" michael@0: #include "unicode/uobject.h" michael@0: #include "unicode/uscript.h" michael@0: michael@0: struct ScriptRecord michael@0: { michael@0: UChar32 startChar; michael@0: UChar32 endChar; michael@0: UScriptCode scriptCode; michael@0: }; michael@0: michael@0: struct ParenStackEntry michael@0: { michael@0: int32_t pairIndex; michael@0: UScriptCode scriptCode; michael@0: }; michael@0: michael@0: class ScriptRun : public UObject { michael@0: public: michael@0: ScriptRun(); michael@0: michael@0: ScriptRun(const UChar chars[], int32_t length); michael@0: michael@0: ScriptRun(const UChar chars[], int32_t start, int32_t length); michael@0: michael@0: void reset(); michael@0: michael@0: void reset(int32_t start, int32_t count); michael@0: michael@0: void reset(const UChar chars[], int32_t start, int32_t length); michael@0: michael@0: int32_t getScriptStart(); michael@0: michael@0: int32_t getScriptEnd(); michael@0: michael@0: UScriptCode getScriptCode(); michael@0: michael@0: UBool next(); michael@0: michael@0: /** michael@0: * ICU "poor man's RTTI", returns a UClassID for the actual class. michael@0: * michael@0: * @stable ICU 2.2 michael@0: */ michael@0: virtual inline UClassID getDynamicClassID() const { return getStaticClassID(); } michael@0: michael@0: /** michael@0: * ICU "poor man's RTTI", returns a UClassID for this class. michael@0: * michael@0: * @stable ICU 2.2 michael@0: */ michael@0: static inline UClassID getStaticClassID() { return (UClassID)&fgClassID; } michael@0: michael@0: private: michael@0: michael@0: static UBool sameScript(int32_t scriptOne, int32_t scriptTwo); michael@0: michael@0: int32_t charStart; michael@0: int32_t charLimit; michael@0: const UChar *charArray; michael@0: michael@0: int32_t scriptStart; michael@0: int32_t scriptEnd; michael@0: UScriptCode scriptCode; michael@0: michael@0: ParenStackEntry parenStack[128]; michael@0: int32_t parenSP; michael@0: michael@0: static int8_t highBit(int32_t value); michael@0: static int32_t getPairIndex(UChar32 ch); michael@0: michael@0: static UChar32 pairedChars[]; michael@0: static const int32_t pairedCharCount; michael@0: static const int32_t pairedCharPower; michael@0: static const int32_t pairedCharExtra; michael@0: michael@0: /** michael@0: * The address of this static class variable serves as this class's ID michael@0: * for ICU "poor man's RTTI". michael@0: */ michael@0: static const char fgClassID; michael@0: }; michael@0: michael@0: inline ScriptRun::ScriptRun() michael@0: { michael@0: reset(NULL, 0, 0); michael@0: } michael@0: michael@0: inline ScriptRun::ScriptRun(const UChar chars[], int32_t length) michael@0: { michael@0: reset(chars, 0, length); michael@0: } michael@0: michael@0: inline ScriptRun::ScriptRun(const UChar chars[], int32_t start, int32_t length) michael@0: { michael@0: reset(chars, start, length); michael@0: } michael@0: michael@0: inline int32_t ScriptRun::getScriptStart() michael@0: { michael@0: return scriptStart; michael@0: } michael@0: michael@0: inline int32_t ScriptRun::getScriptEnd() michael@0: { michael@0: return scriptEnd; michael@0: } michael@0: michael@0: inline UScriptCode ScriptRun::getScriptCode() michael@0: { michael@0: return scriptCode; michael@0: } michael@0: michael@0: inline void ScriptRun::reset() michael@0: { michael@0: scriptStart = charStart; michael@0: scriptEnd = charStart; michael@0: scriptCode = USCRIPT_INVALID_CODE; michael@0: parenSP = -1; michael@0: } michael@0: michael@0: inline void ScriptRun::reset(int32_t start, int32_t length) michael@0: { michael@0: charStart = start; michael@0: charLimit = start + length; michael@0: michael@0: reset(); michael@0: } michael@0: michael@0: inline void ScriptRun::reset(const UChar chars[], int32_t start, int32_t length) michael@0: { michael@0: charArray = chars; michael@0: michael@0: reset(start, length); michael@0: } michael@0: michael@0: michael@0: #endif