Imported Upstream version 58.1
[platform/upstream/icu.git] / source / i18n / tznames_impl.h
1 // Copyright (C) 2016 and later: Unicode, Inc. and others.
2 // License & terms of use: http://www.unicode.org/copyright.html
3 /*
4  *******************************************************************************
5  * Copyright (C) 2011-2016, International Business Machines Corporation and
6  * others. All Rights Reserved.
7  *******************************************************************************
8  */
9
10 #ifndef __TZNAMES_IMPL_H__
11 #define __TZNAMES_IMPL_H__
12
13
14 /**
15  * \file
16  * \brief C++ API: TimeZoneNames object
17  */
18
19 #include "unicode/utypes.h"
20
21 #if !UCONFIG_NO_FORMATTING
22
23 #include "unicode/tznames.h"
24 #include "unicode/ures.h"
25 #include "unicode/locid.h"
26 #include "uhash.h"
27 #include "uvector.h"
28 #include "umutex.h"
29
30 U_NAMESPACE_BEGIN
31
32 /*
33  * ZNStringPool    Pool of (UChar *) strings.  Provides for sharing of repeated
34  *                 zone strings.
35  */
36 struct ZNStringPoolChunk;
37 class U_I18N_API ZNStringPool: public UMemory {
38   public:
39     ZNStringPool(UErrorCode &status);
40     ~ZNStringPool();
41
42     /* Get the pooled string that is equal to the supplied string s.
43      * Copy the string into the pool if it is not already present.
44      *
45      * Life time of the returned string is that of the pool.
46      */
47     const UChar *get(const UChar *s, UErrorCode &status);
48
49     /* Get the pooled string that is equal to the supplied string s.
50      * Copy the string into the pool if it is not already present.
51      */
52     const UChar *get(const UnicodeString &s, UErrorCode &status);
53
54     /* Adopt a string into the pool, without copying it.
55      * Used for strings from resource bundles, which will persist without copying.
56      */
57     const UChar *adopt(const UChar *s, UErrorCode &status);
58
59     /* Freeze the string pool.  Discards the hash table that is used
60      * for looking up a string.  All pointers to pooled strings remain valid.
61      */
62     void freeze();
63
64   private:
65     ZNStringPoolChunk   *fChunks;
66     UHashtable           *fHash;
67 };
68
69 /*
70  * Character node used by TextTrieMap
71  */
72 struct CharacterNode {
73     // No constructor or destructor.
74     // We malloc and free an uninitalized array of CharacterNode objects
75     // and clear and delete them ourselves.
76
77     void clear();
78     void deleteValues(UObjectDeleter *valueDeleter);
79
80     void addValue(void *value, UObjectDeleter *valueDeleter, UErrorCode &status);
81     inline UBool hasValues() const;
82     inline int32_t countValues() const;
83     inline const void *getValue(int32_t index) const;
84
85     void     *fValues;      // Union of one single value vs. UVector of values.
86     UChar    fCharacter;    // UTF-16 code unit.
87     uint16_t fFirstChild;   // 0 if no children.
88     uint16_t fNextSibling;  // 0 terminates the list.
89     UBool    fHasValuesVector;
90     UBool    fPadding;
91
92     // No value:   fValues == NULL               and  fHasValuesVector == FALSE
93     // One value:  fValues == value              and  fHasValuesVector == FALSE
94     // >=2 values: fValues == UVector of values  and  fHasValuesVector == TRUE
95 };
96
97 inline UBool CharacterNode::hasValues() const {
98     return (UBool)(fValues != NULL);
99 }
100
101 inline int32_t CharacterNode::countValues() const {
102     return
103         fValues == NULL ? 0 :
104         !fHasValuesVector ? 1 :
105         ((const UVector *)fValues)->size();
106 }
107
108 inline const void *CharacterNode::getValue(int32_t index) const {
109     if (!fHasValuesVector) {
110         return fValues;  // Assume index == 0.
111     } else {
112         return ((const UVector *)fValues)->elementAt(index);
113     }
114 }
115
116 /*
117  * Search result handler callback interface used by TextTrieMap search.
118  */
119 class TextTrieMapSearchResultHandler : public UMemory {
120 public:
121     virtual UBool handleMatch(int32_t matchLength,
122                               const CharacterNode *node, UErrorCode& status) = 0;
123     virtual ~TextTrieMapSearchResultHandler(); //added to avoid warning
124 };
125
126 /**
127  * TextTrieMap is a trie implementation for supporting
128  * fast prefix match for the string key.
129  */
130 class U_I18N_API TextTrieMap : public UMemory {
131 public:
132     TextTrieMap(UBool ignoreCase, UObjectDeleter *valeDeleter);
133     virtual ~TextTrieMap();
134
135     void put(const UnicodeString &key, void *value, ZNStringPool &sp, UErrorCode &status);
136     void put(const UChar*, void *value, UErrorCode &status);
137     void search(const UnicodeString &text, int32_t start,
138         TextTrieMapSearchResultHandler *handler, UErrorCode& status) const;
139     int32_t isEmpty() const;
140
141 private:
142     UBool           fIgnoreCase;
143     CharacterNode   *fNodes;
144     int32_t         fNodesCapacity;
145     int32_t         fNodesCount;
146
147     UVector         *fLazyContents;
148     UBool           fIsEmpty;
149     UObjectDeleter  *fValueDeleter;
150
151     UBool growNodes();
152     CharacterNode* addChildNode(CharacterNode *parent, UChar c, UErrorCode &status);
153     CharacterNode* getChildNode(CharacterNode *parent, UChar c) const;
154
155     void putImpl(const UnicodeString &key, void *value, UErrorCode &status);
156     void buildTrie(UErrorCode &status);
157     void search(CharacterNode *node, const UnicodeString &text, int32_t start,
158         int32_t index, TextTrieMapSearchResultHandler *handler, UErrorCode &status) const;
159 };
160
161
162
163 class ZNames;
164 class TextTrieMap;
165 class ZNameSearchHandler;
166
167 class TimeZoneNamesImpl : public TimeZoneNames {
168 public:
169     TimeZoneNamesImpl(const Locale& locale, UErrorCode& status);
170
171     virtual ~TimeZoneNamesImpl();
172
173     virtual UBool operator==(const TimeZoneNames& other) const;
174     virtual TimeZoneNames* clone() const;
175
176     StringEnumeration* getAvailableMetaZoneIDs(UErrorCode& status) const;
177     StringEnumeration* getAvailableMetaZoneIDs(const UnicodeString& tzID, UErrorCode& status) const;
178
179     UnicodeString& getMetaZoneID(const UnicodeString& tzID, UDate date, UnicodeString& mzID) const;
180     UnicodeString& getReferenceZoneID(const UnicodeString& mzID, const char* region, UnicodeString& tzID) const;
181
182     UnicodeString& getMetaZoneDisplayName(const UnicodeString& mzID, UTimeZoneNameType type, UnicodeString& name) const;
183     UnicodeString& getTimeZoneDisplayName(const UnicodeString& tzID, UTimeZoneNameType type, UnicodeString& name) const;
184
185     UnicodeString& getExemplarLocationName(const UnicodeString& tzID, UnicodeString& name) const;
186
187     TimeZoneNames::MatchInfoCollection* find(const UnicodeString& text, int32_t start, uint32_t types, UErrorCode& status) const;
188
189     void loadAllDisplayNames(UErrorCode& status);
190     void getDisplayNames(const UnicodeString& tzID, const UTimeZoneNameType types[], int32_t numTypes, UDate date, UnicodeString dest[], UErrorCode& status) const;
191
192     static UnicodeString& getDefaultExemplarLocationName(const UnicodeString& tzID, UnicodeString& name);
193
194     static StringEnumeration* _getAvailableMetaZoneIDs(UErrorCode& status);
195     static StringEnumeration* _getAvailableMetaZoneIDs(const UnicodeString& tzID, UErrorCode& status);
196     static UnicodeString& _getMetaZoneID(const UnicodeString& tzID, UDate date, UnicodeString& mzID);
197     static UnicodeString& _getReferenceZoneID(const UnicodeString& mzID, const char* region, UnicodeString& tzID);
198
199 private:
200
201     Locale fLocale;
202
203     UResourceBundle* fZoneStrings;
204
205     UHashtable* fTZNamesMap;
206     UHashtable* fMZNamesMap;
207
208     UBool fNamesTrieFullyLoaded;
209     UBool fNamesFullyLoaded;
210     TextTrieMap fNamesTrie;
211
212     void initialize(const Locale& locale, UErrorCode& status);
213     void cleanup();
214
215     void loadStrings(const UnicodeString& tzCanonicalID, UErrorCode& status);
216
217     ZNames* loadMetaZoneNames(const UnicodeString& mzId, UErrorCode& status);
218     ZNames* loadTimeZoneNames(const UnicodeString& mzId, UErrorCode& status);
219     TimeZoneNames::MatchInfoCollection* doFind(ZNameSearchHandler& handler,
220         const UnicodeString& text, int32_t start, UErrorCode& status) const;
221     void addAllNamesIntoTrie(UErrorCode& errorCode);
222
223     void internalLoadAllDisplayNames(UErrorCode& status);
224
225     struct ZoneStringsLoader;
226 };
227
228 class TZDBNames;
229
230 class TZDBTimeZoneNames : public TimeZoneNames {
231 public:
232     TZDBTimeZoneNames(const Locale& locale);
233     virtual ~TZDBTimeZoneNames();
234
235     virtual UBool operator==(const TimeZoneNames& other) const;
236     virtual TimeZoneNames* clone() const;
237
238     StringEnumeration* getAvailableMetaZoneIDs(UErrorCode& status) const;
239     StringEnumeration* getAvailableMetaZoneIDs(const UnicodeString& tzID, UErrorCode& status) const;
240
241     UnicodeString& getMetaZoneID(const UnicodeString& tzID, UDate date, UnicodeString& mzID) const;
242     UnicodeString& getReferenceZoneID(const UnicodeString& mzID, const char* region, UnicodeString& tzID) const;
243
244     UnicodeString& getMetaZoneDisplayName(const UnicodeString& mzID, UTimeZoneNameType type, UnicodeString& name) const;
245     UnicodeString& getTimeZoneDisplayName(const UnicodeString& tzID, UTimeZoneNameType type, UnicodeString& name) const;
246
247     TimeZoneNames::MatchInfoCollection* find(const UnicodeString& text, int32_t start, uint32_t types, UErrorCode& status) const;
248
249     static const TZDBNames* getMetaZoneNames(const UnicodeString& mzId, UErrorCode& status);
250
251 private:
252     Locale fLocale;
253     char fRegion[ULOC_COUNTRY_CAPACITY];
254 };
255
256 U_NAMESPACE_END
257
258 #endif /* #if !UCONFIG_NO_FORMATTING */
259
260 #endif // __TZNAMES_IMPL_H__
261 //eof
262 //