1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*******************************************************************************
327f654740f2a26ad62a5c155af9199af9e69b889claireho* Copyright (C) 2007-2010, International Business Machines Corporation and    *
4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* others. All Rights Reserved.                                                *
5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*******************************************************************************
6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifndef ZSTRFMT_H
8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define ZSTRFMT_H
9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h"
11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING
13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/unistr.h"
15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/calendar.h"
1650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "uhash.h"
17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "uvector.h"
18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_NAMESPACE_BEGIN
20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Character node used by TextTrieMap
23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
24b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustruct CharacterNode {
25b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    // No constructor or destructor.
26b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    // We malloc and free an uninitalized array of CharacterNode objects
27b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    // and clear and delete them ourselves.
28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
29b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    void clear();
30b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    void deleteValues();
31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    void addValue(void *value, UErrorCode &status);
33b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    inline UBool hasValues() const;
34b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    inline int32_t countValues() const;
35b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    inline const void *getValue(int32_t index) const;
36b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
37b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    void     *fValues;      // Union of one single value vs. UVector of values.
38b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UChar    fCharacter;    // UTF-16 code unit.
39b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    uint16_t fFirstChild;   // 0 if no children.
40b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    uint16_t fNextSibling;  // 0 terminates the list.
41b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UBool    fHasValuesVector;
42b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UBool    fPadding;
43b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
44b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    // No value:   fValues == NULL               and  fHasValuesVector == FALSE
45b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    // One value:  fValues == value              and  fHasValuesVector == FALSE
46b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    // >=2 values: fValues == UVector of values  and  fHasValuesVector == TRUE
47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
49b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruinline UBool CharacterNode::hasValues() const {
50b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    return (UBool)(fValues != NULL);
51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
53b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruinline int32_t CharacterNode::countValues() const {
54b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    return
55b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        fValues == NULL ? 0 :
56b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        !fHasValuesVector ? 1 :
57b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        ((const UVector *)fValues)->size();
58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
60b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruinline const void *CharacterNode::getValue(int32_t index) const {
61b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if (!fHasValuesVector) {
62b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        return fValues;  // Assume index == 0.
63b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    } else {
64b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        return ((const UVector *)fValues)->elementAt(index);
65b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Search result handler callback interface used by TextTrieMap search.
70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
71c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queruclass TextTrieMapSearchResultHandler : public UMemory {
72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querupublic:
73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    virtual UBool handleMatch(int32_t matchLength,
74b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                              const CharacterNode *node, UErrorCode& status) = 0;
75c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    virtual ~TextTrieMapSearchResultHandler(); //added to avoid warning
76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
7850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
7950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho/*
8050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * ZSFStringPool   Pool of (UChar *) strings.  Provides for sharing of repeated
8150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *                 strings within ZoneStringFormats.
8250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho */
8350294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoclass ZSFStringPoolChunk;
8450294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoclass ZSFStringPool: public UMemory {
8550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  public:
8650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    ZSFStringPool(UErrorCode &status);
8750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    ~ZSFStringPool();
8850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
8950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    /* Get the pooled string that is equal to the supplied string s.
9050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * Copy the string into the pool if it is not already present.
9150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     *
9250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * Life time of the returned string is that of the pool.
9350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     */
9450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    const UChar *get(const UChar *s, UErrorCode &status);
9550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
9650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    /* Get the pooled string that is equal to the supplied string s.
9750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * Copy the string into the pool if it is not already present.
9850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     */
9950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    const UChar *get(const UnicodeString &s, UErrorCode &status);
10050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
10150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    /* Adopt a string into the pool, without copying it.
10250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * Used for strings from resource bundles, which will persist without copying.
10350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     */
10450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    const UChar *adopt(const UChar *s, UErrorCode &status);
10550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
10650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    /* Freeze the string pool.  Discards the hash table that is used
10750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * for looking up a string.  All pointers to pooled strings remain valid.
10850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     */
10950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    void freeze();
11050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
11150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  private:
11250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    ZSFStringPoolChunk   *fChunks;
11350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UHashtable           *fHash;
11450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho};
11550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
11650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * TextTrieMap is a trie implementation for supporting
119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * fast prefix match for the string key.
120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass TextTrieMap : public UMemory {
122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querupublic:
123c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    TextTrieMap(UBool ignoreCase);
124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    virtual ~TextTrieMap();
125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
12650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    void put(const UnicodeString &key, void *value, ZSFStringPool &sp, UErrorCode &status);
127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    void search(const UnicodeString &text, int32_t start,
128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TextTrieMapSearchResultHandler *handler, UErrorCode& status) const;
12950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    int32_t isEmpty() const;
130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruprivate:
132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool           fIgnoreCase;
133b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    CharacterNode   *fNodes;
134b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    int32_t         fNodesCapacity;
135b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    int32_t         fNodesCount;
136b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
13750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UVector         *fLazyContents;
13850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UBool           fIsEmpty;
13950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
140b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UBool growNodes();
141b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    CharacterNode* addChildNode(CharacterNode *parent, UChar c, UErrorCode &status);
142b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    CharacterNode* getChildNode(CharacterNode *parent, UChar c) const;
143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
14450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    void putImpl(const UnicodeString &key, void *value, UErrorCode &status);
14550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    void buildTrie(UErrorCode &status);
146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    void search(CharacterNode *node, const UnicodeString &text, int32_t start,
147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t index, TextTrieMapSearchResultHandler *handler, UErrorCode &status) const;
148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Name types, these bit flag are used for zone string lookup
152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruenum TimeZoneTranslationType {
153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LOCATION        = 0x0001,
154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    GENERIC_LONG    = 0x0002,
155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    GENERIC_SHORT   = 0x0004,
156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    STANDARD_LONG   = 0x0008,
157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    STANDARD_SHORT  = 0x0010,
158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DAYLIGHT_LONG   = 0x0020,
159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DAYLIGHT_SHORT  = 0x0040
160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Name type index, these constants are used for index in the zone strings array.
163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruenum TimeZoneTranslationTypeIndex {
164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ZSIDX_LOCATION = 0,
165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ZSIDX_LONG_STANDARD,
166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ZSIDX_SHORT_STANDARD,
167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ZSIDX_LONG_DAYLIGHT,
168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ZSIDX_SHORT_DAYLIGHT,
169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ZSIDX_LONG_GENERIC,
170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ZSIDX_SHORT_GENERIC,
171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ZSIDX_COUNT
173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass MessageFormat;
176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
17750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * ZoneStringInfo is a class holding a localized zone string
180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * information.
181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass ZoneStringInfo : public UMemory {
183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querupublic:
184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    virtual ~ZoneStringInfo();
185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    inline UnicodeString& getID(UnicodeString &result) const;
187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    inline UnicodeString& getString(UnicodeString &result) const;
188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    inline UBool isStandard(void) const;
189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    inline UBool isDaylight(void) const;
190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    inline UBool isGeneric(void) const;
191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruprivate:
193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    friend class ZoneStringFormat;
194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    friend class ZoneStringSearchResultHandler;
195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
19650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    ZoneStringInfo(const UnicodeString &id, const UnicodeString &str,
19750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                   TimeZoneTranslationType type, ZSFStringPool &sp, UErrorCode &status);
198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
19950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    const UChar   *fId;
20050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    const UChar   *fStr;
201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TimeZoneTranslationType fType;
202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruinline UnicodeString& ZoneStringInfo::getID(UnicodeString &result) const {
20550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    return result.setTo(fId, -1);
206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruinline UnicodeString& ZoneStringInfo::getString(UnicodeString &result) const {
20950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    return result.setTo(fStr, -1);
210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruinline UBool ZoneStringInfo::isStandard(void) const {
213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return (fType == STANDARD_LONG || fType == STANDARD_SHORT);
214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruinline UBool ZoneStringInfo::isDaylight(void) const {
217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return (fType == DAYLIGHT_LONG || fType == DAYLIGHT_SHORT);
218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruinline UBool ZoneStringInfo::isGeneric(void) const {
221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return (fType == LOCATION || fType == GENERIC_LONG || fType == GENERIC_SHORT);
222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass SafeZoneStringFormatPtr;
225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass ZoneStringFormat : public UMemory {
227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querupublic:
228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ZoneStringFormat(const UnicodeString* const* strings, int32_t rowCount, int32_t columnCount, UErrorCode &status);
229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ZoneStringFormat(const Locale& locale, UErrorCode &status);
230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    virtual ~ZoneStringFormat();
231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
23250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    /* Gets zone string format from cache if available, create it if not cached. */
233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static SafeZoneStringFormatPtr* getZoneStringFormat(const Locale& locale, UErrorCode &status);
234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*
236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Create a snapshot of old zone strings array for the given date
237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString** createZoneStringsArray(UDate date, int32_t &rowCount, int32_t &colCount, UErrorCode &status) const;
239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
24050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    /* TODO:  There is no implementation for this function.  Delete declaration? */
241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UnicodeString** getZoneStrings(int32_t &rowCount, int32_t &columnCount) const;
242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString& getSpecificLongString(const Calendar &cal,
244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString &result, UErrorCode &status) const;
245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString& getSpecificShortString(const Calendar &cal,
247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UBool commonlyUsedOnly, UnicodeString &result, UErrorCode &status) const;
248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString& getGenericLongString(const Calendar &cal,
250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString &result, UErrorCode &status) const;
251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString& getGenericShortString(const Calendar &cal,
253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UBool commonlyUsedOnly, UnicodeString &result, UErrorCode &status) const;
254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString& getGenericLocationString(const Calendar &cal,
256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString &result, UErrorCode &status) const;
257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const ZoneStringInfo* findSpecificLong(const UnicodeString &text, int32_t start,
259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t &matchLength, UErrorCode &status) const;
260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const ZoneStringInfo* findSpecificShort(const UnicodeString &text, int32_t start,
261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t &matchLength, UErrorCode &status) const;
262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const ZoneStringInfo* findGenericLong(const UnicodeString &text, int32_t start,
263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t &matchLength, UErrorCode &status) const;
264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const ZoneStringInfo* findGenericShort(const UnicodeString &text, int32_t start,
265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t &matchLength, UErrorCode &status) const;
266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const ZoneStringInfo* findGenericLocation(const UnicodeString &text, int32_t start,
267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t &matchLength, UErrorCode &status) const;
268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Following APIs are not used by SimpleDateFormat, but public for testing purpose
270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    inline UnicodeString& getLongStandard(const UnicodeString &tzid, UDate date,
271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString &result) const;
272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    inline UnicodeString& getLongDaylight(const UnicodeString &tzid, UDate date,
273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString &result) const;
274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    inline UnicodeString& getLongGenericNonLocation(const UnicodeString &tzid, UDate date,
275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString &result) const;
276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    inline UnicodeString& getLongGenericPartialLocation(const UnicodeString &tzid, UDate date,
277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString &result) const;
278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    inline UnicodeString& getShortStandard(const UnicodeString &tzid, UDate date, UBool commonlyUsedOnly,
279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString &result) const;
280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    inline UnicodeString& getShortDaylight(const UnicodeString &tzid, UDate date, UBool commonlyUsedOnly,
281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString &result) const;
282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    inline UnicodeString& getShortGenericNonLocation(const UnicodeString &tzid, UDate date, UBool commonlyUsedOnly,
283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString &result) const;
284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    inline UnicodeString& getShortGenericPartialLocation(const UnicodeString &tzid, UDate date, UBool commonlyUsedOnly,
285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString &result) const;
286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    inline UnicodeString& getGenericLocation(const UnicodeString &tzid, UnicodeString &result) const;
287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruprivate:
28950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    Locale           fLocale;
29050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UHashtable      *fTzidToStrings;
29150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UHashtable      *fMzidToStrings;
29250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
29350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    TextTrieMap      fZoneStringsTrie;
29450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    ZSFStringPool    fStringPool;
29550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
29650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UResourceBundle *fZoneStringsArray;
29750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UResourceBundle *fMetazoneItem;
29850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UResourceBundle *fZoneItem;
299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
30027f654740f2a26ad62a5c155af9199af9e69b889claireho	UBool			 fIsFullyLoaded;
30127f654740f2a26ad62a5c155af9199af9e69b889claireho
30227f654740f2a26ad62a5c155af9199af9e69b889claireho	void loadZone(const UnicodeString &utzid, UErrorCode &status);
30327f654740f2a26ad62a5c155af9199af9e69b889claireho	void addSingleZone(UnicodeString &utzid, UErrorCode &status);
30427f654740f2a26ad62a5c155af9199af9e69b889claireho	void loadFull(UErrorCode &status);
30527f654740f2a26ad62a5c155af9199af9e69b889claireho
30627f654740f2a26ad62a5c155af9199af9e69b889claireho
307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*
308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Private method to get a zone string except generic partial location types.
309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString& getString(const UnicodeString &tzid, TimeZoneTranslationTypeIndex typeIdx, UDate date,
311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UBool commonlyUsedOnly, UnicodeString& result) const;
312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*
314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Private method to get a generic string, with fallback logic involved,
315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * that is,
316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * 1. If a generic non-location string is avaiable for the zone, return it.
318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * 2. If a generic non-location string is associated with a metazone and
319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *    the zone never use daylight time around the given date, use the standard
320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *    string (if available).
321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *    Note: In CLDR1.5.1, the same localization is used for generic and standard.
323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *    In this case, we do not use the standard string and do the rest.
324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * 3. If a generic non-location string is associated with a metazone and
326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *    the offset at the given time is different from the preferred zone for the
327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *    current locale, then return the generic partial location string (if avaiable)
328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * 4. If a generic non-location string is not available, use generic location
329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *    string.
330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString& getGenericString(const Calendar &cal, UBool isShort, UBool commonlyUsedOnly,
332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString &result, UErrorCode &status) const;
333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*
335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Private method to get a generic partial location string
336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString& getGenericPartialLocationString(const UnicodeString &tzid, UBool isShort,
338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UDate date, UBool commonlyUsedOnly, UnicodeString &result) const;
339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*
341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Find a prefix matching time zone for the given zone string types.
342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @param text The text contains a time zone string
343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @param start The start index within the text
344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @param types The bit mask representing a set of requested types
345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @param matchLength Receives the match length
346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @param status
347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @return If any zone string matched for the requested types, returns a
348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * ZoneStringInfo for the longest match.  If no matches are found for
349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * the requested types, returns a ZoneStringInfo for the longest match
350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * for any other types.  If nothing matches at all, returns null.
351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const ZoneStringInfo* find(const UnicodeString &text, int32_t start, int32_t types,
353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t &matchLength, UErrorCode &status) const;
35427f654740f2a26ad62a5c155af9199af9e69b889claireho	const ZoneStringInfo* subFind(const UnicodeString &text, int32_t start, int32_t types,
35527f654740f2a26ad62a5c155af9199af9e69b889claireho                       int32_t &matchLength, UErrorCode &status) const;
356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString& getRegion(UnicodeString &region) const;
358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static MessageFormat* getFallbackFormat(const Locale &locale, UErrorCode &status);
360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static MessageFormat* getRegionFormat(const Locale &locale, UErrorCode &status);
36150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    const UChar* getZoneStringFromBundle(const UResourceBundle *zoneitem, const char *key);
362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static UBool isCommonlyUsed(const UResourceBundle *zoneitem);
363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static UnicodeString& getLocalizedCountry(const UnicodeString &countryCode, const Locale &locale,
364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString &displayCountry);
365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruinline UnicodeString&
368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruZoneStringFormat::getLongStandard(const UnicodeString &tzid, UDate date,
369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                  UnicodeString &result) const {
370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return getString(tzid, ZSIDX_LONG_STANDARD, date, FALSE /* not used */, result);
371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruinline UnicodeString&
374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruZoneStringFormat::getLongDaylight(const UnicodeString &tzid, UDate date,
375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                  UnicodeString &result) const {
376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return getString(tzid, ZSIDX_LONG_DAYLIGHT, date, FALSE /* not used */, result);
377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruinline UnicodeString&
380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruZoneStringFormat::getLongGenericNonLocation(const UnicodeString &tzid, UDate date,
381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                            UnicodeString &result) const {
382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return getString(tzid, ZSIDX_LONG_GENERIC, date, FALSE /* not used */, result);
383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruinline UnicodeString&
386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruZoneStringFormat::getLongGenericPartialLocation(const UnicodeString &tzid, UDate date,
387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                UnicodeString &result) const {
388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return getGenericPartialLocationString(tzid, FALSE, date, FALSE /* not used */, result);
389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruinline UnicodeString&
392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruZoneStringFormat::getShortStandard(const UnicodeString &tzid, UDate date, UBool commonlyUsedOnly,
393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                   UnicodeString &result) const {
394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return getString(tzid, ZSIDX_SHORT_STANDARD, date, commonlyUsedOnly, result);
395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruinline UnicodeString&
398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruZoneStringFormat::getShortDaylight(const UnicodeString &tzid, UDate date, UBool commonlyUsedOnly,
399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                   UnicodeString &result) const {
400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return getString(tzid, ZSIDX_SHORT_DAYLIGHT, date, commonlyUsedOnly, result);
401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruinline UnicodeString&
404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruZoneStringFormat::getShortGenericNonLocation(const UnicodeString &tzid, UDate date, UBool commonlyUsedOnly,
405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                             UnicodeString &result) const {
406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return getString(tzid, ZSIDX_SHORT_GENERIC, date, commonlyUsedOnly, result);
407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruinline UnicodeString&
410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruZoneStringFormat::getShortGenericPartialLocation(const UnicodeString &tzid, UDate date, UBool commonlyUsedOnly,
411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                 UnicodeString &result) const {
412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return getGenericPartialLocationString(tzid, TRUE, date, commonlyUsedOnly, result);
413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruinline UnicodeString&
416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruZoneStringFormat::getGenericLocation(const UnicodeString &tzid, UnicodeString &result) const {
417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return getString(tzid, ZSIDX_LOCATION, 0 /*not used*/, FALSE /*not used*/, result);
418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
42250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * ZoneStrings is a container of localized zone strings used by ZoneStringFormat
423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass ZoneStrings : public UMemory {
425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querupublic:
42650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    ZoneStrings(UnicodeString *strings,
42750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                int32_t        stringsCount,
42850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                UBool          commonlyUsed,
42950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                UnicodeString **genericPartialLocationStrings,
43050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                int32_t        genericRowCount,
43150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                int32_t        genericColCount,
43250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                ZSFStringPool &sp,
43350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                UErrorCode    &status);
43450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    virtual         ~ZoneStrings();
43550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
43650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UnicodeString&   getString(int32_t typeIdx, UnicodeString &result) const;
43750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    inline UBool     isShortFormatCommonlyUsed(void) const;
43850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UnicodeString&   getGenericPartialLocationString(const UnicodeString &mzid, UBool isShort,
43950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                                        UBool commonlyUsedOnly, UnicodeString &result) const;
440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruprivate:
44250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    const UChar   **fStrings;
443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t         fStringsCount;
444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool           fIsCommonlyUsed;
44550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    const UChar * **fGenericPartialLocationStrings;
446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t         fGenericPartialLocationRowCount;
447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t         fGenericPartialLocationColCount;
448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruinline UBool
451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruZoneStrings::isShortFormatCommonlyUsed(void) const {
452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return fIsCommonlyUsed;
453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * ZoneStringSearchResultHandler is an implementation of
457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * TextTrieMapSearchHandler.  This class is used by ZoneStringFormat
458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * for collecting search results for localized zone strings.
459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
460c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queruclass ZoneStringSearchResultHandler : public TextTrieMapSearchResultHandler {
461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querupublic:
462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ZoneStringSearchResultHandler(UErrorCode &status);
463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    virtual ~ZoneStringSearchResultHandler();
464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
465b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    virtual UBool handleMatch(int32_t matchLength, const CharacterNode *node, UErrorCode &status);
466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t countMatches(void);
467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const ZoneStringInfo* getMatch(int32_t index, int32_t &matchLength);
468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    void clear(void);
469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruprivate:
471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UVector fResults;
472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t fMatchLen[ZSIDX_COUNT];
473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * ZoneStringFormat cache implementation
478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass ZSFCacheEntry : public UMemory {
480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querupublic:
481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ~ZSFCacheEntry();
482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    void delRef(void);
484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const ZoneStringFormat* getZoneStringFormat(void);
485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruprivate:
487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    friend class ZSFCache;
488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ZSFCacheEntry(const Locale &locale, ZoneStringFormat *zsf, ZSFCacheEntry *next);
490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale              fLocale;
492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ZoneStringFormat    *fZoneStringFormat;
493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ZSFCacheEntry       *fNext;
494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t             fRefCount;
495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass SafeZoneStringFormatPtr : public UMemory {
498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querupublic:
499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ~SafeZoneStringFormatPtr();
500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const ZoneStringFormat* get() const;
501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruprivate:
503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    friend class ZSFCache;
504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    SafeZoneStringFormatPtr(ZSFCacheEntry *cacheEntry);
506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ZSFCacheEntry   *fCacheEntry;
508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass ZSFCache : public UMemory {
511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querupublic:
512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ZSFCache(int32_t capacity);
513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ~ZSFCache();
514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    SafeZoneStringFormatPtr* get(const Locale &locale, UErrorCode &status);
516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruprivate:
518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t         fCapacity;
519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ZSFCacheEntry   *fFirst;
520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_NAMESPACE_END
523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_FORMATTING */
525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif // ZSTRFMT_H
527