1*0e209d39SAndroid Build Coastguard Worker // © 2016 and later: Unicode, Inc. and others. 2*0e209d39SAndroid Build Coastguard Worker // License & terms of use: http://www.unicode.org/copyright.html 3*0e209d39SAndroid Build Coastguard Worker /* 4*0e209d39SAndroid Build Coastguard Worker ******************************************************************************* 5*0e209d39SAndroid Build Coastguard Worker * Copyright (C) 2008-2014, Google, International Business Machines Corporation 6*0e209d39SAndroid Build Coastguard Worker * and others. All Rights Reserved. 7*0e209d39SAndroid Build Coastguard Worker ******************************************************************************* 8*0e209d39SAndroid Build Coastguard Worker */ 9*0e209d39SAndroid Build Coastguard Worker 10*0e209d39SAndroid Build Coastguard Worker #ifndef __TMUTFMT_H__ 11*0e209d39SAndroid Build Coastguard Worker #define __TMUTFMT_H__ 12*0e209d39SAndroid Build Coastguard Worker 13*0e209d39SAndroid Build Coastguard Worker #include "unicode/utypes.h" 14*0e209d39SAndroid Build Coastguard Worker 15*0e209d39SAndroid Build Coastguard Worker /** 16*0e209d39SAndroid Build Coastguard Worker * \file 17*0e209d39SAndroid Build Coastguard Worker * \brief C++ API: Format and parse duration in single time unit 18*0e209d39SAndroid Build Coastguard Worker */ 19*0e209d39SAndroid Build Coastguard Worker 20*0e209d39SAndroid Build Coastguard Worker 21*0e209d39SAndroid Build Coastguard Worker #if U_SHOW_CPLUSPLUS_API 22*0e209d39SAndroid Build Coastguard Worker 23*0e209d39SAndroid Build Coastguard Worker #if !UCONFIG_NO_FORMATTING 24*0e209d39SAndroid Build Coastguard Worker 25*0e209d39SAndroid Build Coastguard Worker #include "unicode/unistr.h" 26*0e209d39SAndroid Build Coastguard Worker #include "unicode/tmunit.h" 27*0e209d39SAndroid Build Coastguard Worker #include "unicode/tmutamt.h" 28*0e209d39SAndroid Build Coastguard Worker #include "unicode/measfmt.h" 29*0e209d39SAndroid Build Coastguard Worker #include "unicode/numfmt.h" 30*0e209d39SAndroid Build Coastguard Worker #include "unicode/plurrule.h" 31*0e209d39SAndroid Build Coastguard Worker 32*0e209d39SAndroid Build Coastguard Worker #ifndef U_HIDE_DEPRECATED_API 33*0e209d39SAndroid Build Coastguard Worker 34*0e209d39SAndroid Build Coastguard Worker /** 35*0e209d39SAndroid Build Coastguard Worker * Constants for various styles. 36*0e209d39SAndroid Build Coastguard Worker * There are 2 styles: full name and abbreviated name. 37*0e209d39SAndroid Build Coastguard Worker * For example, for English, the full name for hour duration is "3 hours", 38*0e209d39SAndroid Build Coastguard Worker * and the abbreviated name is "3 hrs". 39*0e209d39SAndroid Build Coastguard Worker * @deprecated ICU 53 Use MeasureFormat and UMeasureFormatWidth instead. 40*0e209d39SAndroid Build Coastguard Worker */ 41*0e209d39SAndroid Build Coastguard Worker enum UTimeUnitFormatStyle { 42*0e209d39SAndroid Build Coastguard Worker /** @deprecated ICU 53 */ 43*0e209d39SAndroid Build Coastguard Worker UTMUTFMT_FULL_STYLE, 44*0e209d39SAndroid Build Coastguard Worker /** @deprecated ICU 53 */ 45*0e209d39SAndroid Build Coastguard Worker UTMUTFMT_ABBREVIATED_STYLE, 46*0e209d39SAndroid Build Coastguard Worker /** @deprecated ICU 53 */ 47*0e209d39SAndroid Build Coastguard Worker UTMUTFMT_FORMAT_STYLE_COUNT 48*0e209d39SAndroid Build Coastguard Worker }; 49*0e209d39SAndroid Build Coastguard Worker typedef enum UTimeUnitFormatStyle UTimeUnitFormatStyle; /**< @deprecated ICU 53 */ 50*0e209d39SAndroid Build Coastguard Worker 51*0e209d39SAndroid Build Coastguard Worker 52*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_BEGIN 53*0e209d39SAndroid Build Coastguard Worker 54*0e209d39SAndroid Build Coastguard Worker class Hashtable; 55*0e209d39SAndroid Build Coastguard Worker class UVector; 56*0e209d39SAndroid Build Coastguard Worker 57*0e209d39SAndroid Build Coastguard Worker struct TimeUnitFormatReadSink; 58*0e209d39SAndroid Build Coastguard Worker 59*0e209d39SAndroid Build Coastguard Worker /** 60*0e209d39SAndroid Build Coastguard Worker * Format or parse a TimeUnitAmount, using plural rules for the units where available. 61*0e209d39SAndroid Build Coastguard Worker * 62*0e209d39SAndroid Build Coastguard Worker * <P> 63*0e209d39SAndroid Build Coastguard Worker * Code Sample: 64*0e209d39SAndroid Build Coastguard Worker * <pre> 65*0e209d39SAndroid Build Coastguard Worker * // create time unit amount instance - a combination of Number and time unit 66*0e209d39SAndroid Build Coastguard Worker * UErrorCode status = U_ZERO_ERROR; 67*0e209d39SAndroid Build Coastguard Worker * TimeUnitAmount* source = new TimeUnitAmount(2, TimeUnit::UTIMEUNIT_YEAR, status); 68*0e209d39SAndroid Build Coastguard Worker * // create time unit format instance 69*0e209d39SAndroid Build Coastguard Worker * TimeUnitFormat* format = new TimeUnitFormat(Locale("en"), status); 70*0e209d39SAndroid Build Coastguard Worker * // format a time unit amount 71*0e209d39SAndroid Build Coastguard Worker * UnicodeString formatted; 72*0e209d39SAndroid Build Coastguard Worker * Formattable formattable; 73*0e209d39SAndroid Build Coastguard Worker * if (U_SUCCESS(status)) { 74*0e209d39SAndroid Build Coastguard Worker * formattable.adoptObject(source); 75*0e209d39SAndroid Build Coastguard Worker * formatted = ((Format*)format)->format(formattable, formatted, status); 76*0e209d39SAndroid Build Coastguard Worker * Formattable result; 77*0e209d39SAndroid Build Coastguard Worker * ((Format*)format)->parseObject(formatted, result, status); 78*0e209d39SAndroid Build Coastguard Worker * if (U_SUCCESS(status)) { 79*0e209d39SAndroid Build Coastguard Worker * assert (result == formattable); 80*0e209d39SAndroid Build Coastguard Worker * } 81*0e209d39SAndroid Build Coastguard Worker * } 82*0e209d39SAndroid Build Coastguard Worker * </pre> 83*0e209d39SAndroid Build Coastguard Worker * 84*0e209d39SAndroid Build Coastguard Worker * <P> 85*0e209d39SAndroid Build Coastguard Worker * @see TimeUnitAmount 86*0e209d39SAndroid Build Coastguard Worker * @see TimeUnitFormat 87*0e209d39SAndroid Build Coastguard Worker * @deprecated ICU 53 Use the MeasureFormat class instead. 88*0e209d39SAndroid Build Coastguard Worker */ 89*0e209d39SAndroid Build Coastguard Worker class U_I18N_API TimeUnitFormat: public MeasureFormat { 90*0e209d39SAndroid Build Coastguard Worker public: 91*0e209d39SAndroid Build Coastguard Worker 92*0e209d39SAndroid Build Coastguard Worker /** 93*0e209d39SAndroid Build Coastguard Worker * Create TimeUnitFormat with default locale, and full name style. 94*0e209d39SAndroid Build Coastguard Worker * Use setLocale and/or setFormat to modify. 95*0e209d39SAndroid Build Coastguard Worker * @deprecated ICU 53 96*0e209d39SAndroid Build Coastguard Worker */ 97*0e209d39SAndroid Build Coastguard Worker TimeUnitFormat(UErrorCode& status); 98*0e209d39SAndroid Build Coastguard Worker 99*0e209d39SAndroid Build Coastguard Worker /** 100*0e209d39SAndroid Build Coastguard Worker * Create TimeUnitFormat given locale, and full name style. 101*0e209d39SAndroid Build Coastguard Worker * @deprecated ICU 53 102*0e209d39SAndroid Build Coastguard Worker */ 103*0e209d39SAndroid Build Coastguard Worker TimeUnitFormat(const Locale& locale, UErrorCode& status); 104*0e209d39SAndroid Build Coastguard Worker 105*0e209d39SAndroid Build Coastguard Worker /** 106*0e209d39SAndroid Build Coastguard Worker * Create TimeUnitFormat given locale and style. 107*0e209d39SAndroid Build Coastguard Worker * @deprecated ICU 53 108*0e209d39SAndroid Build Coastguard Worker */ 109*0e209d39SAndroid Build Coastguard Worker TimeUnitFormat(const Locale& locale, UTimeUnitFormatStyle style, UErrorCode& status); 110*0e209d39SAndroid Build Coastguard Worker 111*0e209d39SAndroid Build Coastguard Worker /** 112*0e209d39SAndroid Build Coastguard Worker * Copy constructor. 113*0e209d39SAndroid Build Coastguard Worker * @deprecated ICU 53 114*0e209d39SAndroid Build Coastguard Worker */ 115*0e209d39SAndroid Build Coastguard Worker TimeUnitFormat(const TimeUnitFormat&); 116*0e209d39SAndroid Build Coastguard Worker 117*0e209d39SAndroid Build Coastguard Worker /** 118*0e209d39SAndroid Build Coastguard Worker * deconstructor 119*0e209d39SAndroid Build Coastguard Worker * @deprecated ICU 53 120*0e209d39SAndroid Build Coastguard Worker */ 121*0e209d39SAndroid Build Coastguard Worker virtual ~TimeUnitFormat(); 122*0e209d39SAndroid Build Coastguard Worker 123*0e209d39SAndroid Build Coastguard Worker /** 124*0e209d39SAndroid Build Coastguard Worker * Clone this Format object polymorphically. The caller owns the result and 125*0e209d39SAndroid Build Coastguard Worker * should delete it when done. 126*0e209d39SAndroid Build Coastguard Worker * @return A copy of the object. 127*0e209d39SAndroid Build Coastguard Worker * @deprecated ICU 53 128*0e209d39SAndroid Build Coastguard Worker */ 129*0e209d39SAndroid Build Coastguard Worker virtual TimeUnitFormat* clone() const override; 130*0e209d39SAndroid Build Coastguard Worker 131*0e209d39SAndroid Build Coastguard Worker /** 132*0e209d39SAndroid Build Coastguard Worker * Assignment operator 133*0e209d39SAndroid Build Coastguard Worker * @deprecated ICU 53 134*0e209d39SAndroid Build Coastguard Worker */ 135*0e209d39SAndroid Build Coastguard Worker TimeUnitFormat& operator=(const TimeUnitFormat& other); 136*0e209d39SAndroid Build Coastguard Worker 137*0e209d39SAndroid Build Coastguard Worker /** 138*0e209d39SAndroid Build Coastguard Worker * Set the locale used for formatting or parsing. 139*0e209d39SAndroid Build Coastguard Worker * @param locale the locale to be set 140*0e209d39SAndroid Build Coastguard Worker * @param status output param set to success/failure code on exit 141*0e209d39SAndroid Build Coastguard Worker * @deprecated ICU 53 142*0e209d39SAndroid Build Coastguard Worker */ 143*0e209d39SAndroid Build Coastguard Worker void setLocale(const Locale& locale, UErrorCode& status); 144*0e209d39SAndroid Build Coastguard Worker 145*0e209d39SAndroid Build Coastguard Worker 146*0e209d39SAndroid Build Coastguard Worker /** 147*0e209d39SAndroid Build Coastguard Worker * Set the number format used for formatting or parsing. 148*0e209d39SAndroid Build Coastguard Worker * @param format the number formatter to be set 149*0e209d39SAndroid Build Coastguard Worker * @param status output param set to success/failure code on exit 150*0e209d39SAndroid Build Coastguard Worker * @deprecated ICU 53 151*0e209d39SAndroid Build Coastguard Worker */ 152*0e209d39SAndroid Build Coastguard Worker void setNumberFormat(const NumberFormat& format, UErrorCode& status); 153*0e209d39SAndroid Build Coastguard Worker 154*0e209d39SAndroid Build Coastguard Worker /** 155*0e209d39SAndroid Build Coastguard Worker * Parse a TimeUnitAmount. 156*0e209d39SAndroid Build Coastguard Worker * @see Format#parseObject(const UnicodeString&, Formattable&, ParsePosition&) const; 157*0e209d39SAndroid Build Coastguard Worker * @deprecated ICU 53 158*0e209d39SAndroid Build Coastguard Worker */ 159*0e209d39SAndroid Build Coastguard Worker virtual void parseObject(const UnicodeString& source, 160*0e209d39SAndroid Build Coastguard Worker Formattable& result, 161*0e209d39SAndroid Build Coastguard Worker ParsePosition& pos) const override; 162*0e209d39SAndroid Build Coastguard Worker 163*0e209d39SAndroid Build Coastguard Worker /** 164*0e209d39SAndroid Build Coastguard Worker * Return the class ID for this class. This is useful only for comparing to 165*0e209d39SAndroid Build Coastguard Worker * a return value from getDynamicClassID(). For example: 166*0e209d39SAndroid Build Coastguard Worker * <pre> 167*0e209d39SAndroid Build Coastguard Worker * . Base* polymorphic_pointer = createPolymorphicObject(); 168*0e209d39SAndroid Build Coastguard Worker * . if (polymorphic_pointer->getDynamicClassID() == 169*0e209d39SAndroid Build Coastguard Worker * . erived::getStaticClassID()) ... 170*0e209d39SAndroid Build Coastguard Worker * </pre> 171*0e209d39SAndroid Build Coastguard Worker * @return The class ID for all objects of this class. 172*0e209d39SAndroid Build Coastguard Worker * @deprecated ICU 53 173*0e209d39SAndroid Build Coastguard Worker */ 174*0e209d39SAndroid Build Coastguard Worker static UClassID U_EXPORT2 getStaticClassID(); 175*0e209d39SAndroid Build Coastguard Worker 176*0e209d39SAndroid Build Coastguard Worker /** 177*0e209d39SAndroid Build Coastguard Worker * Returns a unique class ID POLYMORPHICALLY. Pure virtual override. This 178*0e209d39SAndroid Build Coastguard Worker * method is to implement a simple version of RTTI, since not all C++ 179*0e209d39SAndroid Build Coastguard Worker * compilers support genuine RTTI. Polymorphic operator==() and clone() 180*0e209d39SAndroid Build Coastguard Worker * methods call this method. 181*0e209d39SAndroid Build Coastguard Worker * 182*0e209d39SAndroid Build Coastguard Worker * @return The class ID for this object. All objects of a 183*0e209d39SAndroid Build Coastguard Worker * given class have the same class ID. Objects of 184*0e209d39SAndroid Build Coastguard Worker * other classes have different class IDs. 185*0e209d39SAndroid Build Coastguard Worker * @deprecated ICU 53 186*0e209d39SAndroid Build Coastguard Worker */ 187*0e209d39SAndroid Build Coastguard Worker virtual UClassID getDynamicClassID() const override; 188*0e209d39SAndroid Build Coastguard Worker 189*0e209d39SAndroid Build Coastguard Worker private: 190*0e209d39SAndroid Build Coastguard Worker Hashtable* fTimeUnitToCountToPatterns[TimeUnit::UTIMEUNIT_FIELD_COUNT]; 191*0e209d39SAndroid Build Coastguard Worker UTimeUnitFormatStyle fStyle; 192*0e209d39SAndroid Build Coastguard Worker 193*0e209d39SAndroid Build Coastguard Worker void create(UTimeUnitFormatStyle style, UErrorCode& status); 194*0e209d39SAndroid Build Coastguard Worker 195*0e209d39SAndroid Build Coastguard Worker // it might actually be simpler to make them Decimal Formats later. 196*0e209d39SAndroid Build Coastguard Worker // initialize all private data members 197*0e209d39SAndroid Build Coastguard Worker void setup(UErrorCode& status); 198*0e209d39SAndroid Build Coastguard Worker 199*0e209d39SAndroid Build Coastguard Worker // initialize data member without fill in data for fTimeUnitToCountToPattern 200*0e209d39SAndroid Build Coastguard Worker void initDataMembers(UErrorCode& status); 201*0e209d39SAndroid Build Coastguard Worker 202*0e209d39SAndroid Build Coastguard Worker // initialize fTimeUnitToCountToPatterns from current locale's resource. 203*0e209d39SAndroid Build Coastguard Worker void readFromCurrentLocale(UTimeUnitFormatStyle style, const char* key, const UVector& pluralCounts, 204*0e209d39SAndroid Build Coastguard Worker UErrorCode& status); 205*0e209d39SAndroid Build Coastguard Worker 206*0e209d39SAndroid Build Coastguard Worker // check completeness of fTimeUnitToCountToPatterns against all time units, 207*0e209d39SAndroid Build Coastguard Worker // and all plural rules, fill in fallback as necessary. 208*0e209d39SAndroid Build Coastguard Worker void checkConsistency(UTimeUnitFormatStyle style, const char* key, UErrorCode& status); 209*0e209d39SAndroid Build Coastguard Worker 210*0e209d39SAndroid Build Coastguard Worker // fill in fTimeUnitToCountToPatterns from locale fall-back chain 211*0e209d39SAndroid Build Coastguard Worker void searchInLocaleChain(UTimeUnitFormatStyle style, const char* key, const char* localeName, 212*0e209d39SAndroid Build Coastguard Worker TimeUnit::UTimeUnitFields field, const UnicodeString&, 213*0e209d39SAndroid Build Coastguard Worker const char*, Hashtable*, UErrorCode&); 214*0e209d39SAndroid Build Coastguard Worker 215*0e209d39SAndroid Build Coastguard Worker // initialize hash table 216*0e209d39SAndroid Build Coastguard Worker Hashtable* initHash(UErrorCode& status); 217*0e209d39SAndroid Build Coastguard Worker 218*0e209d39SAndroid Build Coastguard Worker // delete hash table 219*0e209d39SAndroid Build Coastguard Worker void deleteHash(Hashtable* htable); 220*0e209d39SAndroid Build Coastguard Worker 221*0e209d39SAndroid Build Coastguard Worker // copy hash table 222*0e209d39SAndroid Build Coastguard Worker void copyHash(const Hashtable* source, Hashtable* target, UErrorCode& status); 223*0e209d39SAndroid Build Coastguard Worker // get time unit name, such as "year", from time unit field enum, such as 224*0e209d39SAndroid Build Coastguard Worker // UTIMEUNIT_YEAR. 225*0e209d39SAndroid Build Coastguard Worker static const char* getTimeUnitName(TimeUnit::UTimeUnitFields field, UErrorCode& status); 226*0e209d39SAndroid Build Coastguard Worker 227*0e209d39SAndroid Build Coastguard Worker friend struct TimeUnitFormatReadSink; 228*0e209d39SAndroid Build Coastguard Worker }; 229*0e209d39SAndroid Build Coastguard Worker 230*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_END 231*0e209d39SAndroid Build Coastguard Worker 232*0e209d39SAndroid Build Coastguard Worker #endif /* U_HIDE_DEPRECATED_API */ 233*0e209d39SAndroid Build Coastguard Worker #endif /* #if !UCONFIG_NO_FORMATTING */ 234*0e209d39SAndroid Build Coastguard Worker 235*0e209d39SAndroid Build Coastguard Worker #endif /* U_SHOW_CPLUSPLUS_API */ 236*0e209d39SAndroid Build Coastguard Worker 237*0e209d39SAndroid Build Coastguard Worker #endif // __TMUTFMT_H__ 238*0e209d39SAndroid Build Coastguard Worker //eof 239