1 // © 2018 and later: Unicode, Inc. and others.
2 // License & terms of use: http://www.unicode.org/copyright.html
3 
4 #include "unicode/utypes.h"
5 
6 #if !UCONFIG_NO_FORMATTING
7 #ifndef __SOURCE_NUMRANGE_TYPES_H__
8 #define __SOURCE_NUMRANGE_TYPES_H__
9 
10 #include "unicode/numberformatter.h"
11 #include "unicode/numberrangeformatter.h"
12 #include "unicode/simpleformatter.h"
13 #include "number_types.h"
14 #include "number_decimalquantity.h"
15 #include "number_formatimpl.h"
16 #include "formatted_string_builder.h"
17 #include "formattedval_impl.h"
18 #include "pluralranges.h"
19 
20 U_NAMESPACE_BEGIN namespace number {
21 namespace impl {
22 
23 
24 /**
25  * Class similar to UFormattedNumberData.
26  *
27  * Has incomplete magic number logic that will need to be finished
28  * if this is to be exposed as C API in the future.
29  *
30  * Possible magic number: 0x46445200
31  * Reads in ASCII as "FDR" (FormatteDnumberRange with room at the end)
32  */
33 class UFormattedNumberRangeData : public FormattedValueStringBuilderImpl {
34 public:
UFormattedNumberRangeData()35     UFormattedNumberRangeData() : FormattedValueStringBuilderImpl(kUndefinedField) {}
36     virtual ~UFormattedNumberRangeData();
37 
38     DecimalQuantity quantity1;
39     DecimalQuantity quantity2;
40     UNumberRangeIdentityResult identityResult = UNUM_IDENTITY_RESULT_COUNT;
41 };
42 
43 
44 class NumberRangeFormatterImpl : public UMemory {
45   public:
46     NumberRangeFormatterImpl(const RangeMacroProps& macros, UErrorCode& status);
47 
48     void format(UFormattedNumberRangeData& data, bool equalBeforeRounding, UErrorCode& status) const;
49 
50   private:
51     NumberFormatterImpl formatterImpl1;
52     NumberFormatterImpl formatterImpl2;
53     bool fSameFormatters;
54 
55     UNumberRangeCollapse fCollapse;
56     UNumberRangeIdentityFallback fIdentityFallback;
57 
58     SimpleFormatter fRangeFormatter;
59     SimpleModifier fApproximatelyModifier;
60 
61     StandardPluralRanges fPluralRanges;
62 
63     void formatSingleValue(UFormattedNumberRangeData& data,
64                            MicroProps& micros1, MicroProps& micros2,
65                            UErrorCode& status) const;
66 
67     void formatApproximately(UFormattedNumberRangeData& data,
68                              MicroProps& micros1, MicroProps& micros2,
69                              UErrorCode& status) const;
70 
71     void formatRange(UFormattedNumberRangeData& data,
72                      MicroProps& micros1, MicroProps& micros2,
73                      UErrorCode& status) const;
74 
75     const Modifier& resolveModifierPlurals(const Modifier& first, const Modifier& second) const;
76 };
77 
78 
79 /** Helper function used in upluralrules.cpp */
80 const UFormattedNumberRangeData* validateUFormattedNumberRange(
81     const UFormattedNumberRange* uresult, UErrorCode& status);
82 
83 
84 } // namespace impl
85 } // namespace number
86 U_NAMESPACE_END
87 
88 #endif //__SOURCE_NUMRANGE_TYPES_H__
89 #endif /* #if !UCONFIG_NO_FORMATTING */
90