tor-browser

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

reldatefmt.h (23231B)


      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 Corporation and
      6 * others.
      7 * All Rights Reserved.
      8 *****************************************************************************
      9 *
     10 * File RELDATEFMT.H
     11 *****************************************************************************
     12 */
     13 
     14 #ifndef __RELDATEFMT_H
     15 #define __RELDATEFMT_H
     16 
     17 #include "unicode/utypes.h"
     18 
     19 #if U_SHOW_CPLUSPLUS_API
     20 
     21 #include "unicode/uobject.h"
     22 #include "unicode/udisplaycontext.h"
     23 #include "unicode/ureldatefmt.h"
     24 #include "unicode/locid.h"
     25 #include "unicode/formattedvalue.h"
     26 
     27 /**
     28 * \file
     29 * \brief C++ API: Formats relative dates such as "1 day ago" or "tomorrow"
     30 */
     31 
     32 #if !UCONFIG_NO_FORMATTING
     33 
     34 /**
     35 * Represents the unit for formatting a relative date. e.g "in 5 days"
     36 * or "in 3 months"
     37 * @stable ICU 53
     38 */
     39 typedef enum UDateRelativeUnit {
     40 
     41    /**
     42     * Seconds
     43     * @stable ICU 53
     44     */
     45    UDAT_RELATIVE_SECONDS,
     46 
     47    /**
     48     * Minutes
     49     * @stable ICU 53
     50     */
     51    UDAT_RELATIVE_MINUTES,
     52 
     53    /**
     54     * Hours
     55     * @stable ICU 53
     56     */
     57    UDAT_RELATIVE_HOURS,
     58 
     59    /**
     60     * Days
     61     * @stable ICU 53
     62     */
     63    UDAT_RELATIVE_DAYS,
     64 
     65    /**
     66     * Weeks
     67     * @stable ICU 53
     68     */
     69    UDAT_RELATIVE_WEEKS,
     70 
     71    /**
     72     * Months
     73     * @stable ICU 53
     74     */
     75    UDAT_RELATIVE_MONTHS,
     76 
     77    /**
     78     * Years
     79     * @stable ICU 53
     80     */
     81    UDAT_RELATIVE_YEARS,
     82 
     83 #ifndef U_HIDE_DEPRECATED_API
     84    /**
     85     * One more than the highest normal UDateRelativeUnit value.
     86     * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420.
     87     */
     88    UDAT_RELATIVE_UNIT_COUNT
     89 #endif  // U_HIDE_DEPRECATED_API
     90 } UDateRelativeUnit;
     91 
     92 /**
     93 * Represents an absolute unit.
     94 * @stable ICU 53
     95 */
     96 typedef enum UDateAbsoluteUnit {
     97 
     98    // Days of week have to remain together and in order from Sunday to
     99    // Saturday.
    100    /**
    101     * Sunday
    102     * @stable ICU 53
    103     */
    104    UDAT_ABSOLUTE_SUNDAY,
    105 
    106    /**
    107     * Monday
    108     * @stable ICU 53
    109     */
    110    UDAT_ABSOLUTE_MONDAY,
    111 
    112    /**
    113     * Tuesday
    114     * @stable ICU 53
    115     */
    116    UDAT_ABSOLUTE_TUESDAY,
    117 
    118    /**
    119     * Wednesday
    120     * @stable ICU 53
    121     */
    122    UDAT_ABSOLUTE_WEDNESDAY,
    123 
    124    /**
    125     * Thursday
    126     * @stable ICU 53
    127     */
    128    UDAT_ABSOLUTE_THURSDAY,
    129 
    130    /**
    131     * Friday
    132     * @stable ICU 53
    133     */
    134    UDAT_ABSOLUTE_FRIDAY,
    135 
    136    /**
    137     * Saturday
    138     * @stable ICU 53
    139     */
    140    UDAT_ABSOLUTE_SATURDAY,
    141 
    142    /**
    143     * Day
    144     * @stable ICU 53
    145     */
    146    UDAT_ABSOLUTE_DAY,
    147 
    148    /**
    149     * Week
    150     * @stable ICU 53
    151     */
    152    UDAT_ABSOLUTE_WEEK,
    153 
    154    /**
    155     * Month
    156     * @stable ICU 53
    157     */
    158    UDAT_ABSOLUTE_MONTH,
    159 
    160    /**
    161     * Year
    162     * @stable ICU 53
    163     */
    164    UDAT_ABSOLUTE_YEAR,
    165 
    166    /**
    167     * Now
    168     * @stable ICU 53
    169     */
    170    UDAT_ABSOLUTE_NOW,
    171 
    172    /**
    173     * Quarter
    174     * @stable ICU 63
    175     */
    176    UDAT_ABSOLUTE_QUARTER,
    177 
    178    /**
    179     * Hour
    180     * @stable ICU 65
    181     */
    182    UDAT_ABSOLUTE_HOUR,
    183 
    184    /**
    185     * Minute
    186     * @stable ICU 65
    187     */
    188    UDAT_ABSOLUTE_MINUTE,
    189 
    190 #ifndef U_HIDE_DEPRECATED_API
    191    /**
    192     * One more than the highest normal UDateAbsoluteUnit value.
    193     * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420.
    194     */
    195    UDAT_ABSOLUTE_UNIT_COUNT = UDAT_ABSOLUTE_NOW + 4
    196 #endif  // U_HIDE_DEPRECATED_API
    197 } UDateAbsoluteUnit;
    198 
    199 /**
    200 * Represents a direction for an absolute unit e.g "Next Tuesday"
    201 * or "Last Tuesday"
    202 * @stable ICU 53
    203 */
    204 typedef enum UDateDirection {
    205 
    206    /**
    207     * Two before. Not fully supported in every locale.
    208     * @stable ICU 53
    209     */
    210    UDAT_DIRECTION_LAST_2,
    211 
    212    /**
    213     * Last
    214     * @stable ICU 53
    215     */
    216    UDAT_DIRECTION_LAST,
    217 
    218    /**
    219     * This
    220     * @stable ICU 53
    221     */
    222    UDAT_DIRECTION_THIS,
    223 
    224    /**
    225     * Next
    226     * @stable ICU 53
    227     */
    228    UDAT_DIRECTION_NEXT,
    229 
    230    /**
    231     * Two after. Not fully supported in every locale.
    232     * @stable ICU 53
    233     */
    234    UDAT_DIRECTION_NEXT_2,
    235 
    236    /**
    237     * Plain, which means the absence of a qualifier.
    238     * @stable ICU 53
    239     */
    240    UDAT_DIRECTION_PLAIN,
    241 
    242 #ifndef U_HIDE_DEPRECATED_API
    243    /**
    244     * One more than the highest normal UDateDirection value.
    245     * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420.
    246     */
    247    UDAT_DIRECTION_COUNT
    248 #endif  // U_HIDE_DEPRECATED_API
    249 } UDateDirection;
    250 
    251 U_NAMESPACE_BEGIN
    252 
    253 class BreakIterator;
    254 class RelativeDateTimeCacheData;
    255 class SharedNumberFormat;
    256 class SharedPluralRules;
    257 class SharedBreakIterator;
    258 class NumberFormat;
    259 class UnicodeString;
    260 class FormattedRelativeDateTime;
    261 class FormattedRelativeDateTimeData;
    262 
    263 /**
    264 * An immutable class containing the result of a relative datetime formatting operation.
    265 *
    266 * Instances of this class are immutable and thread-safe.
    267 *
    268 * Not intended for public subclassing.
    269 *
    270 * @stable ICU 64
    271 */
    272 class U_I18N_API FormattedRelativeDateTime : public UMemory, public FormattedValue {
    273  public:
    274    /**
    275     * Default constructor; makes an empty FormattedRelativeDateTime.
    276     * @stable ICU 64
    277     */
    278    FormattedRelativeDateTime() : fData(nullptr), fErrorCode(U_INVALID_STATE_ERROR) {}
    279 
    280    /**
    281     * Move constructor: Leaves the source FormattedRelativeDateTime in an undefined state.
    282     * @stable ICU 64
    283     */
    284    FormattedRelativeDateTime(FormattedRelativeDateTime&& src) noexcept;
    285 
    286    /**
    287     * Destruct an instance of FormattedRelativeDateTime.
    288     * @stable ICU 64
    289     */
    290    virtual ~FormattedRelativeDateTime() override;
    291 
    292    /** Copying not supported; use move constructor instead. */
    293    FormattedRelativeDateTime(const FormattedRelativeDateTime&) = delete;
    294 
    295    /** Copying not supported; use move assignment instead. */
    296    FormattedRelativeDateTime& operator=(const FormattedRelativeDateTime&) = delete;
    297 
    298    /**
    299     * Move assignment: Leaves the source FormattedRelativeDateTime in an undefined state.
    300     * @stable ICU 64
    301     */
    302    FormattedRelativeDateTime& operator=(FormattedRelativeDateTime&& src) noexcept;
    303 
    304    /** @copydoc FormattedValue::toString() */
    305    UnicodeString toString(UErrorCode& status) const override;
    306 
    307    /** @copydoc FormattedValue::toTempString() */
    308    UnicodeString toTempString(UErrorCode& status) const override;
    309 
    310    /** @copydoc FormattedValue::appendTo() */
    311    Appendable &appendTo(Appendable& appendable, UErrorCode& status) const override;
    312 
    313    /** @copydoc FormattedValue::nextPosition() */
    314    UBool nextPosition(ConstrainedFieldPosition& cfpos, UErrorCode& status) const override;
    315 
    316  private:
    317    FormattedRelativeDateTimeData *fData;
    318    UErrorCode fErrorCode;
    319    explicit FormattedRelativeDateTime(FormattedRelativeDateTimeData *results)
    320        : fData(results), fErrorCode(U_ZERO_ERROR) {}
    321    explicit FormattedRelativeDateTime(UErrorCode errorCode)
    322        : fData(nullptr), fErrorCode(errorCode) {}
    323    friend class RelativeDateTimeFormatter;
    324 };
    325 
    326 /**
    327 * Formats simple relative dates. There are two types of relative dates that
    328 * it handles:
    329 * <ul>
    330 *   <li>relative dates with a quantity e.g "in 5 days"</li>
    331 *   <li>relative dates without a quantity e.g "next Tuesday"</li>
    332 * </ul>
    333 * <p>
    334 * This API is very basic and is intended to be a building block for more
    335 * fancy APIs. The caller tells it exactly what to display in a locale
    336 * independent way. While this class automatically provides the correct plural
    337 * forms, the grammatical form is otherwise as neutral as possible. It is the
    338 * caller's responsibility to handle cut-off logic such as deciding between
    339 * displaying "in 7 days" or "in 1 week." This API supports relative dates
    340 * involving one single unit. This API does not support relative dates
    341 * involving compound units,
    342 * e.g "in 5 days and 4 hours" nor does it support parsing.
    343 * <p>
    344 * This class is mostly thread safe and immutable with the following caveats:
    345 * 1. The assignment operator violates Immutability. It must not be used
    346 *    concurrently with other operations.
    347 * 2. Caller must not hold onto adopted pointers.
    348 * <p>
    349 * This class is not intended for public subclassing.
    350 * <p>
    351 * Here are some examples of use:
    352 * <blockquote>
    353 * <pre>
    354 * UErrorCode status = U_ZERO_ERROR;
    355 * UnicodeString appendTo;
    356 * RelativeDateTimeFormatter fmt(status);
    357 * // Appends "in 1 day"
    358 * fmt.format(
    359 *     1, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_DAYS, appendTo, status);
    360 * // Appends "in 3 days"
    361 * fmt.format(
    362 *     3, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_DAYS, appendTo, status);
    363 * // Appends "3.2 years ago"
    364 * fmt.format(
    365 *     3.2, UDAT_DIRECTION_LAST, UDAT_RELATIVE_YEARS, appendTo, status);
    366 * // Appends "last Sunday"
    367 * fmt.format(UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_SUNDAY, appendTo, status);
    368 * // Appends "this Sunday"
    369 * fmt.format(UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_SUNDAY, appendTo, status);
    370 * // Appends "next Sunday"
    371 * fmt.format(UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_SUNDAY, appendTo, status);
    372 * // Appends "Sunday"
    373 * fmt.format(UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_SUNDAY, appendTo, status);
    374 *
    375 * // Appends "yesterday"
    376 * fmt.format(UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_DAY, appendTo, status);
    377 * // Appends "today"
    378 * fmt.format(UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_DAY, appendTo, status);
    379 * // Appends "tomorrow"
    380 * fmt.format(UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_DAY, appendTo, status);
    381 * // Appends "now"
    382 * fmt.format(UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_NOW, appendTo, status);
    383 *
    384 * </pre>
    385 * </blockquote>
    386 * <p>
    387 * The UDateRelativeDateTimeFormatterStyle parameter allows selection of
    388 * different length styles: LONG ("3 seconds ago"), SHORT ("3 sec. ago"),
    389 * NARROW ("3s ago"). In the future, we may add more forms, such as
    390 * relative day periods ("yesterday afternoon"), etc.
    391 *
    392 * The RelativeDateTimeFormatter class is not intended for public subclassing.
    393 *
    394 * @stable ICU 53
    395 */
    396 class U_I18N_API_CLASS RelativeDateTimeFormatter : public UObject {
    397 public:
    398 
    399    /**
    400     * Create RelativeDateTimeFormatter with default locale.
    401     * @stable ICU 53
    402     */
    403    U_I18N_API RelativeDateTimeFormatter(UErrorCode& status);
    404 
    405    /**
    406     * Create RelativeDateTimeFormatter with given locale.
    407     * @stable ICU 53
    408     */
    409    U_I18N_API RelativeDateTimeFormatter(const Locale& locale, UErrorCode& status);
    410 
    411    /**
    412     * Create RelativeDateTimeFormatter with given locale and NumberFormat.
    413     *
    414     * @param locale the locale
    415     * @param nfToAdopt Constructed object takes ownership of this pointer.
    416     *   It is an error for caller to delete this pointer or change its
    417     *   contents after calling this constructor.
    418     * @param status Any error is returned here.
    419     * @stable ICU 53
    420     */
    421    U_I18N_API RelativeDateTimeFormatter(
    422        const Locale& locale, NumberFormat *nfToAdopt, UErrorCode& status);
    423 
    424    /**
    425     * Create RelativeDateTimeFormatter with given locale, NumberFormat,
    426     * and capitalization context.
    427     *
    428     * @param locale the locale
    429     * @param nfToAdopt Constructed object takes ownership of this pointer.
    430     *   It is an error for caller to delete this pointer or change its
    431     *   contents after calling this constructor. Caller may pass nullptr for
    432     *   this argument if they want default number format behavior.
    433     * @param style the format style. The UDAT_RELATIVE bit field has no effect.
    434     * @param capitalizationContext A value from UDisplayContext that pertains to
    435     * capitalization.
    436     * @param status Any error is returned here.
    437     * @stable ICU 54
    438     */
    439    U_I18N_API RelativeDateTimeFormatter(
    440            const Locale& locale,
    441            NumberFormat *nfToAdopt,
    442            UDateRelativeDateTimeFormatterStyle style,
    443            UDisplayContext capitalizationContext,
    444            UErrorCode& status);
    445 
    446    /**
    447     * Copy constructor.
    448     * @stable ICU 53
    449     */
    450    U_I18N_API RelativeDateTimeFormatter(const RelativeDateTimeFormatter& other);
    451 
    452    /**
    453     * Assignment operator.
    454     * @stable ICU 53
    455     */
    456    U_I18N_API RelativeDateTimeFormatter& operator=(
    457            const RelativeDateTimeFormatter& other);
    458 
    459    /**
    460     * Destructor.
    461     * @stable ICU 53
    462     */
    463    U_I18N_API virtual ~RelativeDateTimeFormatter();
    464 
    465    /**
    466     * Formats a relative date with a quantity such as "in 5 days" or
    467     * "3 months ago"
    468     *
    469     * This method returns a String. To get more information about the
    470     * formatting result, use formatToValue().
    471     *
    472     * @param quantity The numerical amount e.g 5. This value is formatted
    473     * according to this object's NumberFormat object.
    474     * @param direction NEXT means a future relative date; LAST means a past
    475     * relative date. If direction is anything else, this method sets
    476     * status to U_ILLEGAL_ARGUMENT_ERROR.
    477     * @param unit the unit e.g day? month? year?
    478     * @param appendTo The string to which the formatted result will be
    479     *  appended
    480     * @param status ICU error code returned here.
    481     * @return appendTo
    482     * @stable ICU 53
    483     */
    484    U_I18N_API UnicodeString& format(
    485            double quantity,
    486            UDateDirection direction,
    487            UDateRelativeUnit unit,
    488            UnicodeString& appendTo,
    489            UErrorCode& status) const;
    490 
    491    /**
    492     * Formats a relative date with a quantity such as "in 5 days" or
    493     * "3 months ago"
    494     *
    495     * This method returns a FormattedRelativeDateTime, which exposes more
    496     * information than the String returned by format().
    497     *
    498     * @param quantity The numerical amount e.g 5. This value is formatted
    499     * according to this object's NumberFormat object.
    500     * @param direction NEXT means a future relative date; LAST means a past
    501     * relative date. If direction is anything else, this method sets
    502     * status to U_ILLEGAL_ARGUMENT_ERROR.
    503     * @param unit the unit e.g day? month? year?
    504     * @param status ICU error code returned here.
    505     * @return The formatted relative datetime
    506     * @stable ICU 64
    507     */
    508    U_I18N_API FormattedRelativeDateTime formatToValue(
    509            double quantity,
    510            UDateDirection direction,
    511            UDateRelativeUnit unit,
    512            UErrorCode& status) const;
    513 
    514    /**
    515     * Formats a relative date without a quantity.
    516     *
    517     * This method returns a String. To get more information about the
    518     * formatting result, use formatToValue().
    519     *
    520     * @param direction NEXT, LAST, THIS, etc.
    521     * @param unit e.g SATURDAY, DAY, MONTH
    522     * @param appendTo The string to which the formatted result will be
    523     *  appended. If the value of direction is documented as not being fully
    524     *  supported in all locales then this method leaves appendTo unchanged if
    525     *  no format string is available.
    526     * @param status ICU error code returned here.
    527     * @return appendTo
    528     * @stable ICU 53
    529     */
    530    U_I18N_API UnicodeString& format(
    531            UDateDirection direction,
    532            UDateAbsoluteUnit unit,
    533            UnicodeString& appendTo,
    534            UErrorCode& status) const;
    535 
    536    /**
    537     * Formats a relative date without a quantity.
    538     *
    539     * This method returns a FormattedRelativeDateTime, which exposes more
    540     * information than the String returned by format().
    541     *
    542     * If the string is not available in the requested locale, the return
    543     * value will be empty (calling toString will give an empty string).
    544     *
    545     * @param direction NEXT, LAST, THIS, etc.
    546     * @param unit e.g SATURDAY, DAY, MONTH
    547     * @param status ICU error code returned here.
    548     * @return The formatted relative datetime
    549     * @stable ICU 64
    550     */
    551    U_I18N_API FormattedRelativeDateTime formatToValue(
    552            UDateDirection direction,
    553            UDateAbsoluteUnit unit,
    554            UErrorCode& status) const;
    555 
    556    /**
    557     * Format a combination of URelativeDateTimeUnit and numeric offset
    558     * using a numeric style, e.g. "1 week ago", "in 1 week",
    559     * "5 weeks ago", "in 5 weeks".
    560     *
    561     * This method returns a String. To get more information about the
    562     * formatting result, use formatNumericToValue().
    563     *
    564     * @param offset    The signed offset for the specified unit. This
    565     *                  will be formatted according to this object's
    566     *                  NumberFormat object.
    567     * @param unit      The unit to use when formatting the relative
    568     *                  date, e.g. UDAT_REL_UNIT_WEEK,
    569     *                  UDAT_REL_UNIT_FRIDAY.
    570     * @param appendTo  The string to which the formatted result will be
    571     *                  appended.
    572     * @param status    ICU error code returned here.
    573     * @return          appendTo
    574     * @stable ICU 57
    575     */
    576    U_I18N_API UnicodeString& formatNumeric(
    577            double offset,
    578            URelativeDateTimeUnit unit,
    579            UnicodeString& appendTo,
    580            UErrorCode& status) const;
    581 
    582    /**
    583     * Format a combination of URelativeDateTimeUnit and numeric offset
    584     * using a numeric style, e.g. "1 week ago", "in 1 week",
    585     * "5 weeks ago", "in 5 weeks".
    586     *
    587     * This method returns a FormattedRelativeDateTime, which exposes more
    588     * information than the String returned by formatNumeric().
    589     *
    590     * @param offset    The signed offset for the specified unit. This
    591     *                  will be formatted according to this object's
    592     *                  NumberFormat object.
    593     * @param unit      The unit to use when formatting the relative
    594     *                  date, e.g. UDAT_REL_UNIT_WEEK,
    595     *                  UDAT_REL_UNIT_FRIDAY.
    596     * @param status    ICU error code returned here.
    597     * @return          The formatted relative datetime
    598     * @stable ICU 64
    599     */
    600    U_I18N_API FormattedRelativeDateTime formatNumericToValue(
    601            double offset,
    602            URelativeDateTimeUnit unit,
    603            UErrorCode& status) const;
    604 
    605    /**
    606     * Format a combination of URelativeDateTimeUnit and numeric offset
    607     * using a text style if possible, e.g. "last week", "this week",
    608     * "next week", "yesterday", "tomorrow". Falls back to numeric
    609     * style if no appropriate text term is available for the specified
    610     * offset in the object's locale.
    611     *
    612     * This method returns a String. To get more information about the
    613     * formatting result, use formatToValue().
    614     *
    615     * @param offset    The signed offset for the specified unit.
    616     * @param unit      The unit to use when formatting the relative
    617     *                  date, e.g. UDAT_REL_UNIT_WEEK,
    618     *                  UDAT_REL_UNIT_FRIDAY.
    619     * @param appendTo  The string to which the formatted result will be
    620     *                  appended.
    621     * @param status    ICU error code returned here.
    622     * @return          appendTo
    623     * @stable ICU 57
    624     */
    625    U_I18N_API UnicodeString& format(
    626            double offset,
    627            URelativeDateTimeUnit unit,
    628            UnicodeString& appendTo,
    629            UErrorCode& status) const;
    630 
    631    /**
    632     * Format a combination of URelativeDateTimeUnit and numeric offset
    633     * using a text style if possible, e.g. "last week", "this week",
    634     * "next week", "yesterday", "tomorrow". Falls back to numeric
    635     * style if no appropriate text term is available for the specified
    636     * offset in the object's locale.
    637     *
    638     * This method returns a FormattedRelativeDateTime, which exposes more
    639     * information than the String returned by format().
    640     *
    641     * @param offset    The signed offset for the specified unit.
    642     * @param unit      The unit to use when formatting the relative
    643     *                  date, e.g. UDAT_REL_UNIT_WEEK,
    644     *                  UDAT_REL_UNIT_FRIDAY.
    645     * @param status    ICU error code returned here.
    646     * @return          The formatted relative datetime
    647     * @stable ICU 64
    648     */
    649    U_I18N_API FormattedRelativeDateTime formatToValue(
    650            double offset,
    651            URelativeDateTimeUnit unit,
    652            UErrorCode& status) const;
    653 
    654    /**
    655     * Combines a relative date string and a time string in this object's
    656     * locale. This is done with the same date-time separator used for the
    657     * default calendar in this locale.
    658     *
    659     * @param relativeDateString the relative date, e.g 'yesterday'
    660     * @param timeString the time e.g '3:45'
    661     * @param appendTo concatenated date and time appended here
    662     * @param status ICU error code returned here.
    663     * @return appendTo
    664     * @stable ICU 53
    665     */
    666    U_I18N_API UnicodeString& combineDateAndTime(
    667            const UnicodeString& relativeDateString,
    668            const UnicodeString& timeString,
    669            UnicodeString& appendTo,
    670            UErrorCode& status) const;
    671 
    672    /**
    673     * Returns the NumberFormat this object is using.
    674     *
    675     * @stable ICU 53
    676     */
    677    U_I18N_API const NumberFormat& getNumberFormat() const;
    678 
    679    /**
    680     * Returns the capitalization context.
    681     *
    682     * @stable ICU 54
    683     */
    684    U_I18N_API UDisplayContext getCapitalizationContext() const;
    685 
    686    /**
    687     * Returns the format style.
    688     *
    689     * @stable ICU 54
    690     */
    691    U_I18N_API UDateRelativeDateTimeFormatterStyle getFormatStyle() const;
    692 
    693 private:
    694    const RelativeDateTimeCacheData* fCache;
    695    const SharedNumberFormat *fNumberFormat;
    696    const SharedPluralRules *fPluralRules;
    697    UDateRelativeDateTimeFormatterStyle fStyle;
    698    UDisplayContext fContext;
    699 #if !UCONFIG_NO_BREAK_ITERATION
    700    const SharedBreakIterator *fOptBreakIterator;
    701 #else
    702    std::nullptr_t fOptBreakIterator = nullptr;
    703 #endif // !UCONFIG_NO_BREAK_ITERATION
    704    Locale fLocale;
    705    void init(
    706            NumberFormat *nfToAdopt,
    707 #if !UCONFIG_NO_BREAK_ITERATION
    708            BreakIterator *brkIter,
    709 #else
    710            std::nullptr_t,
    711 #endif // !UCONFIG_NO_BREAK_ITERATION
    712            UErrorCode &status);
    713    UnicodeString& adjustForContext(UnicodeString &) const;
    714    UBool checkNoAdjustForContext(UErrorCode& status) const;
    715 
    716    template<typename F, typename... Args>
    717    UnicodeString& doFormat(
    718            F callback,
    719            UnicodeString& appendTo,
    720            UErrorCode& status,
    721            Args... args) const;
    722 
    723    template<typename F, typename... Args>
    724    FormattedRelativeDateTime doFormatToValue(
    725            F callback,
    726            UErrorCode& status,
    727            Args... args) const;
    728 
    729    void formatImpl(
    730            double quantity,
    731            UDateDirection direction,
    732            UDateRelativeUnit unit,
    733            FormattedRelativeDateTimeData& output,
    734            UErrorCode& status) const;
    735    void formatAbsoluteImpl(
    736            UDateDirection direction,
    737            UDateAbsoluteUnit unit,
    738            FormattedRelativeDateTimeData& output,
    739            UErrorCode& status) const;
    740    void formatNumericImpl(
    741            double offset,
    742            URelativeDateTimeUnit unit,
    743            FormattedRelativeDateTimeData& output,
    744            UErrorCode& status) const;
    745    void formatRelativeImpl(
    746            double offset,
    747            URelativeDateTimeUnit unit,
    748            FormattedRelativeDateTimeData& output,
    749            UErrorCode& status) const;
    750 };
    751 
    752 U_NAMESPACE_END
    753 
    754 #endif /* !UCONFIG_NO_FORMATTING */
    755 
    756 #endif /* U_SHOW_CPLUSPLUS_API */
    757 
    758 #endif /* __RELDATEFMT_H */