1*0e209d39SAndroid Build Coastguard Worker // © 2016 and later: Unicode, Inc. and others. 2*0e209d39SAndroid Build Coastguard Worker // License & terms of use: http://www.unicode.org/copyright.html 3*0e209d39SAndroid Build Coastguard Worker /* 4*0e209d39SAndroid Build Coastguard Worker ******************************************************************************* 5*0e209d39SAndroid Build Coastguard Worker * Copyright (C) 2007-2016, International Business Machines Corporation and 6*0e209d39SAndroid Build Coastguard Worker * others. All Rights Reserved. 7*0e209d39SAndroid Build Coastguard Worker ******************************************************************************* 8*0e209d39SAndroid Build Coastguard Worker * 9*0e209d39SAndroid Build Coastguard Worker * File DTPTNGEN.H 10*0e209d39SAndroid Build Coastguard Worker * 11*0e209d39SAndroid Build Coastguard Worker ******************************************************************************* 12*0e209d39SAndroid Build Coastguard Worker */ 13*0e209d39SAndroid Build Coastguard Worker 14*0e209d39SAndroid Build Coastguard Worker #ifndef __DTPTNGEN_IMPL_H__ 15*0e209d39SAndroid Build Coastguard Worker #define __DTPTNGEN_IMPL_H__ 16*0e209d39SAndroid Build Coastguard Worker 17*0e209d39SAndroid Build Coastguard Worker #include "unicode/udatpg.h" 18*0e209d39SAndroid Build Coastguard Worker 19*0e209d39SAndroid Build Coastguard Worker #include "unicode/strenum.h" 20*0e209d39SAndroid Build Coastguard Worker #include "unicode/unistr.h" 21*0e209d39SAndroid Build Coastguard Worker #include "uvector.h" 22*0e209d39SAndroid Build Coastguard Worker 23*0e209d39SAndroid Build Coastguard Worker // TODO(claireho): Split off Builder class. 24*0e209d39SAndroid Build Coastguard Worker // TODO(claireho): If splitting off Builder class: As subclass or independent? 25*0e209d39SAndroid Build Coastguard Worker 26*0e209d39SAndroid Build Coastguard Worker #define MAX_PATTERN_ENTRIES 52 27*0e209d39SAndroid Build Coastguard Worker #define MAX_CLDR_FIELD_LEN 60 28*0e209d39SAndroid Build Coastguard Worker #define MAX_DT_TOKEN 50 29*0e209d39SAndroid Build Coastguard Worker #define MAX_RESOURCE_FIELD 12 30*0e209d39SAndroid Build Coastguard Worker #define MAX_AVAILABLE_FORMATS 12 31*0e209d39SAndroid Build Coastguard Worker #define NONE 0 32*0e209d39SAndroid Build Coastguard Worker #define EXTRA_FIELD 0x10000 33*0e209d39SAndroid Build Coastguard Worker #define MISSING_FIELD 0x1000 34*0e209d39SAndroid Build Coastguard Worker #define MAX_STRING_ENUMERATION 200 35*0e209d39SAndroid Build Coastguard Worker #define SINGLE_QUOTE ((char16_t)0x0027) 36*0e209d39SAndroid Build Coastguard Worker #define FORWARDSLASH ((char16_t)0x002F) 37*0e209d39SAndroid Build Coastguard Worker #define BACKSLASH ((char16_t)0x005C) 38*0e209d39SAndroid Build Coastguard Worker #define SPACE ((char16_t)0x0020) 39*0e209d39SAndroid Build Coastguard Worker #define QUOTATION_MARK ((char16_t)0x0022) 40*0e209d39SAndroid Build Coastguard Worker #define ASTERISK ((char16_t)0x002A) 41*0e209d39SAndroid Build Coastguard Worker #define PLUSSITN ((char16_t)0x002B) 42*0e209d39SAndroid Build Coastguard Worker #define COMMA ((char16_t)0x002C) 43*0e209d39SAndroid Build Coastguard Worker #define HYPHEN ((char16_t)0x002D) 44*0e209d39SAndroid Build Coastguard Worker #define DOT ((char16_t)0x002E) 45*0e209d39SAndroid Build Coastguard Worker #define COLON ((char16_t)0x003A) 46*0e209d39SAndroid Build Coastguard Worker #define CAP_A ((char16_t)0x0041) 47*0e209d39SAndroid Build Coastguard Worker #define CAP_B ((char16_t)0x0042) 48*0e209d39SAndroid Build Coastguard Worker #define CAP_C ((char16_t)0x0043) 49*0e209d39SAndroid Build Coastguard Worker #define CAP_D ((char16_t)0x0044) 50*0e209d39SAndroid Build Coastguard Worker #define CAP_E ((char16_t)0x0045) 51*0e209d39SAndroid Build Coastguard Worker #define CAP_F ((char16_t)0x0046) 52*0e209d39SAndroid Build Coastguard Worker #define CAP_G ((char16_t)0x0047) 53*0e209d39SAndroid Build Coastguard Worker #define CAP_H ((char16_t)0x0048) 54*0e209d39SAndroid Build Coastguard Worker #define CAP_J ((char16_t)0x004A) 55*0e209d39SAndroid Build Coastguard Worker #define CAP_K ((char16_t)0x004B) 56*0e209d39SAndroid Build Coastguard Worker #define CAP_L ((char16_t)0x004C) 57*0e209d39SAndroid Build Coastguard Worker #define CAP_M ((char16_t)0x004D) 58*0e209d39SAndroid Build Coastguard Worker #define CAP_O ((char16_t)0x004F) 59*0e209d39SAndroid Build Coastguard Worker #define CAP_Q ((char16_t)0x0051) 60*0e209d39SAndroid Build Coastguard Worker #define CAP_S ((char16_t)0x0053) 61*0e209d39SAndroid Build Coastguard Worker #define CAP_T ((char16_t)0x0054) 62*0e209d39SAndroid Build Coastguard Worker #define CAP_U ((char16_t)0x0055) 63*0e209d39SAndroid Build Coastguard Worker #define CAP_V ((char16_t)0x0056) 64*0e209d39SAndroid Build Coastguard Worker #define CAP_W ((char16_t)0x0057) 65*0e209d39SAndroid Build Coastguard Worker #define CAP_X ((char16_t)0x0058) 66*0e209d39SAndroid Build Coastguard Worker #define CAP_Y ((char16_t)0x0059) 67*0e209d39SAndroid Build Coastguard Worker #define CAP_Z ((char16_t)0x005A) 68*0e209d39SAndroid Build Coastguard Worker #define LOWLINE ((char16_t)0x005F) 69*0e209d39SAndroid Build Coastguard Worker #define LOW_A ((char16_t)0x0061) 70*0e209d39SAndroid Build Coastguard Worker #define LOW_B ((char16_t)0x0062) 71*0e209d39SAndroid Build Coastguard Worker #define LOW_C ((char16_t)0x0063) 72*0e209d39SAndroid Build Coastguard Worker #define LOW_D ((char16_t)0x0064) 73*0e209d39SAndroid Build Coastguard Worker #define LOW_E ((char16_t)0x0065) 74*0e209d39SAndroid Build Coastguard Worker #define LOW_F ((char16_t)0x0066) 75*0e209d39SAndroid Build Coastguard Worker #define LOW_G ((char16_t)0x0067) 76*0e209d39SAndroid Build Coastguard Worker #define LOW_H ((char16_t)0x0068) 77*0e209d39SAndroid Build Coastguard Worker #define LOW_I ((char16_t)0x0069) 78*0e209d39SAndroid Build Coastguard Worker #define LOW_J ((char16_t)0x006A) 79*0e209d39SAndroid Build Coastguard Worker #define LOW_K ((char16_t)0x006B) 80*0e209d39SAndroid Build Coastguard Worker #define LOW_L ((char16_t)0x006C) 81*0e209d39SAndroid Build Coastguard Worker #define LOW_M ((char16_t)0x006D) 82*0e209d39SAndroid Build Coastguard Worker #define LOW_N ((char16_t)0x006E) 83*0e209d39SAndroid Build Coastguard Worker #define LOW_O ((char16_t)0x006F) 84*0e209d39SAndroid Build Coastguard Worker #define LOW_P ((char16_t)0x0070) 85*0e209d39SAndroid Build Coastguard Worker #define LOW_Q ((char16_t)0x0071) 86*0e209d39SAndroid Build Coastguard Worker #define LOW_R ((char16_t)0x0072) 87*0e209d39SAndroid Build Coastguard Worker #define LOW_S ((char16_t)0x0073) 88*0e209d39SAndroid Build Coastguard Worker #define LOW_T ((char16_t)0x0074) 89*0e209d39SAndroid Build Coastguard Worker #define LOW_U ((char16_t)0x0075) 90*0e209d39SAndroid Build Coastguard Worker #define LOW_V ((char16_t)0x0076) 91*0e209d39SAndroid Build Coastguard Worker #define LOW_W ((char16_t)0x0077) 92*0e209d39SAndroid Build Coastguard Worker #define LOW_X ((char16_t)0x0078) 93*0e209d39SAndroid Build Coastguard Worker #define LOW_Y ((char16_t)0x0079) 94*0e209d39SAndroid Build Coastguard Worker #define LOW_Z ((char16_t)0x007A) 95*0e209d39SAndroid Build Coastguard Worker #define DT_NARROW -0x101 96*0e209d39SAndroid Build Coastguard Worker #define DT_SHORTER -0x102 97*0e209d39SAndroid Build Coastguard Worker #define DT_SHORT -0x103 98*0e209d39SAndroid Build Coastguard Worker #define DT_LONG -0x104 99*0e209d39SAndroid Build Coastguard Worker #define DT_NUMERIC 0x100 100*0e209d39SAndroid Build Coastguard Worker #define DT_DELTA 0x10 101*0e209d39SAndroid Build Coastguard Worker 102*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_BEGIN 103*0e209d39SAndroid Build Coastguard Worker 104*0e209d39SAndroid Build Coastguard Worker const int32_t UDATPG_FRACTIONAL_MASK = 1<<UDATPG_FRACTIONAL_SECOND_FIELD; 105*0e209d39SAndroid Build Coastguard Worker const int32_t UDATPG_SECOND_AND_FRACTIONAL_MASK = (1<<UDATPG_SECOND_FIELD) | (1<<UDATPG_FRACTIONAL_SECOND_FIELD); 106*0e209d39SAndroid Build Coastguard Worker 107*0e209d39SAndroid Build Coastguard Worker typedef enum dtStrEnum { 108*0e209d39SAndroid Build Coastguard Worker DT_BASESKELETON, 109*0e209d39SAndroid Build Coastguard Worker DT_SKELETON, 110*0e209d39SAndroid Build Coastguard Worker DT_PATTERN 111*0e209d39SAndroid Build Coastguard Worker }dtStrEnum; 112*0e209d39SAndroid Build Coastguard Worker 113*0e209d39SAndroid Build Coastguard Worker typedef struct dtTypeElem { 114*0e209d39SAndroid Build Coastguard Worker char16_t patternChar; 115*0e209d39SAndroid Build Coastguard Worker UDateTimePatternField field; 116*0e209d39SAndroid Build Coastguard Worker int16_t type; 117*0e209d39SAndroid Build Coastguard Worker int16_t minLen; 118*0e209d39SAndroid Build Coastguard Worker int16_t weight; 119*0e209d39SAndroid Build Coastguard Worker } dtTypeElem; 120*0e209d39SAndroid Build Coastguard Worker 121*0e209d39SAndroid Build Coastguard Worker // A compact storage mechanism for skeleton field strings. Several dozen of these will be created 122*0e209d39SAndroid Build Coastguard Worker // for a typical DateTimePatternGenerator instance. 123*0e209d39SAndroid Build Coastguard Worker class SkeletonFields : public UMemory { 124*0e209d39SAndroid Build Coastguard Worker public: 125*0e209d39SAndroid Build Coastguard Worker SkeletonFields(); 126*0e209d39SAndroid Build Coastguard Worker void clear(); 127*0e209d39SAndroid Build Coastguard Worker void copyFrom(const SkeletonFields& other); 128*0e209d39SAndroid Build Coastguard Worker void clearField(int32_t field); 129*0e209d39SAndroid Build Coastguard Worker char16_t getFieldChar(int32_t field) const; 130*0e209d39SAndroid Build Coastguard Worker int32_t getFieldLength(int32_t field) const; 131*0e209d39SAndroid Build Coastguard Worker void populate(int32_t field, const UnicodeString& value); 132*0e209d39SAndroid Build Coastguard Worker void populate(int32_t field, char16_t repeatChar, int32_t repeatCount); 133*0e209d39SAndroid Build Coastguard Worker UBool isFieldEmpty(int32_t field) const; 134*0e209d39SAndroid Build Coastguard Worker UnicodeString& appendTo(UnicodeString& string) const; 135*0e209d39SAndroid Build Coastguard Worker UnicodeString& appendFieldTo(int32_t field, UnicodeString& string) const; 136*0e209d39SAndroid Build Coastguard Worker char16_t getFirstChar() const; 137*0e209d39SAndroid Build Coastguard Worker inline bool operator==(const SkeletonFields& other) const; 138*0e209d39SAndroid Build Coastguard Worker inline bool operator!=(const SkeletonFields& other) const; 139*0e209d39SAndroid Build Coastguard Worker 140*0e209d39SAndroid Build Coastguard Worker private: 141*0e209d39SAndroid Build Coastguard Worker int8_t chars[UDATPG_FIELD_COUNT]; 142*0e209d39SAndroid Build Coastguard Worker int8_t lengths[UDATPG_FIELD_COUNT]; 143*0e209d39SAndroid Build Coastguard Worker }; 144*0e209d39SAndroid Build Coastguard Worker 145*0e209d39SAndroid Build Coastguard Worker inline bool SkeletonFields::operator==(const SkeletonFields& other) const { 146*0e209d39SAndroid Build Coastguard Worker return (uprv_memcmp(chars, other.chars, sizeof(chars)) == 0 147*0e209d39SAndroid Build Coastguard Worker && uprv_memcmp(lengths, other.lengths, sizeof(lengths)) == 0); 148*0e209d39SAndroid Build Coastguard Worker } 149*0e209d39SAndroid Build Coastguard Worker 150*0e209d39SAndroid Build Coastguard Worker inline bool SkeletonFields::operator!=(const SkeletonFields& other) const { 151*0e209d39SAndroid Build Coastguard Worker return (! operator==(other)); 152*0e209d39SAndroid Build Coastguard Worker } 153*0e209d39SAndroid Build Coastguard Worker 154*0e209d39SAndroid Build Coastguard Worker class PtnSkeleton : public UMemory { 155*0e209d39SAndroid Build Coastguard Worker public: 156*0e209d39SAndroid Build Coastguard Worker int32_t type[UDATPG_FIELD_COUNT]; 157*0e209d39SAndroid Build Coastguard Worker SkeletonFields original; 158*0e209d39SAndroid Build Coastguard Worker SkeletonFields baseOriginal; 159*0e209d39SAndroid Build Coastguard Worker UBool addedDefaultDayPeriod; 160*0e209d39SAndroid Build Coastguard Worker 161*0e209d39SAndroid Build Coastguard Worker PtnSkeleton(); 162*0e209d39SAndroid Build Coastguard Worker PtnSkeleton(const PtnSkeleton& other); 163*0e209d39SAndroid Build Coastguard Worker void copyFrom(const PtnSkeleton& other); 164*0e209d39SAndroid Build Coastguard Worker void clear(); 165*0e209d39SAndroid Build Coastguard Worker UBool equals(const PtnSkeleton& other) const; 166*0e209d39SAndroid Build Coastguard Worker UnicodeString getSkeleton() const; 167*0e209d39SAndroid Build Coastguard Worker UnicodeString getBaseSkeleton() const; 168*0e209d39SAndroid Build Coastguard Worker char16_t getFirstChar() const; 169*0e209d39SAndroid Build Coastguard Worker 170*0e209d39SAndroid Build Coastguard Worker // TODO: Why is this virtual, as well as the other destructors in this file? We don't want 171*0e209d39SAndroid Build Coastguard Worker // vtables when we don't use class objects polymorphically. 172*0e209d39SAndroid Build Coastguard Worker virtual ~PtnSkeleton(); 173*0e209d39SAndroid Build Coastguard Worker }; 174*0e209d39SAndroid Build Coastguard Worker 175*0e209d39SAndroid Build Coastguard Worker class PtnElem : public UMemory { 176*0e209d39SAndroid Build Coastguard Worker public: 177*0e209d39SAndroid Build Coastguard Worker UnicodeString basePattern; 178*0e209d39SAndroid Build Coastguard Worker LocalPointer<PtnSkeleton> skeleton; 179*0e209d39SAndroid Build Coastguard Worker UnicodeString pattern; 180*0e209d39SAndroid Build Coastguard Worker UBool skeletonWasSpecified; // if specified in availableFormats, not derived 181*0e209d39SAndroid Build Coastguard Worker LocalPointer<PtnElem> next; 182*0e209d39SAndroid Build Coastguard Worker 183*0e209d39SAndroid Build Coastguard Worker PtnElem(const UnicodeString &basePattern, const UnicodeString &pattern); 184*0e209d39SAndroid Build Coastguard Worker virtual ~PtnElem(); 185*0e209d39SAndroid Build Coastguard Worker }; 186*0e209d39SAndroid Build Coastguard Worker 187*0e209d39SAndroid Build Coastguard Worker class FormatParser : public UMemory { 188*0e209d39SAndroid Build Coastguard Worker public: 189*0e209d39SAndroid Build Coastguard Worker UnicodeString items[MAX_DT_TOKEN]; 190*0e209d39SAndroid Build Coastguard Worker int32_t itemNumber; 191*0e209d39SAndroid Build Coastguard Worker 192*0e209d39SAndroid Build Coastguard Worker FormatParser(); 193*0e209d39SAndroid Build Coastguard Worker virtual ~FormatParser(); 194*0e209d39SAndroid Build Coastguard Worker void set(const UnicodeString& patternString); 195*0e209d39SAndroid Build Coastguard Worker void getQuoteLiteral(UnicodeString& quote, int32_t *itemIndex); 196*0e209d39SAndroid Build Coastguard Worker UBool isPatternSeparator(const UnicodeString& field) const; 197*0e209d39SAndroid Build Coastguard Worker static UBool isQuoteLiteral(const UnicodeString& s); getCanonicalIndex(const UnicodeString & s)198*0e209d39SAndroid Build Coastguard Worker static int32_t getCanonicalIndex(const UnicodeString& s) { return getCanonicalIndex(s, true); } 199*0e209d39SAndroid Build Coastguard Worker static int32_t getCanonicalIndex(const UnicodeString& s, UBool strict); 200*0e209d39SAndroid Build Coastguard Worker 201*0e209d39SAndroid Build Coastguard Worker private: 202*0e209d39SAndroid Build Coastguard Worker typedef enum TokenStatus { 203*0e209d39SAndroid Build Coastguard Worker START, 204*0e209d39SAndroid Build Coastguard Worker ADD_TOKEN, 205*0e209d39SAndroid Build Coastguard Worker SYNTAX_ERROR, 206*0e209d39SAndroid Build Coastguard Worker DONE 207*0e209d39SAndroid Build Coastguard Worker } TokenStatus; 208*0e209d39SAndroid Build Coastguard Worker 209*0e209d39SAndroid Build Coastguard Worker TokenStatus status; 210*0e209d39SAndroid Build Coastguard Worker virtual TokenStatus setTokens(const UnicodeString& pattern, int32_t startPos, int32_t *len); 211*0e209d39SAndroid Build Coastguard Worker }; 212*0e209d39SAndroid Build Coastguard Worker 213*0e209d39SAndroid Build Coastguard Worker class DistanceInfo : public UMemory { 214*0e209d39SAndroid Build Coastguard Worker public: 215*0e209d39SAndroid Build Coastguard Worker int32_t missingFieldMask; 216*0e209d39SAndroid Build Coastguard Worker int32_t extraFieldMask; 217*0e209d39SAndroid Build Coastguard Worker DistanceInfo()218*0e209d39SAndroid Build Coastguard Worker DistanceInfo() {} 219*0e209d39SAndroid Build Coastguard Worker virtual ~DistanceInfo(); clear()220*0e209d39SAndroid Build Coastguard Worker void clear() { missingFieldMask = extraFieldMask = 0; } 221*0e209d39SAndroid Build Coastguard Worker void setTo(const DistanceInfo& other); addMissing(int32_t field)222*0e209d39SAndroid Build Coastguard Worker void addMissing(int32_t field) { missingFieldMask |= (1<<field); } addExtra(int32_t field)223*0e209d39SAndroid Build Coastguard Worker void addExtra(int32_t field) { extraFieldMask |= (1<<field); } 224*0e209d39SAndroid Build Coastguard Worker }; 225*0e209d39SAndroid Build Coastguard Worker 226*0e209d39SAndroid Build Coastguard Worker class DateTimeMatcher: public UMemory { 227*0e209d39SAndroid Build Coastguard Worker public: 228*0e209d39SAndroid Build Coastguard Worker PtnSkeleton skeleton; 229*0e209d39SAndroid Build Coastguard Worker 230*0e209d39SAndroid Build Coastguard Worker void getBasePattern(UnicodeString& basePattern); 231*0e209d39SAndroid Build Coastguard Worker UnicodeString getPattern(); 232*0e209d39SAndroid Build Coastguard Worker void set(const UnicodeString& pattern, FormatParser* fp); 233*0e209d39SAndroid Build Coastguard Worker void set(const UnicodeString& pattern, FormatParser* fp, PtnSkeleton& skeleton); 234*0e209d39SAndroid Build Coastguard Worker void copyFrom(const PtnSkeleton& skeleton); 235*0e209d39SAndroid Build Coastguard Worker void copyFrom(); 236*0e209d39SAndroid Build Coastguard Worker PtnSkeleton* getSkeletonPtr(); 237*0e209d39SAndroid Build Coastguard Worker UBool equals(const DateTimeMatcher* other) const; 238*0e209d39SAndroid Build Coastguard Worker int32_t getDistance(const DateTimeMatcher& other, int32_t includeMask, DistanceInfo& distanceInfo) const; 239*0e209d39SAndroid Build Coastguard Worker DateTimeMatcher(); 240*0e209d39SAndroid Build Coastguard Worker DateTimeMatcher(const DateTimeMatcher& other); 241*0e209d39SAndroid Build Coastguard Worker DateTimeMatcher& operator=(const DateTimeMatcher& other); 242*0e209d39SAndroid Build Coastguard Worker virtual ~DateTimeMatcher(); 243*0e209d39SAndroid Build Coastguard Worker int32_t getFieldMask() const; 244*0e209d39SAndroid Build Coastguard Worker }; 245*0e209d39SAndroid Build Coastguard Worker 246*0e209d39SAndroid Build Coastguard Worker class PatternMap : public UMemory { 247*0e209d39SAndroid Build Coastguard Worker public: 248*0e209d39SAndroid Build Coastguard Worker PtnElem *boot[MAX_PATTERN_ENTRIES]; 249*0e209d39SAndroid Build Coastguard Worker PatternMap(); 250*0e209d39SAndroid Build Coastguard Worker virtual ~PatternMap(); 251*0e209d39SAndroid Build Coastguard Worker void add(const UnicodeString& basePattern, const PtnSkeleton& skeleton, const UnicodeString& value, UBool skeletonWasSpecified, UErrorCode& status); 252*0e209d39SAndroid Build Coastguard Worker const UnicodeString* getPatternFromBasePattern(const UnicodeString& basePattern, UBool& skeletonWasSpecified) const; 253*0e209d39SAndroid Build Coastguard Worker const UnicodeString* getPatternFromSkeleton(const PtnSkeleton& skeleton, const PtnSkeleton** specifiedSkeletonPtr = nullptr) const; 254*0e209d39SAndroid Build Coastguard Worker void copyFrom(const PatternMap& other, UErrorCode& status); 255*0e209d39SAndroid Build Coastguard Worker PtnElem* getHeader(char16_t baseChar) const; 256*0e209d39SAndroid Build Coastguard Worker UBool equals(const PatternMap& other) const; 257*0e209d39SAndroid Build Coastguard Worker private: 258*0e209d39SAndroid Build Coastguard Worker UBool isDupAllowed; 259*0e209d39SAndroid Build Coastguard Worker PtnElem* getDuplicateElem(const UnicodeString& basePattern, const PtnSkeleton& skeleton, PtnElem *baseElem); 260*0e209d39SAndroid Build Coastguard Worker }; // end PatternMap 261*0e209d39SAndroid Build Coastguard Worker 262*0e209d39SAndroid Build Coastguard Worker class PatternMapIterator : public UMemory { 263*0e209d39SAndroid Build Coastguard Worker public: 264*0e209d39SAndroid Build Coastguard Worker PatternMapIterator(UErrorCode &status); 265*0e209d39SAndroid Build Coastguard Worker virtual ~PatternMapIterator(); 266*0e209d39SAndroid Build Coastguard Worker void set(PatternMap& patternMap); 267*0e209d39SAndroid Build Coastguard Worker PtnSkeleton* getSkeleton() const; 268*0e209d39SAndroid Build Coastguard Worker UBool hasNext() const; 269*0e209d39SAndroid Build Coastguard Worker DateTimeMatcher& next(); 270*0e209d39SAndroid Build Coastguard Worker private: 271*0e209d39SAndroid Build Coastguard Worker int32_t bootIndex; 272*0e209d39SAndroid Build Coastguard Worker PtnElem *nodePtr; 273*0e209d39SAndroid Build Coastguard Worker LocalPointer<DateTimeMatcher> matcher; 274*0e209d39SAndroid Build Coastguard Worker PatternMap *patternMap; 275*0e209d39SAndroid Build Coastguard Worker }; 276*0e209d39SAndroid Build Coastguard Worker 277*0e209d39SAndroid Build Coastguard Worker class DTSkeletonEnumeration : public StringEnumeration { 278*0e209d39SAndroid Build Coastguard Worker public: 279*0e209d39SAndroid Build Coastguard Worker DTSkeletonEnumeration(PatternMap& patternMap, dtStrEnum type, UErrorCode& status); 280*0e209d39SAndroid Build Coastguard Worker virtual ~DTSkeletonEnumeration(); 281*0e209d39SAndroid Build Coastguard Worker static UClassID U_EXPORT2 getStaticClassID(); 282*0e209d39SAndroid Build Coastguard Worker virtual UClassID getDynamicClassID() const override; 283*0e209d39SAndroid Build Coastguard Worker virtual const UnicodeString* snext(UErrorCode& status) override; 284*0e209d39SAndroid Build Coastguard Worker virtual void reset(UErrorCode& status) override; 285*0e209d39SAndroid Build Coastguard Worker virtual int32_t count(UErrorCode& status) const override; 286*0e209d39SAndroid Build Coastguard Worker private: 287*0e209d39SAndroid Build Coastguard Worker int32_t pos; 288*0e209d39SAndroid Build Coastguard Worker UBool isCanonicalItem(const UnicodeString& item); 289*0e209d39SAndroid Build Coastguard Worker LocalPointer<UVector> fSkeletons; 290*0e209d39SAndroid Build Coastguard Worker }; 291*0e209d39SAndroid Build Coastguard Worker 292*0e209d39SAndroid Build Coastguard Worker class DTRedundantEnumeration : public StringEnumeration { 293*0e209d39SAndroid Build Coastguard Worker public: 294*0e209d39SAndroid Build Coastguard Worker DTRedundantEnumeration(); 295*0e209d39SAndroid Build Coastguard Worker virtual ~DTRedundantEnumeration(); 296*0e209d39SAndroid Build Coastguard Worker static UClassID U_EXPORT2 getStaticClassID(); 297*0e209d39SAndroid Build Coastguard Worker virtual UClassID getDynamicClassID() const override; 298*0e209d39SAndroid Build Coastguard Worker virtual const UnicodeString* snext(UErrorCode& status) override; 299*0e209d39SAndroid Build Coastguard Worker virtual void reset(UErrorCode& status) override; 300*0e209d39SAndroid Build Coastguard Worker virtual int32_t count(UErrorCode& status) const override; 301*0e209d39SAndroid Build Coastguard Worker void add(const UnicodeString &pattern, UErrorCode& status); 302*0e209d39SAndroid Build Coastguard Worker private: 303*0e209d39SAndroid Build Coastguard Worker int32_t pos; 304*0e209d39SAndroid Build Coastguard Worker UBool isCanonicalItem(const UnicodeString& item) const; 305*0e209d39SAndroid Build Coastguard Worker LocalPointer<UVector> fPatterns; 306*0e209d39SAndroid Build Coastguard Worker }; 307*0e209d39SAndroid Build Coastguard Worker 308*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_END 309*0e209d39SAndroid Build Coastguard Worker 310*0e209d39SAndroid Build Coastguard Worker #endif 311