1b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru/*
2b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru *******************************************************************************
3b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * Copyright (C) 2008-2011, Google, International Business Machines Corporation
4b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * and others. All Rights Reserved.
5b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru *******************************************************************************
6b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru */
7b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
8b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#ifndef __TMUTFMT_H__
9b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#define __TMUTFMT_H__
10b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
11b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#include "unicode/utypes.h"
12b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
13b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru/**
14b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * \file
15b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * \brief C++ API: Format and parse duration in single time unit
16b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru */
17b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
18b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
19b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#if !UCONFIG_NO_FORMATTING
20b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
21b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#include "unicode/unistr.h"
22b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#include "unicode/tmunit.h"
23b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#include "unicode/tmutamt.h"
24b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#include "unicode/measfmt.h"
25b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#include "unicode/numfmt.h"
26b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#include "unicode/plurrule.h"
27b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
28b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru/**
29b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * Constants for various styles.
30b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * There are 2 styles: full name and abbreviated name.
31b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * For example, for English, the full name for hour duration is "3 hours",
32b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * and the abbreviated name is "3 hrs".
33b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * @draft ICU 4.8
34b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru */
35b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoenum UTimeUnitFormatStyle {
36b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /** @draft ICU 4.8 */
37b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UTMUTFMT_FULL_STYLE,
38b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /** @draft ICU 4.8 */
39b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UTMUTFMT_ABBREVIATED_STYLE,
40b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /** @draft ICU 4.8 */
41b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UTMUTFMT_FORMAT_STYLE_COUNT
42b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho};
43b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehotypedef enum UTimeUnitFormatStyle UTimeUnitFormatStyle; /**< @draft ICU 4.8 */
44b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
45b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruU_NAMESPACE_BEGIN
46b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
47b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruclass Hashtable;
48b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
49b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
50b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru/**
51b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * Format or parse a TimeUnitAmount, using plural rules for the units where available.
52b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru *
53b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * <P>
5450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * Code Sample:
55b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * <pre>
56b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru *   // create time unit amount instance - a combination of Number and time unit
57b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru *   UErrorCode status = U_ZERO_ERROR;
58b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru *   TimeUnitAmount* source = new TimeUnitAmount(2, TimeUnit::UTIMEUNIT_YEAR, status);
59b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru *   // create time unit format instance
60b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru *   TimeUnitFormat* format = new TimeUnitFormat(Locale("en"), status);
61b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru *   // format a time unit amount
62b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru *   UnicodeString formatted;
63b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru *   Formattable formattable;
64b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru *   if (U_SUCCESS(status)) {
65b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru *       formattable.adoptObject(source);
66b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru *       formatted = ((Format*)format)->format(formattable, formatted, status);
67b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru *       Formattable result;
68b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru *       ((Format*)format)->parseObject(formatted, result, status);
69b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru *       if (U_SUCCESS(status)) {
7050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *           assert (result == formattable);
71b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru *       }
72b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru *   }
73b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * </pre>
74b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru *
75b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * <P>
76b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * @see TimeUnitAmount
77b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * @see TimeUnitFormat
78b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * @draft ICU 4.2
79b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru */
80b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruclass U_I18N_API TimeUnitFormat: public MeasureFormat {
81b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querupublic:
82b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
83b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    /**
8450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * Create TimeUnitFormat with default locale, and full name style.
85b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru     * Use setLocale and/or setFormat to modify.
8650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * @stable ICU 4.2
87b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru     */
88b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    TimeUnitFormat(UErrorCode& status);
89b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
90b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    /**
91b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru     * Create TimeUnitFormat given locale, and full name style.
9250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * @stable ICU 4.2
93b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru     */
94b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    TimeUnitFormat(const Locale& locale, UErrorCode& status);
95b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
96b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    /**
97b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru     * Create TimeUnitFormat given locale and style.
98b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @draft ICU 4.8
99b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru     */
100b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TimeUnitFormat(const Locale& locale, UTimeUnitFormatStyle style, UErrorCode& status);
101b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
102b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    /**
103b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru     * Copy constructor.
10450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * @stable ICU 4.2
105b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru     */
106b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    TimeUnitFormat(const TimeUnitFormat&);
107b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
108b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    /**
109b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru     * deconstructor
11050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * @stable ICU 4.2
111b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru     */
112b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    virtual ~TimeUnitFormat();
113b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
114b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    /**
115b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru     * Clone this Format object polymorphically. The caller owns the result and
116b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru     * should delete it when done.
117b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru     * @return    A copy of the object.
11850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * @stable ICU 4.2
119b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru     */
120b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    virtual Format* clone(void) const;
121b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
122b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    /**
123b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru     * Assignment operator
12450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * @stable ICU 4.2
125b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru     */
126b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    TimeUnitFormat& operator=(const TimeUnitFormat& other);
127b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
128b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
129b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    /**
130b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru     * Return true if the given Format objects are semantically equal. Objects
131b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru     * of different subclasses are considered unequal.
132b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru     * @param other    the object to be compared with.
133b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru     * @return         true if the given Format objects are semantically equal.
13450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * @stable ICU 4.2
135b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru     */
136b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    virtual UBool operator==(const Format& other) const;
137b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
138b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    /**
13950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * Return true if the given Format objects are not semantically equal.
140b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru     * Objects of different subclasses are considered unequal.
141b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru     * @param other the object to be compared with.
142b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru     * @return      true if the given Format objects are not semantically equal.
14350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * @stable ICU 4.2
144b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru     */
145b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UBool operator!=(const Format& other) const;
146b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
147b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    /**
148b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru     * Set the locale used for formatting or parsing.
149b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru     * @param locale  the locale to be set
150b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru     * @param status  output param set to success/failure code on exit
15150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * @stable ICU 4.2
152b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru     */
153b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    void setLocale(const Locale& locale, UErrorCode& status);
154b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
155b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
156b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    /**
15750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * Set the number format used for formatting or parsing.
158b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru     * @param format  the number formatter to be set
159b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru     * @param status  output param set to success/failure code on exit
16050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * @stable ICU 4.2
161b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru     */
162b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    void setNumberFormat(const NumberFormat& format, UErrorCode& status);
163b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
16450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
16550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    using MeasureFormat::format;
16650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
167b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    /**
168b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru     * Format a TimeUnitAmount.
169b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru     * If the formattable object is not a time unit amount object,
170b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru     * or the number in time unit amount is not a double type or long type
171b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru     * numeric, it returns a failing status: U_ILLEGAL_ARGUMENT_ERROR.
172b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru     * @see Format#format(const Formattable&, UnicodeString&, FieldPosition&,  UErrorCode&) const
17350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * @stable ICU 4.2
174b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru     */
17550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    virtual UnicodeString& format(const Formattable& obj,
176b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                                  UnicodeString& toAppendTo,
17750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                                  FieldPosition& pos,
17850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                                  UErrorCode& status) const;
179b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
180b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    /**
181b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru     * Parse a TimeUnitAmount.
182b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru     * @see Format#parseObject(const UnicodeString&, Formattable&, ParsePosition&) const;
18350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * @stable ICU 4.2
184b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru     */
18550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    virtual void parseObject(const UnicodeString& source,
186b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                             Formattable& result,
187b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                             ParsePosition& pos) const;
188b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
189b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    /**
190b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru     * Return the class ID for this class. This is useful only for comparing to
191b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru     * a return value from getDynamicClassID(). For example:
192b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru     * <pre>
193b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru     * .   Base* polymorphic_pointer = createPolymorphicObject();
194b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru     * .   if (polymorphic_pointer->getDynamicClassID() ==
195b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru     * .       erived::getStaticClassID()) ...
196b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru     * </pre>
197b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru     * @return          The class ID for all objects of this class.
19850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * @stable ICU 4.2
199b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru     */
200b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    static UClassID U_EXPORT2 getStaticClassID(void);
201b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
202b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    /**
203b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru     * Returns a unique class ID POLYMORPHICALLY. Pure virtual override. This
204b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru     * method is to implement a simple version of RTTI, since not all C++
205b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru     * compilers support genuine RTTI. Polymorphic operator==() and clone()
206b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru     * methods call this method.
207b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru     *
208b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru     * @return          The class ID for this object. All objects of a
209b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru     *                  given class have the same class ID.  Objects of
210b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru     *                  other classes have different class IDs.
21150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * @stable ICU 4.2
212b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru     */
213b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    virtual UClassID getDynamicClassID(void) const;
214b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
215b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruprivate:
216b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    NumberFormat* fNumberFormat;
217b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    Locale        fLocale;
218b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    Hashtable*    fTimeUnitToCountToPatterns[TimeUnit::UTIMEUNIT_FIELD_COUNT];
219b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    PluralRules*  fPluralRules;
220b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UTimeUnitFormatStyle fStyle;
221b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
222b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    void create(const Locale& locale, UTimeUnitFormatStyle style, UErrorCode& status);
223b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
224b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    // it might actually be simpler to make them Decimal Formats later.
225b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    // initialize all private data members
22650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    void setup(UErrorCode& status);
22750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
228b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    // initialize data member without fill in data for fTimeUnitToCountToPattern
229b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    void initDataMembers(UErrorCode& status);
230b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
231b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    // initialize fTimeUnitToCountToPatterns from current locale's resource.
232b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    void readFromCurrentLocale(UTimeUnitFormatStyle style, const char* key, UErrorCode& status);
233b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
234b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    // check completeness of fTimeUnitToCountToPatterns against all time units,
235b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    // and all plural rules, fill in fallback as necessary.
236b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    void checkConsistency(UTimeUnitFormatStyle style, const char* key, UErrorCode& status);
237b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
238b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    // fill in fTimeUnitToCountToPatterns from locale fall-back chain
239b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    void searchInLocaleChain(UTimeUnitFormatStyle style, const char* key, const char* localeName,
240b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                             TimeUnit::UTimeUnitFields field, const UnicodeString&,
241b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                             const char*, Hashtable*, UErrorCode&);
242b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
243b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    // initialize hash table
244b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    Hashtable* initHash(UErrorCode& status);
245b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
246b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    // delete hash table
247b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    void deleteHash(Hashtable* htable);
248b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
249b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    // copy hash table
250b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    void copyHash(const Hashtable* source, Hashtable* target, UErrorCode& status);
251b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    // get time unit name, such as "year", from time unit field enum, such as
252b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    // UTIMEUNIT_YEAR.
253b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    static const char* getTimeUnitName(TimeUnit::UTimeUnitFields field, UErrorCode& status);
254b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru};
255b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
256b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
257b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
258b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruinline UBool
259b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruTimeUnitFormat::operator!=(const Format& other) const  {
260b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    return !operator==(other);
261b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
262b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
263b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
264b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
265b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruU_NAMESPACE_END
266b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
267b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#endif /* #if !UCONFIG_NO_FORMATTING */
268b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
269b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#endif // __TMUTFMT_H__
270b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru//eof
271