LCOV - code coverage report
Current view: top level - intl/icu/source/i18n - tznames_impl.h (source / functions) Hit Total Coverage
Test: output.info Lines: 0 11 0.0 %
Date: 2017-07-14 16:53:18 Functions: 0 4 0.0 %
Legend: Lines: hit not hit

          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             : //

Generated by: LCOV version 1.13