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