blob: 5f370066dd51ddc1c326d60205f7c919e7a690fd [file] [log] [blame]
#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