00001
00002
00003
00004
00005
00006
00007
00008 #ifndef CANITER_H
00009 #define CANITER_H
00010
00011 #include "unicode/utypes.h"
00012
00013 #if !UCONFIG_NO_NORMALIZATION
00014
00015 #include "unicode/uobject.h"
00016 #include "unicode/unistr.h"
00017
00027 #ifndef CANITER_SKIP_ZEROES
00028 #define CANITER_SKIP_ZEROES TRUE
00029 #endif
00030
00031 U_NAMESPACE_BEGIN
00032
00033 class Hashtable;
00034
00070 class U_COMMON_API CanonicalIterator : public UObject {
00071 public:
00078 CanonicalIterator(const UnicodeString &source, UErrorCode &status);
00079
00084 virtual ~CanonicalIterator();
00085
00091 UnicodeString getSource();
00092
00097 void reset();
00098
00106 UnicodeString next();
00107
00115 void setSource(const UnicodeString &newSource, UErrorCode &status);
00116
00126 static void U_EXPORT2 permute(UnicodeString &source, UBool skipZeros, Hashtable *result, UErrorCode &status);
00127
00133 static UClassID U_EXPORT2 getStaticClassID();
00134
00140 virtual UClassID getDynamicClassID() const;
00141
00142 private:
00143
00144
00145 CanonicalIterator();
00146
00147
00152 CanonicalIterator(const CanonicalIterator& other);
00153
00158 CanonicalIterator& operator=(const CanonicalIterator& other);
00159
00160
00161 UnicodeString source;
00162 UBool done;
00163
00164
00165
00166 UnicodeString **pieces;
00167 int32_t pieces_length;
00168 int32_t *pieces_lengths;
00169
00170
00171 int32_t *current;
00172 int32_t current_length;
00173
00174
00175 UnicodeString buffer;
00176
00177
00178 UnicodeString *getEquivalents(const UnicodeString &segment, int32_t &result_len, UErrorCode &status);
00179
00180
00181 Hashtable *getEquivalents2(Hashtable *fillinResult, const UChar *segment, int32_t segLen, UErrorCode &status);
00182
00183
00189
00190 Hashtable *extract(Hashtable *fillinResult, UChar32 comp, const UChar *segment, int32_t segLen, int32_t segmentPos, UErrorCode &status);
00191
00192
00193 void cleanPieces();
00194
00195 };
00196
00197 U_NAMESPACE_END
00198
00199 #endif
00200
00201 #endif