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