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