1 // Copyright (C) 2016 and later: Unicode, Inc. and others.
2 // License & terms of use: http://www.unicode.org/copyright.html
4 *******************************************************************************
5 * Copyright (C) 2011-2016, International Business Machines Corporation and
6 * others. All Rights Reserved.
7 *******************************************************************************
10 #ifndef __TZNAMES_IMPL_H__
11 #define __TZNAMES_IMPL_H__
16 * \brief C++ API: TimeZoneNames object
19 #include "unicode/utypes.h"
21 #if !UCONFIG_NO_FORMATTING
23 #include "unicode/tznames.h"
24 #include "unicode/ures.h"
25 #include "unicode/locid.h"
33 * ZNStringPool Pool of (UChar *) strings. Provides for sharing of repeated
36 struct ZNStringPoolChunk;
37 class U_I18N_API ZNStringPool: public UMemory {
39 ZNStringPool(UErrorCode &status);
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.
45 * Life time of the returned string is that of the pool.
47 const UChar *get(const UChar *s, UErrorCode &status);
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.
52 const UChar *get(const UnicodeString &s, UErrorCode &status);
54 /* Adopt a string into the pool, without copying it.
55 * Used for strings from resource bundles, which will persist without copying.
57 const UChar *adopt(const UChar *s, UErrorCode &status);
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.
65 ZNStringPoolChunk *fChunks;
70 * Character node used by TextTrieMap
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.
78 void deleteValues(UObjectDeleter *valueDeleter);
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;
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;
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
97 inline UBool CharacterNode::hasValues() const {
98 return (UBool)(fValues != NULL);
101 inline int32_t CharacterNode::countValues() const {
103 fValues == NULL ? 0 :
104 !fHasValuesVector ? 1 :
105 ((const UVector *)fValues)->size();
108 inline const void *CharacterNode::getValue(int32_t index) const {
109 if (!fHasValuesVector) {
110 return fValues; // Assume index == 0.
112 return ((const UVector *)fValues)->elementAt(index);
117 * Search result handler callback interface used by TextTrieMap search.
119 class TextTrieMapSearchResultHandler : public UMemory {
121 virtual UBool handleMatch(int32_t matchLength,
122 const CharacterNode *node, UErrorCode& status) = 0;
123 virtual ~TextTrieMapSearchResultHandler(); //added to avoid warning
127 * TextTrieMap is a trie implementation for supporting
128 * fast prefix match for the string key.
130 class U_I18N_API TextTrieMap : public UMemory {
132 TextTrieMap(UBool ignoreCase, UObjectDeleter *valeDeleter);
133 virtual ~TextTrieMap();
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;
143 CharacterNode *fNodes;
144 int32_t fNodesCapacity;
147 UVector *fLazyContents;
149 UObjectDeleter *fValueDeleter;
152 CharacterNode* addChildNode(CharacterNode *parent, UChar c, UErrorCode &status);
153 CharacterNode* getChildNode(CharacterNode *parent, UChar c) const;
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;
165 class ZNameSearchHandler;
167 class TimeZoneNamesImpl : public TimeZoneNames {
169 TimeZoneNamesImpl(const Locale& locale, UErrorCode& status);
171 virtual ~TimeZoneNamesImpl();
173 virtual UBool operator==(const TimeZoneNames& other) const;
174 virtual TimeZoneNames* clone() const;
176 StringEnumeration* getAvailableMetaZoneIDs(UErrorCode& status) const;
177 StringEnumeration* getAvailableMetaZoneIDs(const UnicodeString& tzID, UErrorCode& status) const;
179 UnicodeString& getMetaZoneID(const UnicodeString& tzID, UDate date, UnicodeString& mzID) const;
180 UnicodeString& getReferenceZoneID(const UnicodeString& mzID, const char* region, UnicodeString& tzID) const;
182 UnicodeString& getMetaZoneDisplayName(const UnicodeString& mzID, UTimeZoneNameType type, UnicodeString& name) const;
183 UnicodeString& getTimeZoneDisplayName(const UnicodeString& tzID, UTimeZoneNameType type, UnicodeString& name) const;
185 UnicodeString& getExemplarLocationName(const UnicodeString& tzID, UnicodeString& name) const;
187 TimeZoneNames::MatchInfoCollection* find(const UnicodeString& text, int32_t start, uint32_t types, UErrorCode& status) const;
189 void loadAllDisplayNames(UErrorCode& status);
190 void getDisplayNames(const UnicodeString& tzID, const UTimeZoneNameType types[], int32_t numTypes, UDate date, UnicodeString dest[], UErrorCode& status) const;
192 static UnicodeString& getDefaultExemplarLocationName(const UnicodeString& tzID, UnicodeString& name);
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);
203 UResourceBundle* fZoneStrings;
205 UHashtable* fTZNamesMap;
206 UHashtable* fMZNamesMap;
208 UBool fNamesTrieFullyLoaded;
209 UBool fNamesFullyLoaded;
210 TextTrieMap fNamesTrie;
212 void initialize(const Locale& locale, UErrorCode& status);
215 void loadStrings(const UnicodeString& tzCanonicalID, UErrorCode& status);
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);
223 void internalLoadAllDisplayNames(UErrorCode& status);
225 struct ZoneStringsLoader;
230 class TZDBTimeZoneNames : public TimeZoneNames {
232 TZDBTimeZoneNames(const Locale& locale);
233 virtual ~TZDBTimeZoneNames();
235 virtual UBool operator==(const TimeZoneNames& other) const;
236 virtual TimeZoneNames* clone() const;
238 StringEnumeration* getAvailableMetaZoneIDs(UErrorCode& status) const;
239 StringEnumeration* getAvailableMetaZoneIDs(const UnicodeString& tzID, UErrorCode& status) const;
241 UnicodeString& getMetaZoneID(const UnicodeString& tzID, UDate date, UnicodeString& mzID) const;
242 UnicodeString& getReferenceZoneID(const UnicodeString& mzID, const char* region, UnicodeString& tzID) const;
244 UnicodeString& getMetaZoneDisplayName(const UnicodeString& mzID, UTimeZoneNameType type, UnicodeString& name) const;
245 UnicodeString& getTimeZoneDisplayName(const UnicodeString& tzID, UTimeZoneNameType type, UnicodeString& name) const;
247 TimeZoneNames::MatchInfoCollection* find(const UnicodeString& text, int32_t start, uint32_t types, UErrorCode& status) const;
249 static const TZDBNames* getMetaZoneNames(const UnicodeString& mzId, UErrorCode& status);
253 char fRegion[ULOC_COUNTRY_CAPACITY];
258 #endif /* #if !UCONFIG_NO_FORMATTING */
260 #endif // __TZNAMES_IMPL_H__