150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho/*
250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*******************************************************************************
350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*
4f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius*   Copyright (C) 2009-2014, International Business Machines
550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*   Corporation and others.  All Rights Reserved.
650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*
750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*******************************************************************************
850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*   file name:  n2builder.h
950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*   encoding:   US-ASCII
1050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*   tab size:   8 (not used)
1150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*   indentation:4
1250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*
1350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*   created on: 2009nov25
1450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*   created by: Markus W. Scherer
1550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*/
1650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
1750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#ifndef __N2BUILDER_H__
1850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#define __N2BUILDER_H__
1950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
2050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "unicode/utypes.h"
2150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
2250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#if !UCONFIG_NO_NORMALIZATION
2350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
2450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "unicode/errorcode.h"
2550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "unicode/unistr.h"
2650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "normalizer2impl.h"  // for IX_COUNT
2750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "toolutil.h"
2850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "utrie2.h"
2950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
3050294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoU_NAMESPACE_BEGIN
3150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
3250294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoextern UBool beVerbose, haveCopyright;
3350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
3450294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostruct Norm;
3550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
3650294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoclass BuilderReorderingBuffer;
3750294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoclass ExtraDataWriter;
3850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
3950294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoclass Normalizer2DataBuilder {
4050294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehopublic:
4150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    Normalizer2DataBuilder(UErrorCode &errorCode);
4250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    ~Normalizer2DataBuilder();
4350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
4450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    enum OverrideHandling {
4550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        OVERRIDE_NONE,
4650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        OVERRIDE_ANY,
4750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        OVERRIDE_PREVIOUS
4850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    };
4950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
5050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    void setOverrideHandling(OverrideHandling oh);
5150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
5250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    enum Optimization {
5350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        OPTIMIZE_NORMAL,
5450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        OPTIMIZE_FAST
5550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    };
5650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
5750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    void setOptimization(Optimization opt) { optimization=opt; }
5850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
5950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    void setCC(UChar32 c, uint8_t cc);
6050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    void setOneWayMapping(UChar32 c, const UnicodeString &m);
6150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    void setRoundTripMapping(UChar32 c, const UnicodeString &m);
6250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    void removeMapping(UChar32 c);
6350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
6450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    void setUnicodeVersion(const char *v);
6550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
6650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    void writeBinaryFile(const char *filename);
67f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    void writeCSourceFile(const char *filename);
6850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
6950294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoprivate:
7050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    friend class CompositionBuilder;
7150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    friend class Decomposer;
7250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    friend class ExtraDataWriter;
7350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    friend class Norm16Writer;
7450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
7550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    // No copy constructor nor assignment operator.
7650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    Normalizer2DataBuilder(const Normalizer2DataBuilder &other);
7750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    Normalizer2DataBuilder &operator=(const Normalizer2DataBuilder &other);
7850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
7950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    Norm *allocNorm();
8050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    Norm *getNorm(UChar32 c);
8150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    Norm *createNorm(UChar32 c);
8250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    Norm *checkNormForMapping(Norm *p, UChar32 c);  // check for permitted overrides
8350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
8450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    const Norm &getNormRef(UChar32 c) const;
8550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    uint8_t getCC(UChar32 c) const;
8650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UBool combinesWithCCBetween(const Norm &norm, uint8_t lowCC, uint8_t highCC) const;
8750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UChar32 combine(const Norm &norm, UChar32 trail) const;
8850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
8950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    void addComposition(UChar32 start, UChar32 end, uint32_t value);
9050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UBool decompose(UChar32 start, UChar32 end, uint32_t value);
9150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    void reorder(Norm *p, BuilderReorderingBuffer &buffer);
9250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UBool hasNoCompBoundaryAfter(BuilderReorderingBuffer &buffer);
9350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    void setHangulData();
9483a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius    int32_t writeMapping(UChar32 c, const Norm *p, UnicodeString &dataString);
9550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    void writeCompositions(UChar32 c, const Norm *p, UnicodeString &dataString);
9650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    void writeExtraData(UChar32 c, uint32_t value, ExtraDataWriter &writer);
9750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    int32_t getCenterNoNoDelta() {
9850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        return indexes[Normalizer2Impl::IX_MIN_MAYBE_YES]-Normalizer2Impl::MAX_DELTA-1;
9950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
10050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    void writeNorm16(UChar32 start, UChar32 end, uint32_t value);
10150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    void processData();
10250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
10350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UTrie2 *normTrie;
10450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UToolMemory *normMem;
10550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    Norm *norms;
10650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
10750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    int32_t phase;
10850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    OverrideHandling overrideHandling;
10950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
11050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    Optimization optimization;
11150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
11250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    int32_t indexes[Normalizer2Impl::IX_COUNT];
11350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UTrie2 *norm16Trie;
114f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    int32_t norm16TrieLength;
11550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UnicodeString extraData;
11683a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius    uint8_t smallFCD[0x100];
11750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
11850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UVersionInfo unicodeVersion;
11950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho};
12050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
12150294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoU_NAMESPACE_END
12250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
12350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif // #if !UCONFIG_NO_NORMALIZATION
12450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
12550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif  // __N2BUILDER_H__
126