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