164339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert// Copyright (C) 2016 and later: Unicode, Inc. and others.
264339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html
3c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert/*
4c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert*******************************************************************************
5c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert* Copyright (C) 2015, International Business Machines Corporation and         *
6c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert* others. All Rights Reserved.                                                *
7c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert*******************************************************************************
8c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert*/
9c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
10c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert#ifndef VALUEFORMATTER_H
11c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert#define VALUEFORMATTER_H
12c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
13c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert#if !UCONFIG_NO_FORMATTING
14c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
15c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert#include "unicode/uobject.h"
16c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert#include "unicode/utypes.h"
17c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
18c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
19c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
20c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik RoubertU_NAMESPACE_BEGIN
21c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
22c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertclass UnicodeString;
23c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertclass DigitList;
24c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertclass FieldPositionHandler;
25c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertclass DigitGrouping;
26c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertclass PluralRules;
27c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertclass FixedPrecision;
28c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertclass DigitFormatter;
29c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertclass DigitFormatterOptions;
30c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertclass ScientificPrecision;
31c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertclass SciFormatterOptions;
32c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertclass FixedDecimal;
33c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertclass VisibleDigitsWithExponent;
34c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
35c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
36c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert/**
37c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert * A closure around rounding and formatting a value. As these instances are
38c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert * designed to be short lived (they only exist while formatting a value), they
39c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert * do not own their own attributes. Rather the caller maintains ownership of
40c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert * all attributes. A caller first calls a prepareXXX method on an instance
41c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert * to share its data before using that instance. Using an
42c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert * instance without first calling a prepareXXX method results in an
43c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert * assertion error and a program crash.
44c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert */
45c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertclass U_I18N_API ValueFormatter : public UObject {
46c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertpublic:
47c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    ValueFormatter() : fType(kFormatTypeCount) {
48c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
49c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
50c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    virtual ~ValueFormatter();
51c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
52c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    /**
53c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * This function is here only to support the protected round() method
54c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * in DecimalFormat. It serves no ther purpose than that.
55c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     *
56c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * @param value this value is rounded in place.
57c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * @param status any error returned here.
58c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     */
59c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    DigitList &round(DigitList &value, UErrorCode &status) const;
60c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
61c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    /**
62c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * Returns TRUE if the absolute value of value can be fast formatted
63c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * using ValueFormatter::formatInt32.
64c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     */
65c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    UBool isFastFormattable(int32_t value) const;
66c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
67c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    /**
68c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * Converts value to a VisibleDigitsWithExponent.
69c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * Result may be fixed point or scientific.
70c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     */
71c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    VisibleDigitsWithExponent &toVisibleDigitsWithExponent(
72c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            int64_t value,
73c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            VisibleDigitsWithExponent &digits,
74c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            UErrorCode &status) const;
75c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
76c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    /**
77c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * Converts value to a VisibleDigitsWithExponent.
78c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * Result may be fixed point or scientific.
79c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     */
80c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    VisibleDigitsWithExponent &toVisibleDigitsWithExponent(
81c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            DigitList &value,
82c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            VisibleDigitsWithExponent &digits,
83c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            UErrorCode &status) const;
84c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
85c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    /**
86c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * formats positiveValue and appends to appendTo. Returns appendTo.
87c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * @param positiveValue If negative, no negative sign is formatted.
88c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * @param handler stores the field positions
89c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * @param appendTo formatted value appended here.
90c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     */
91c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    UnicodeString &format(
92c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        const VisibleDigitsWithExponent &positiveValue,
93c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        FieldPositionHandler &handler,
94c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        UnicodeString &appendTo) const;
95c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
96c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
97c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    /**
98c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * formats positiveValue and appends to appendTo. Returns appendTo.
99c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * value must be positive. Calling formatInt32 to format a value when
100c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * isFastFormattable indicates that the value cannot be fast formatted
101c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * results in undefined behavior.
102c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     */
103c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    UnicodeString &formatInt32(
104c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        int32_t positiveValue,
105c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        FieldPositionHandler &handler,
106c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        UnicodeString &appendTo) const;
107c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
108c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    /**
109c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * Returns the number of code points needed to format.
110c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * @param positiveValue if negative, the negative sign is not included
111c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     *   in count.
112c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     */
113c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    int32_t countChar32(
114c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            const VisibleDigitsWithExponent &positiveValue) const;
115c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
116c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    /**
117c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * Prepares this instance for fixed decimal formatting.
118c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     */
119c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    void prepareFixedDecimalFormatting(
120c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        const DigitFormatter &formatter,
121c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        const DigitGrouping &grouping,
122c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        const FixedPrecision &precision,
123c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        const DigitFormatterOptions &options);
124c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
125c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    /**
126c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     * Prepares this instance for scientific formatting.
127c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert     */
128c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    void prepareScientificFormatting(
129c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        const DigitFormatter &formatter,
130c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        const ScientificPrecision &precision,
131c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        const SciFormatterOptions &options);
132c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
133c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertprivate:
134c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    ValueFormatter(const ValueFormatter &);
135c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    ValueFormatter &operator=(const ValueFormatter &);
136c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    enum FormatType {
137c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        kFixedDecimal,
138c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        kScientificNotation,
139c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        kFormatTypeCount
140c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    };
141c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
142c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    FormatType fType;
143c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
144c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    // for fixed decimal and scientific formatting
145c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    const DigitFormatter *fDigitFormatter;
146c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
147c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    // for fixed decimal formatting
148c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    const FixedPrecision *fFixedPrecision;
149c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    const DigitFormatterOptions *fFixedOptions;
150c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    const DigitGrouping *fGrouping;
151c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
152c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    // for scientific formatting
153c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    const ScientificPrecision *fScientificPrecision;
154c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    const SciFormatterOptions *fScientificOptions;
155c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert};
156c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
157c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik RoubertU_NAMESPACE_END
158c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
159c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert#endif /* !UCONFIG_NO_FORMATTING */
160c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
161c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert#endif /* VALUEFORMATTER_H */
162