OLD | NEW |
(Empty) | |
| 1 /* |
| 2 ******************************************************************************* |
| 3 * Copyright (C) 2007-2009, 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_K ((UChar)0x004B) |
| 48 #define CAP_L ((UChar)0x004C) |
| 49 #define CAP_M ((UChar)0x004D) |
| 50 #define CAP_O ((UChar)0x004F) |
| 51 #define CAP_Q ((UChar)0x0051) |
| 52 #define CAP_S ((UChar)0x0053) |
| 53 #define CAP_T ((UChar)0x0054) |
| 54 #define CAP_V ((UChar)0x0056) |
| 55 #define CAP_W ((UChar)0x0057) |
| 56 #define CAP_Y ((UChar)0x0059) |
| 57 #define CAP_Z ((UChar)0x005A) |
| 58 #define LOWLINE ((UChar)0x005F) |
| 59 #define LOW_A ((UChar)0x0061) |
| 60 #define LOW_C ((UChar)0x0063) |
| 61 #define LOW_D ((UChar)0x0064) |
| 62 #define LOW_E ((UChar)0x0065) |
| 63 #define LOW_F ((UChar)0x0066) |
| 64 #define LOW_G ((UChar)0x0067) |
| 65 #define LOW_H ((UChar)0x0068) |
| 66 #define LOW_I ((UChar)0x0069) |
| 67 #define LOW_J ((UChar)0x006A) |
| 68 #define LOW_K ((UChar)0x006B) |
| 69 #define LOW_L ((UChar)0x006C) |
| 70 #define LOW_M ((UChar)0x006D) |
| 71 #define LOW_N ((UChar)0x006E) |
| 72 #define LOW_O ((UChar)0x006F) |
| 73 #define LOW_P ((UChar)0x0070) |
| 74 #define LOW_Q ((UChar)0x0071) |
| 75 #define LOW_R ((UChar)0x0072) |
| 76 #define LOW_S ((UChar)0x0073) |
| 77 #define LOW_T ((UChar)0x0074) |
| 78 #define LOW_U ((UChar)0x0075) |
| 79 #define LOW_V ((UChar)0x0076) |
| 80 #define LOW_W ((UChar)0x0077) |
| 81 #define LOW_Y ((UChar)0x0079) |
| 82 #define LOW_Z ((UChar)0x007A) |
| 83 #define DT_SHORT -0x102 |
| 84 #define DT_LONG -0x103 |
| 85 #define DT_NUMERIC 0x100 |
| 86 #define DT_NARROW -0x101 |
| 87 #define DT_DELTA 0x10 |
| 88 |
| 89 U_NAMESPACE_BEGIN |
| 90 |
| 91 const int32_t UDATPG_FRACTIONAL_MASK = 1<<UDATPG_FRACTIONAL_SECOND_FIELD; |
| 92 const int32_t UDATPG_SECOND_AND_FRACTIONAL_MASK = (1<<UDATPG_SECOND_FIELD) | (1<
<UDATPG_FRACTIONAL_SECOND_FIELD); |
| 93 |
| 94 typedef enum dtStrEnum { |
| 95 DT_BASESKELETON, |
| 96 DT_SKELETON, |
| 97 DT_PATTERN |
| 98 }dtStrEnum; |
| 99 |
| 100 typedef struct dtTypeElem { |
| 101 UChar patternChar; |
| 102 UDateTimePatternField field; |
| 103 int16_t type; |
| 104 int16_t minLen; |
| 105 int16_t weight; |
| 106 }dtTypeElem; |
| 107 |
| 108 class PtnSkeleton : public UMemory { |
| 109 public: |
| 110 int32_t type[UDATPG_FIELD_COUNT]; |
| 111 UnicodeString original[UDATPG_FIELD_COUNT]; |
| 112 UnicodeString baseOriginal[UDATPG_FIELD_COUNT]; |
| 113 |
| 114 PtnSkeleton(); |
| 115 PtnSkeleton(const PtnSkeleton& other); |
| 116 UBool equals(const PtnSkeleton& other); |
| 117 UnicodeString getSkeleton(); |
| 118 UnicodeString getBaseSkeleton(); |
| 119 virtual ~PtnSkeleton(); |
| 120 }; |
| 121 |
| 122 |
| 123 class PtnElem : public UMemory { |
| 124 public: |
| 125 UnicodeString basePattern; |
| 126 PtnSkeleton *skeleton; |
| 127 UnicodeString pattern; |
| 128 UBool skeletonWasSpecified; // if specified in availableFormats, not
derived |
| 129 PtnElem *next; |
| 130 |
| 131 PtnElem(const UnicodeString &basePattern, const UnicodeString &pattern); |
| 132 virtual ~PtnElem(); |
| 133 |
| 134 }; |
| 135 |
| 136 class FormatParser : public UMemory { |
| 137 public: |
| 138 UnicodeString items[MAX_DT_TOKEN]; |
| 139 int32_t itemNumber; |
| 140 |
| 141 FormatParser(); |
| 142 virtual ~FormatParser(); |
| 143 void set(const UnicodeString& patternString); |
| 144 UBool isQuoteLiteral(const UnicodeString& s) const; |
| 145 void getQuoteLiteral(UnicodeString& quote, int32_t *itemIndex); |
| 146 int32_t getCanonicalIndex(const UnicodeString& s) { return getCanonicalIndex
(s, TRUE); }; |
| 147 int32_t getCanonicalIndex(const UnicodeString& s, UBool strict); |
| 148 UBool isPatternSeparator(UnicodeString& field); |
| 149 void setFilter(UErrorCode &status); |
| 150 |
| 151 private: |
| 152 typedef enum TokenStatus { |
| 153 START, |
| 154 ADD_TOKEN, |
| 155 SYNTAX_ERROR, |
| 156 DONE |
| 157 } ToeknStatus; |
| 158 |
| 159 TokenStatus status; |
| 160 virtual TokenStatus setTokens(const UnicodeString& pattern, int32_t startPos,
int32_t *len); |
| 161 }; |
| 162 |
| 163 class DistanceInfo : public UMemory { |
| 164 public: |
| 165 int32_t missingFieldMask; |
| 166 int32_t extraFieldMask; |
| 167 |
| 168 DistanceInfo() {}; |
| 169 virtual ~DistanceInfo() {}; |
| 170 void clear() { missingFieldMask = extraFieldMask = 0; }; |
| 171 void setTo(DistanceInfo& other); |
| 172 void addMissing(int32_t field) { missingFieldMask |= (1<<field); }; |
| 173 void addExtra(int32_t field) { extraFieldMask |= (1<<field); }; |
| 174 }; |
| 175 |
| 176 class DateTimeMatcher: public UMemory { |
| 177 public: |
| 178 PtnSkeleton skeleton; |
| 179 |
| 180 void getBasePattern(UnicodeString &basePattern); |
| 181 UnicodeString getPattern(); |
| 182 void set(const UnicodeString& pattern, FormatParser* fp); |
| 183 void set(const UnicodeString& pattern, FormatParser* fp, PtnSkeleton& skelet
on); |
| 184 void copyFrom(const PtnSkeleton& skeleton); |
| 185 void copyFrom(); |
| 186 PtnSkeleton* getSkeletonPtr(); |
| 187 UBool equals(const DateTimeMatcher* other) const; |
| 188 int32_t getDistance(const DateTimeMatcher& other, int32_t includeMask, Dista
nceInfo& distanceInfo); |
| 189 DateTimeMatcher(); |
| 190 DateTimeMatcher(const DateTimeMatcher& other); |
| 191 virtual ~DateTimeMatcher() {}; |
| 192 int32_t getFieldMask(); |
| 193 }; |
| 194 |
| 195 class PatternMap : public UMemory { |
| 196 public: |
| 197 PtnElem *boot[MAX_PATTERN_ENTRIES]; |
| 198 PatternMap(); |
| 199 virtual ~PatternMap(); |
| 200 void add(const UnicodeString& basePattern, const PtnSkeleton& skeleton, con
st UnicodeString& value, UBool skeletonWasSpecified, UErrorCode& status); |
| 201 const UnicodeString* getPatternFromBasePattern(UnicodeString& basePattern, U
Bool& skeletonWasSpecified); |
| 202 const UnicodeString* getPatternFromSkeleton(PtnSkeleton& skeleton, const Ptn
Skeleton** specifiedSkeletonPtr = 0); |
| 203 void copyFrom(const PatternMap& other, UErrorCode& status); |
| 204 PtnElem* getHeader(UChar baseChar); |
| 205 UBool equals(const PatternMap& other); |
| 206 private: |
| 207 UBool isDupAllowed; |
| 208 PtnElem* getDuplicateElem(const UnicodeString &basePattern, const PtnSkelet
on& skeleton, PtnElem *baseElem); |
| 209 }; // end PatternMap |
| 210 |
| 211 class PatternMapIterator : public UMemory { |
| 212 public: |
| 213 PatternMapIterator(); |
| 214 virtual ~PatternMapIterator(); |
| 215 void set(PatternMap& patternMap); |
| 216 PtnSkeleton* getSkeleton(); |
| 217 UBool hasNext(); |
| 218 DateTimeMatcher& next(); |
| 219 private: |
| 220 int32_t bootIndex; |
| 221 PtnElem *nodePtr; |
| 222 DateTimeMatcher *matcher; |
| 223 PatternMap *patternMap; |
| 224 }; |
| 225 |
| 226 class DTSkeletonEnumeration : public StringEnumeration { |
| 227 public: |
| 228 DTSkeletonEnumeration(PatternMap &patternMap, dtStrEnum type, UErrorCode& st
atus); |
| 229 virtual ~DTSkeletonEnumeration(); |
| 230 static UClassID U_EXPORT2 getStaticClassID(void); |
| 231 virtual UClassID getDynamicClassID(void) const; |
| 232 virtual const UnicodeString* snext(UErrorCode& status); |
| 233 virtual void reset(UErrorCode& status); |
| 234 virtual int32_t count(UErrorCode& status) const; |
| 235 private: |
| 236 int32_t pos; |
| 237 UBool isCanonicalItem(const UnicodeString& item); |
| 238 UVector *fSkeletons; |
| 239 }; |
| 240 |
| 241 class DTRedundantEnumeration : public StringEnumeration { |
| 242 public: |
| 243 DTRedundantEnumeration(); |
| 244 virtual ~DTRedundantEnumeration(); |
| 245 static UClassID U_EXPORT2 getStaticClassID(void); |
| 246 virtual UClassID getDynamicClassID(void) const; |
| 247 virtual const UnicodeString* snext(UErrorCode& status); |
| 248 virtual void reset(UErrorCode& status); |
| 249 virtual int32_t count(UErrorCode& status) const; |
| 250 void add(const UnicodeString &pattern, UErrorCode& status); |
| 251 private: |
| 252 int32_t pos; |
| 253 UBool isCanonicalItem(const UnicodeString& item); |
| 254 UVector *fPatterns; |
| 255 }; |
| 256 |
| 257 U_NAMESPACE_END |
| 258 |
| 259 #endif |
OLD | NEW |