| // © 2017 and later: Unicode, Inc. and others. |
| // License & terms of use: http://www.unicode.org/copyright.html |
| #ifndef COLPROBE_SORTEDLINES_H |
| #define COLPROBE_SORTEDLINES_H |
| |
| // colprobe includes |
| #include "colprobe.h" |
| #include "line.h" |
| #include "uprinter.h" |
| #include "strengthprobe.h" |
| |
| |
| // ICU includes |
| #include "unicode/uniset.h" |
| #include "unicode/usetiter.h" |
| #include "unicode/uscript.h" |
| #include "hash.h" |
| |
| class SortedLines { |
| Line empty; |
| Line *UB[UCOL_OFF]; |
| UnicodeSet ignorables[UCOL_OFF]; |
| |
| Line **toSort; |
| int32_t toSortCapacity; |
| Line *lines; |
| int32_t size; |
| int32_t capacity; |
| |
| UnicodeSet repertoire; |
| UnicodeSet excludeBounds; |
| |
| StrengthProbe probe; |
| |
| Line *first; |
| Line *last; |
| Line *current; |
| SortedLines() {}; |
| |
| UPrinter *logger; |
| UPrinter *debug; |
| |
| Hashtable *contractionsTable; |
| Hashtable *duplicators; // elements that duplicate preceding characters |
| int32_t maxExpansionPrefixSize; |
| |
| // Properties of the sort |
| UBool wordSort; |
| UBool frenchSecondary; |
| UBool upperFirst; |
| |
| uint8_t *sortkeys; |
| int32_t sortkeyOffset; |
| public: |
| SortedLines(const UnicodeSet &set, const UnicodeSet &excludeBounds, const StrengthProbe &probe, UPrinter *logger, UPrinter *debug); |
| SortedLines(FILE *file, UPrinter *logger, UPrinter *debug, UErrorCode &status); |
| ~SortedLines(); |
| void analyse(UErrorCode &status); |
| |
| void sort(UBool setStrengths = TRUE, UBool link = FALSE); |
| void sort(Line **sortingArray, int32_t sizeToSort, UBool setStrengths = TRUE, UBool link = FALSE); |
| |
| Line *getFirst(); |
| Line *getLast(); |
| void add(Line *line, UBool linkIn = FALSE); |
| void insert(Line *line, int32_t index); |
| Line *getNext(); |
| Line *getPrevious(); |
| Line *operator[](int32_t index); |
| int32_t addContractionsToRepertoire(UErrorCode &status); |
| |
| int32_t getSize() const; |
| |
| int32_t detectExpansions(); |
| |
| UnicodeString toString(UBool useLinks = FALSE); |
| UnicodeString toStringFromEmpty(); |
| UnicodeString toPrettyString(UBool useLinks, UBool printSortKeys = FALSE); |
| UnicodeString toOutput(const char *format, |
| const char *locale, const char *platform, const char *reference, |
| UBool useLinks, UBool initialize, UBool moreToCome); |
| UnicodeString toBundle(const char *locale, const char *platform, const char *reference, |
| UBool useLinks, UBool initialize, UBool moreToCome); |
| UnicodeString toHTML(const char *locale, const char *platform, const char *reference, |
| UBool useLinks, UBool initialize, UBool moreToCome); |
| UnicodeString toXML(const char *locale, const char *platform, const char *reference, |
| UBool useLinks, UBool initialize, UBool moreToCome); |
| UnicodeString arrayToString(Line** sortedLines, int32_t linesSize, UBool pretty, UBool useLinks, UBool printSortKeys); |
| void setSortingArray(Line **sortingArray, Line *elements, int32_t sizeToSort); |
| int32_t setSortingArray(Line **sortingArray, Hashtable *table); |
| |
| void reduceDifference(SortedLines& reference); |
| void getRepertoire(UnicodeSet &fillIn); |
| void removeDecompositionsFromRepertoire(); |
| void getBounds(UErrorCode &status); |
| void classifyRepertoire(); |
| void toFile(FILE *file, UBool useLinks, UErrorCode &status); |
| void swapCase(); |
| void calculateSortKeys(); |
| void calculateSortKey(Line &line); |
| private: |
| void init(); |
| void init(UnicodeSet &rep, Line *lin); |
| int32_t detectContractions(Line **firstRep, int32_t firstSize, |
| Line **secondRep, int32_t secondSize, |
| Line *toAddTo, int32_t &toAddToSize, |
| Line *lesserToAddTo, int32_t &lesserToAddToSize, |
| int32_t capacity, UErrorCode &status); |
| |
| void calculateCumulativeStrengths(Line *start, Line *end); |
| void transferCumulativeStrength(Line *previous, Line *that); |
| void updateBounds(UnicodeSet &set); |
| void addAll(Line* toAdd, int32_t toAddSize); |
| void setDistancesFromEmpty(Line* array, int32_t arraySize); |
| void noteContraction(const char* msg, Line *toAddTo, int32_t &toAddToSize, Line *left, Line *right, int32_t &noConts, UErrorCode &status); |
| int32_t gooseUp(int32_t resetIndex, int32_t expansionIndex, Line &expLine, int32_t *expIndexes, int32_t &expIndexSize, UColAttributeValue strength); |
| UBool getExpansionLine(const Line &expansion, const Line &previous, const Line &exp, Line &expansionLine); |
| |
| |
| }; |
| |
| #endif // #ifndef COLPROBE_SORTEDLINES_H |