michael@0: /* michael@0: ******************************************************************************* michael@0: * michael@0: * Copyright (C) 2009-2011, International Business Machines michael@0: * Corporation and others. All Rights Reserved. michael@0: * michael@0: ******************************************************************************* michael@0: * file name: n2builder.h michael@0: * encoding: US-ASCII michael@0: * tab size: 8 (not used) michael@0: * indentation:4 michael@0: * michael@0: * created on: 2009nov25 michael@0: * created by: Markus W. Scherer michael@0: */ michael@0: michael@0: #ifndef __N2BUILDER_H__ michael@0: #define __N2BUILDER_H__ michael@0: michael@0: #include "unicode/utypes.h" michael@0: michael@0: #if !UCONFIG_NO_NORMALIZATION michael@0: michael@0: #include "unicode/errorcode.h" michael@0: #include "unicode/unistr.h" michael@0: #include "normalizer2impl.h" // for IX_COUNT michael@0: #include "toolutil.h" michael@0: #include "utrie2.h" michael@0: michael@0: U_NAMESPACE_BEGIN michael@0: michael@0: extern UBool beVerbose, haveCopyright; michael@0: michael@0: struct Norm; michael@0: michael@0: class BuilderReorderingBuffer; michael@0: class ExtraDataWriter; michael@0: michael@0: class Normalizer2DataBuilder { michael@0: public: michael@0: Normalizer2DataBuilder(UErrorCode &errorCode); michael@0: ~Normalizer2DataBuilder(); michael@0: michael@0: enum OverrideHandling { michael@0: OVERRIDE_NONE, michael@0: OVERRIDE_ANY, michael@0: OVERRIDE_PREVIOUS michael@0: }; michael@0: michael@0: void setOverrideHandling(OverrideHandling oh); michael@0: michael@0: enum Optimization { michael@0: OPTIMIZE_NORMAL, michael@0: OPTIMIZE_FAST michael@0: }; michael@0: michael@0: void setOptimization(Optimization opt) { optimization=opt; } michael@0: michael@0: void setCC(UChar32 c, uint8_t cc); michael@0: void setOneWayMapping(UChar32 c, const UnicodeString &m); michael@0: void setRoundTripMapping(UChar32 c, const UnicodeString &m); michael@0: void removeMapping(UChar32 c); michael@0: michael@0: void setUnicodeVersion(const char *v); michael@0: michael@0: void writeBinaryFile(const char *filename); michael@0: michael@0: private: michael@0: friend class CompositionBuilder; michael@0: friend class Decomposer; michael@0: friend class ExtraDataWriter; michael@0: friend class Norm16Writer; michael@0: michael@0: // No copy constructor nor assignment operator. michael@0: Normalizer2DataBuilder(const Normalizer2DataBuilder &other); michael@0: Normalizer2DataBuilder &operator=(const Normalizer2DataBuilder &other); michael@0: michael@0: Norm *allocNorm(); michael@0: Norm *getNorm(UChar32 c); michael@0: Norm *createNorm(UChar32 c); michael@0: Norm *checkNormForMapping(Norm *p, UChar32 c); // check for permitted overrides michael@0: michael@0: const Norm &getNormRef(UChar32 c) const; michael@0: uint8_t getCC(UChar32 c) const; michael@0: UBool combinesWithCCBetween(const Norm &norm, uint8_t lowCC, uint8_t highCC) const; michael@0: UChar32 combine(const Norm &norm, UChar32 trail) const; michael@0: michael@0: void addComposition(UChar32 start, UChar32 end, uint32_t value); michael@0: UBool decompose(UChar32 start, UChar32 end, uint32_t value); michael@0: void reorder(Norm *p, BuilderReorderingBuffer &buffer); michael@0: UBool hasNoCompBoundaryAfter(BuilderReorderingBuffer &buffer); michael@0: void setHangulData(); michael@0: int32_t writeMapping(UChar32 c, const Norm *p, UnicodeString &dataString); michael@0: void writeCompositions(UChar32 c, const Norm *p, UnicodeString &dataString); michael@0: void writeExtraData(UChar32 c, uint32_t value, ExtraDataWriter &writer); michael@0: int32_t getCenterNoNoDelta() { michael@0: return indexes[Normalizer2Impl::IX_MIN_MAYBE_YES]-Normalizer2Impl::MAX_DELTA-1; michael@0: } michael@0: void writeNorm16(UChar32 start, UChar32 end, uint32_t value); michael@0: void processData(); michael@0: michael@0: UTrie2 *normTrie; michael@0: UToolMemory *normMem; michael@0: Norm *norms; michael@0: michael@0: int32_t phase; michael@0: OverrideHandling overrideHandling; michael@0: michael@0: Optimization optimization; michael@0: michael@0: int32_t indexes[Normalizer2Impl::IX_COUNT]; michael@0: UTrie2 *norm16Trie; michael@0: UnicodeString extraData; michael@0: uint8_t smallFCD[0x100]; michael@0: michael@0: UVersionInfo unicodeVersion; michael@0: }; michael@0: michael@0: U_NAMESPACE_END michael@0: michael@0: #endif // #if !UCONFIG_NO_NORMALIZATION michael@0: michael@0: #endif // __N2BUILDER_H__