tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

quantityformatter.h (5032B)


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