|
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 |
|
93 U_NAMESPACE_BEGIN |
|
94 |
|
95 const int32_t UDATPG_FRACTIONAL_MASK = 1<<UDATPG_FRACTIONAL_SECOND_FIELD; |
|
96 const int32_t UDATPG_SECOND_AND_FRACTIONAL_MASK = (1<<UDATPG_SECOND_FIELD) | (1<<UDATPG_FRACTIONAL_SECOND_FIELD); |
|
97 |
|
98 typedef enum dtStrEnum { |
|
99 DT_BASESKELETON, |
|
100 DT_SKELETON, |
|
101 DT_PATTERN |
|
102 }dtStrEnum; |
|
103 |
|
104 typedef struct dtTypeElem { |
|
105 UChar patternChar; |
|
106 UDateTimePatternField field; |
|
107 int16_t type; |
|
108 int16_t minLen; |
|
109 int16_t weight; |
|
110 }dtTypeElem; |
|
111 |
|
112 class PtnSkeleton : public UMemory { |
|
113 public: |
|
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 |
|
127 class PtnElem : public UMemory { |
|
128 public: |
|
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 |
|
140 class FormatParser : public UMemory { |
|
141 public: |
|
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 |
|
155 private: |
|
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 |
|
167 class DistanceInfo : public UMemory { |
|
168 public: |
|
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 |
|
180 class DateTimeMatcher: public UMemory { |
|
181 public: |
|
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 |
|
199 class PatternMap : public UMemory { |
|
200 public: |
|
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); |
|
210 private: |
|
211 UBool isDupAllowed; |
|
212 PtnElem* getDuplicateElem(const UnicodeString &basePattern, const PtnSkeleton& skeleton, PtnElem *baseElem); |
|
213 }; // end PatternMap |
|
214 |
|
215 class PatternMapIterator : public UMemory { |
|
216 public: |
|
217 PatternMapIterator(); |
|
218 virtual ~PatternMapIterator(); |
|
219 void set(PatternMap& patternMap); |
|
220 PtnSkeleton* getSkeleton(); |
|
221 UBool hasNext(); |
|
222 DateTimeMatcher& next(); |
|
223 private: |
|
224 int32_t bootIndex; |
|
225 PtnElem *nodePtr; |
|
226 DateTimeMatcher *matcher; |
|
227 PatternMap *patternMap; |
|
228 }; |
|
229 |
|
230 class DTSkeletonEnumeration : public StringEnumeration { |
|
231 public: |
|
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; |
|
239 private: |
|
240 int32_t pos; |
|
241 UBool isCanonicalItem(const UnicodeString& item); |
|
242 UVector *fSkeletons; |
|
243 }; |
|
244 |
|
245 class DTRedundantEnumeration : public StringEnumeration { |
|
246 public: |
|
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); |
|
255 private: |
|
256 int32_t pos; |
|
257 UBool isCanonicalItem(const UnicodeString& item); |
|
258 UVector *fPatterns; |
|
259 }; |
|
260 |
|
261 U_NAMESPACE_END |
|
262 |
|
263 #endif |