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