| Index: source/i18n/utf16collationiterator.h
|
| diff --git a/source/i18n/utf16collationiterator.h b/source/i18n/utf16collationiterator.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..16de2078ed0b3f42d245701894ba67b0795047d2
|
| --- /dev/null
|
| +++ b/source/i18n/utf16collationiterator.h
|
| @@ -0,0 +1,184 @@
|
| +/*
|
| +*******************************************************************************
|
| +* Copyright (C) 2010-2014, International Business Machines
|
| +* Corporation and others. All Rights Reserved.
|
| +*******************************************************************************
|
| +* utf16collationiterator.h
|
| +*
|
| +* created on: 2010oct27
|
| +* created by: Markus W. Scherer
|
| +*/
|
| +
|
| +#ifndef __UTF16COLLATIONITERATOR_H__
|
| +#define __UTF16COLLATIONITERATOR_H__
|
| +
|
| +#include "unicode/utypes.h"
|
| +
|
| +#if !UCONFIG_NO_COLLATION
|
| +
|
| +#include "cmemory.h"
|
| +#include "collation.h"
|
| +#include "collationdata.h"
|
| +#include "collationiterator.h"
|
| +#include "normalizer2impl.h"
|
| +
|
| +U_NAMESPACE_BEGIN
|
| +
|
| +/**
|
| + * UTF-16 collation element and character iterator.
|
| + * Handles normalized UTF-16 text inline, with length or NUL-terminated.
|
| + * Unnormalized text is handled by a subclass.
|
| + */
|
| +class U_I18N_API UTF16CollationIterator : public CollationIterator {
|
| +public:
|
| + UTF16CollationIterator(const CollationData *d, UBool numeric,
|
| + const UChar *s, const UChar *p, const UChar *lim)
|
| + : CollationIterator(d, numeric),
|
| + start(s), pos(p), limit(lim) {}
|
| +
|
| + UTF16CollationIterator(const UTF16CollationIterator &other, const UChar *newText);
|
| +
|
| + virtual ~UTF16CollationIterator();
|
| +
|
| + virtual UBool operator==(const CollationIterator &other) const;
|
| +
|
| + virtual void resetToOffset(int32_t newOffset);
|
| +
|
| + virtual int32_t getOffset() const;
|
| +
|
| + void setText(const UChar *s, const UChar *lim) {
|
| + reset();
|
| + start = pos = s;
|
| + limit = lim;
|
| + }
|
| +
|
| + virtual UChar32 nextCodePoint(UErrorCode &errorCode);
|
| +
|
| + virtual UChar32 previousCodePoint(UErrorCode &errorCode);
|
| +
|
| +protected:
|
| + // Copy constructor only for subclasses which set the pointers.
|
| + UTF16CollationIterator(const UTF16CollationIterator &other)
|
| + : CollationIterator(other),
|
| + start(NULL), pos(NULL), limit(NULL) {}
|
| +
|
| + virtual uint32_t handleNextCE32(UChar32 &c, UErrorCode &errorCode);
|
| +
|
| + virtual UChar handleGetTrailSurrogate();
|
| +
|
| + virtual UBool foundNULTerminator();
|
| +
|
| + virtual void forwardNumCodePoints(int32_t num, UErrorCode &errorCode);
|
| +
|
| + virtual void backwardNumCodePoints(int32_t num, UErrorCode &errorCode);
|
| +
|
| + // UTF-16 string pointers.
|
| + // limit can be NULL for NUL-terminated strings.
|
| + const UChar *start, *pos, *limit;
|
| +};
|
| +
|
| +/**
|
| + * Incrementally checks the input text for FCD and normalizes where necessary.
|
| + */
|
| +class U_I18N_API FCDUTF16CollationIterator : public UTF16CollationIterator {
|
| +public:
|
| + FCDUTF16CollationIterator(const CollationData *data, UBool numeric,
|
| + const UChar *s, const UChar *p, const UChar *lim)
|
| + : UTF16CollationIterator(data, numeric, s, p, lim),
|
| + rawStart(s), segmentStart(p), segmentLimit(NULL), rawLimit(lim),
|
| + nfcImpl(data->nfcImpl),
|
| + checkDir(1) {}
|
| +
|
| + FCDUTF16CollationIterator(const FCDUTF16CollationIterator &other, const UChar *newText);
|
| +
|
| + virtual ~FCDUTF16CollationIterator();
|
| +
|
| + virtual UBool operator==(const CollationIterator &other) const;
|
| +
|
| + virtual void resetToOffset(int32_t newOffset);
|
| +
|
| + virtual int32_t getOffset() const;
|
| +
|
| + virtual UChar32 nextCodePoint(UErrorCode &errorCode);
|
| +
|
| + virtual UChar32 previousCodePoint(UErrorCode &errorCode);
|
| +
|
| +protected:
|
| + virtual uint32_t handleNextCE32(UChar32 &c, UErrorCode &errorCode);
|
| +
|
| + virtual UBool foundNULTerminator();
|
| +
|
| + virtual void forwardNumCodePoints(int32_t num, UErrorCode &errorCode);
|
| +
|
| + virtual void backwardNumCodePoints(int32_t num, UErrorCode &errorCode);
|
| +
|
| +private:
|
| + /**
|
| + * Switches to forward checking if possible.
|
| + * To be called when checkDir < 0 || (checkDir == 0 && pos == limit).
|
| + * Returns with checkDir > 0 || (checkDir == 0 && pos != limit).
|
| + */
|
| + void switchToForward();
|
| +
|
| + /**
|
| + * Extend the FCD text segment forward or normalize around pos.
|
| + * To be called when checkDir > 0 && pos != limit.
|
| + * @return TRUE if success, checkDir == 0 and pos != limit
|
| + */
|
| + UBool nextSegment(UErrorCode &errorCode);
|
| +
|
| + /**
|
| + * Switches to backward checking.
|
| + * To be called when checkDir > 0 || (checkDir == 0 && pos == start).
|
| + * Returns with checkDir < 0 || (checkDir == 0 && pos != start).
|
| + */
|
| + void switchToBackward();
|
| +
|
| + /**
|
| + * Extend the FCD text segment backward or normalize around pos.
|
| + * To be called when checkDir < 0 && pos != start.
|
| + * @return TRUE if success, checkDir == 0 and pos != start
|
| + */
|
| + UBool previousSegment(UErrorCode &errorCode);
|
| +
|
| + UBool normalize(const UChar *from, const UChar *to, UErrorCode &errorCode);
|
| +
|
| + // Text pointers: The input text is [rawStart, rawLimit[
|
| + // where rawLimit can be NULL for NUL-terminated text.
|
| + //
|
| + // checkDir > 0:
|
| + //
|
| + // The input text [segmentStart..pos[ passes the FCD check.
|
| + // Moving forward checks incrementally.
|
| + // segmentLimit is undefined. limit == rawLimit.
|
| + //
|
| + // checkDir < 0:
|
| + // The input text [pos..segmentLimit[ passes the FCD check.
|
| + // Moving backward checks incrementally.
|
| + // segmentStart is undefined, start == rawStart.
|
| + //
|
| + // checkDir == 0:
|
| + //
|
| + // The input text [segmentStart..segmentLimit[ is being processed.
|
| + // These pointers are at FCD boundaries.
|
| + // Either this text segment already passes the FCD check
|
| + // and segmentStart==start<=pos<=limit==segmentLimit,
|
| + // or the current segment had to be normalized so that
|
| + // [segmentStart..segmentLimit[ turned into the normalized string,
|
| + // corresponding to normalized.getBuffer()==start<=pos<=limit==start+normalized.length().
|
| + const UChar *rawStart;
|
| + const UChar *segmentStart;
|
| + const UChar *segmentLimit;
|
| + // rawLimit==NULL for a NUL-terminated string.
|
| + const UChar *rawLimit;
|
| +
|
| + const Normalizer2Impl &nfcImpl;
|
| + UnicodeString normalized;
|
| + // Direction of incremental FCD check. See comments before rawStart.
|
| + int8_t checkDir;
|
| +};
|
| +
|
| +U_NAMESPACE_END
|
| +
|
| +#endif // !UCONFIG_NO_COLLATION
|
| +#endif // __UTF16COLLATIONITERATOR_H__
|
|
|