Line data Source code
1 : // © 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 0 : inline UBool CharacterNode::hasValues() const {
98 0 : return (UBool)(fValues != NULL);
99 : }
100 :
101 0 : inline int32_t CharacterNode::countValues() const {
102 : return
103 0 : fValues == NULL ? 0 :
104 0 : !fHasValuesVector ? 1 :
105 0 : ((const UVector *)fValues)->size();
106 : }
107 :
108 0 : inline const void *CharacterNode::getValue(int32_t index) const {
109 0 : if (!fHasValuesVector) {
110 0 : return fValues; // Assume index == 0.
111 : } else {
112 0 : return ((const UVector *)fValues)->elementAt(index);
113 : }
114 : }
115 :
116 : /*
117 : * Search result handler callback interface used by TextTrieMap search.
118 : */
119 0 : 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 : //
|