1/*
2******************************************************************************
3* Copyright (C) 2014-2015, International Business Machines
4* Corporation and others.  All Rights Reserved.
5******************************************************************************
6* quantityformatter.h
7*/
8
9#ifndef __QUANTITY_FORMATTER_H__
10#define __QUANTITY_FORMATTER_H__
11
12#include "unicode/utypes.h"
13#include "unicode/uobject.h"
14
15#if !UCONFIG_NO_FORMATTING
16
17#include "standardplural.h"
18
19U_NAMESPACE_BEGIN
20
21class SimplePatternFormatter;
22class UnicodeString;
23class PluralRules;
24class NumberFormat;
25class Formattable;
26class FieldPosition;
27
28/**
29 * A plural aware formatter that is good for expressing a single quantity and
30 * a unit.
31 * <p>
32 * First use the add() methods to add a pattern for each plural variant.
33 * There must be a pattern for the "other" variant.
34 * Then use the format() method.
35 * <p>
36 * Concurrent calls only to const methods on a QuantityFormatter object are
37 * safe, but concurrent const and non-const method calls on a QuantityFormatter
38 * object are not safe and require synchronization.
39 *
40 */
41class U_I18N_API QuantityFormatter : public UMemory {
42public:
43    /**
44     * Default constructor.
45     */
46    QuantityFormatter();
47
48    /**
49     * Copy constructor.
50     */
51    QuantityFormatter(const QuantityFormatter& other);
52
53    /**
54     * Assignment operator
55     */
56    QuantityFormatter &operator=(const QuantityFormatter& other);
57
58    /**
59     * Destructor.
60     */
61    ~QuantityFormatter();
62
63    /**
64     * Removes all variants from this object including the "other" variant.
65     */
66    void reset();
67
68    /**
69     * Adds a plural variant if there is none yet for the plural form.
70     *
71     * @param variant "zero", "one", "two", "few", "many", "other"
72     * @param rawPattern the pattern for the variant e.g "{0} meters"
73     * @param status any error returned here.
74     * @return TRUE on success; FALSE if status was set to a non zero error.
75     */
76    UBool addIfAbsent(const char *variant, const UnicodeString &rawPattern, UErrorCode &status);
77
78    /**
79     * returns TRUE if this object has at least the "other" variant.
80     */
81    UBool isValid() const;
82
83    /**
84     * Gets the pattern formatter that would be used for a particular variant.
85     * If isValid() returns TRUE, this method is guaranteed to return a
86     * non-NULL value.
87     */
88    const SimplePatternFormatter *getByVariant(const char *variant) const;
89
90    /**
91     * Formats a number with this object appending the result to appendTo.
92     * At least the "other" variant must be added to this object for this
93     * method to work.
94     *
95     * @param number the single number.
96     * @param fmt formats the number
97     * @param rules computes the plural variant to use.
98     * @param appendTo result appended here.
99     * @param status any error returned here.
100     * @return appendTo
101     */
102    UnicodeString &format(
103            const Formattable &number,
104            const NumberFormat &fmt,
105            const PluralRules &rules,
106            UnicodeString &appendTo,
107            FieldPosition &pos,
108            UErrorCode &status) const;
109
110    /**
111     * Selects the standard plural form for the number/formatter/rules.
112     */
113    static StandardPlural::Form selectPlural(
114            const Formattable &number,
115            const NumberFormat &fmt,
116            const PluralRules &rules,
117            UnicodeString &formattedNumber,
118            FieldPosition &pos,
119            UErrorCode &status);
120
121    /**
122     * Formats the pattern with the value and adjusts the FieldPosition.
123     */
124    static UnicodeString &format(
125            const SimplePatternFormatter &pattern,
126            const UnicodeString &value,
127            UnicodeString &appendTo,
128            FieldPosition &pos,
129            UErrorCode &status);
130
131private:
132    SimplePatternFormatter *formatters[StandardPlural::COUNT];
133};
134
135U_NAMESPACE_END
136
137#endif
138
139#endif
140