Coverage Report

Created: 2025-06-24 06:43

/src/icu/source/i18n/dtptngen_impl.h
Line
Count
Source (jump to first uncovered line)
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
0
#define MAX_PATTERN_ENTRIES 52
27
#define MAX_CLDR_FIELD_LEN  60
28
0
#define MAX_DT_TOKEN        50
29
#define MAX_RESOURCE_FIELD  12
30
#define MAX_AVAILABLE_FORMATS  12
31
0
#define NONE          0
32
0
#define EXTRA_FIELD   0x10000
33
0
#define MISSING_FIELD  0x1000
34
#define MAX_STRING_ENUMERATION  200
35
0
#define SINGLE_QUOTE      ((UChar)0x0027)
36
#define FORWARDSLASH      ((UChar)0x002F)
37
0
#define BACKSLASH         ((UChar)0x005C)
38
0
#define SPACE             ((UChar)0x0020)
39
0
#define QUOTATION_MARK    ((UChar)0x0022)
40
#define ASTERISK          ((UChar)0x002A)
41
#define PLUSSITN          ((UChar)0x002B)
42
0
#define COMMA             ((UChar)0x002C)
43
0
#define HYPHEN            ((UChar)0x002D)
44
0
#define DOT               ((UChar)0x002E)
45
0
#define COLON             ((UChar)0x003A)
46
0
#define CAP_A             ((UChar)0x0041)
47
0
#define CAP_B             ((UChar)0x0042)
48
0
#define CAP_C             ((UChar)0x0043)
49
#define CAP_D             ((UChar)0x0044)
50
0
#define CAP_E             ((UChar)0x0045)
51
0
#define CAP_F             ((UChar)0x0046)
52
#define CAP_G             ((UChar)0x0047)
53
0
#define CAP_H             ((UChar)0x0048)
54
0
#define CAP_J             ((UChar)0x004A)
55
0
#define CAP_K             ((UChar)0x004B)
56
#define CAP_L             ((UChar)0x004C)
57
#define CAP_M             ((UChar)0x004D)
58
#define CAP_O             ((UChar)0x004F)
59
#define CAP_Q             ((UChar)0x0051)
60
#define CAP_S             ((UChar)0x0053)
61
#define CAP_T             ((UChar)0x0054)
62
#define CAP_U             ((UChar)0x0055)
63
0
#define CAP_V             ((UChar)0x0056)
64
#define CAP_W             ((UChar)0x0057)
65
#define CAP_X             ((UChar)0x0058)
66
0
#define CAP_Y             ((UChar)0x0059)
67
0
#define CAP_Z             ((UChar)0x005A)
68
#define LOWLINE           ((UChar)0x005F)
69
0
#define LOW_A             ((UChar)0x0061)
70
0
#define LOW_B             ((UChar)0x0062)
71
0
#define LOW_C             ((UChar)0x0063)
72
#define LOW_D             ((UChar)0x0064)
73
0
#define LOW_E             ((UChar)0x0065)
74
#define LOW_F             ((UChar)0x0066)
75
#define LOW_G             ((UChar)0x0067)
76
0
#define LOW_H             ((UChar)0x0068)
77
#define LOW_I             ((UChar)0x0069)
78
0
#define LOW_J             ((UChar)0x006A)
79
0
#define LOW_K             ((UChar)0x006B)
80
#define LOW_L             ((UChar)0x006C)
81
0
#define LOW_M             ((UChar)0x006D)
82
#define LOW_N             ((UChar)0x006E)
83
#define LOW_O             ((UChar)0x006F)
84
#define LOW_P             ((UChar)0x0070)
85
#define LOW_Q             ((UChar)0x0071)
86
#define LOW_R             ((UChar)0x0072)
87
0
#define LOW_S             ((UChar)0x0073)
88
#define LOW_T             ((UChar)0x0074)
89
#define LOW_U             ((UChar)0x0075)
90
0
#define LOW_V             ((UChar)0x0076)
91
#define LOW_W             ((UChar)0x0077)
92
#define LOW_X             ((UChar)0x0078)
93
#define LOW_Y             ((UChar)0x0079)
94
0
#define LOW_Z             ((UChar)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
    UChar                  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
    UChar 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, UChar 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
    UChar 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
0
inline bool SkeletonFields::operator==(const SkeletonFields& other) const {
146
0
    return (uprv_memcmp(chars, other.chars, sizeof(chars)) == 0
147
0
        && uprv_memcmp(lengths, other.lengths, sizeof(lengths)) == 0);
148
0
}
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
    UChar 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
0
    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
0
    DistanceInfo() {}
219
    virtual ~DistanceInfo();
220
0
    void clear() { missingFieldMask = extraFieldMask = 0; }
221
    void setTo(const DistanceInfo& other);
222
0
    void addMissing(int32_t field) { missingFieldMask |= (1<<field); }
223
0
    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 = 0) const;
254
    void copyFrom(const PatternMap& other, UErrorCode& status);
255
    PtnElem* getHeader(UChar 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(void);
282
    virtual UClassID getDynamicClassID(void) const;
283
    virtual const UnicodeString* snext(UErrorCode& status);
284
    virtual void reset(UErrorCode& status);
285
    virtual int32_t count(UErrorCode& status) const;
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(void);
297
    virtual UClassID getDynamicClassID(void) const;
298
    virtual const UnicodeString* snext(UErrorCode& status);
299
    virtual void reset(UErrorCode& status);
300
    virtual int32_t count(UErrorCode& status) const;
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