// © 2017 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html
// extradata.h
// created: 2017jun04 Markus W. Scherer
// (pulled out of n2builder.cpp)
// Write mappings and compositions in compact form for Normalizer2 "extra data",
// the data that does not fit into the trie itself.
#ifndef __EXTRADATA_H__
#define __EXTRADATA_H__
#include "unicode/utypes.h"
#if !UCONFIG_NO_NORMALIZATION
#include "unicode/errorcode.h"
#include "unicode/unistr.h"
#include "unicode/utf16.h"
#include "hash.h"
#include "norms.h"
#include "toolutil.h"
#include "utrie2.h"
#include "uvectr32.h"
U_NAMESPACE_BEGIN
class ExtraData : public Norms::Enumerator {
public:
ExtraData(Norms &n, UBool fast);
void rangeHandler(UChar32 start, UChar32 end, Norm &norm) U_OVERRIDE;
UnicodeString maybeYesCompositions;
UnicodeString yesYesCompositions;
UnicodeString yesNoMappingsAndCompositions;
UnicodeString yesNoMappingsOnly;
UnicodeString noNoMappingsCompYes;
UnicodeString noNoMappingsCompBoundaryBefore;
UnicodeString noNoMappingsCompNoMaybeCC;
UnicodeString noNoMappingsEmpty;
private:
/**
* Requires norm.hasMapping().
* Returns the offset of the "first unit" from the beginning of the extraData for c.
* That is the same as the length of the optional data
* for the raw mapping and the ccc/lccc word.
*/
int32_t writeMapping(UChar32 c, const Norm &norm, UnicodeString &dataString);
int32_t writeNoNoMapping(UChar32 c, const Norm &norm,
UnicodeString &dataString, Hashtable &previousMappings);
UBool setNoNoDelta(UChar32 c, Norm &norm) const;
/** Requires norm.compositions!=nullptr. */
void writeCompositions(UChar32 c, const Norm &norm, UnicodeString &dataString);
void writeExtraData(UChar32 c, Norm &norm);
UBool optimizeFast;
Hashtable previousNoNoMappingsCompYes; // If constructed in runtime code, pass in UErrorCode.
Hashtable previousNoNoMappingsCompBoundaryBefore;
Hashtable previousNoNoMappingsCompNoMaybeCC;
Hashtable previousNoNoMappingsEmpty;
};
U_NAMESPACE_END
#endif // #if !UCONFIG_NO_NORMALIZATION
#endif // __EXTRADATA_H__