// // © 2016 and later: Unicode, Inc. and others.
// // License & terms of use: http://www.unicode.org/copyright.html
// /*
// *****************************************************************************************
// * Copyright (C) 2016, International Business Machines
// * Corporation and others. All Rights Reserved.
// *****************************************************************************************
// */

// #ifndef URELDATEFMT_H
// #define URELDATEFMT_H

// #include "unicode/utypes.h"

// #if !UCONFIG_NO_FORMATTING && !UCONFIG_NO_BREAK_ITERATION

// #include "unicode/unum.h"
// #include "unicode/udisplaycontext.h"
// #include "unicode/localpointer.h"
// #include "unicode/uformattedvalue.h"

// /**
//  * \file
//  * \brief C API: URelativeDateTimeFormatter, relative date formatting of unit + numeric offset.
//  *
//  * Provides simple formatting of relative dates, in two ways
//  * <ul>
//  *   <li>relative dates with a quantity e.g "in 5 days"</li>
//  *   <li>relative dates without a quantity e.g "next Tuesday"</li>
//  * </ul>
//  * <p>
//  * This does not provide compound formatting for multiple units,
//  * other than the ability to combine a time string with a relative date,
//  * as in "next Tuesday at 3:45 PM". It also does not provide support
//  * for determining which unit to use, such as deciding between "in 7 days"
//  * and "in 1 week".
//  *
//  * @stable ICU 57
//  */

// /**
//  * The formatting style
//  * @stable ICU 54
//  */
// typedef enum UDateRelativeDateTimeFormatterStyle {
//   /**
//    * Everything spelled out.
//    * @stable ICU 54
//    */
//   UDAT_STYLE_LONG,

//   /**
//    * Abbreviations used when possible.
//    * @stable ICU 54
//    */
//   UDAT_STYLE_SHORT,

//   /**
//    * Use the shortest possible form.
//    * @stable ICU 54
//    */
//   UDAT_STYLE_NARROW,

// #ifndef U_HIDE_DEPRECATED_API
//     /**
//      * One more than the highest normal UDateRelativeDateTimeFormatterStyle value.
//      * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420.
//      */
//     UDAT_STYLE_COUNT
// #endif  /* U_HIDE_DEPRECATED_API */
// } UDateRelativeDateTimeFormatterStyle;

// /**
//  * Represents the unit for formatting a relative date. e.g "in 5 days"
//  * or "next year"
//  * @stable ICU 57
//  */
// typedef enum URelativeDateTimeUnit {
//     /**
//      * Specifies that relative unit is year, e.g. "last year",
//      * "in 5 years".
//      * @stable ICU 57
//      */
//     UDAT_REL_UNIT_YEAR,
//     /**
//      * Specifies that relative unit is quarter, e.g. "last quarter",
//      * "in 5 quarters".
//      * @stable ICU 57
//      */
//     UDAT_REL_UNIT_QUARTER,
//     /**
//      * Specifies that relative unit is month, e.g. "last month",
//      * "in 5 months".
//      * @stable ICU 57
//      */
//     UDAT_REL_UNIT_MONTH,
//     /**
//      * Specifies that relative unit is week, e.g. "last week",
//      * "in 5 weeks".
//      * @stable ICU 57
//      */
//     UDAT_REL_UNIT_WEEK,
//     /**
//      * Specifies that relative unit is day, e.g. "yesterday",
//      * "in 5 days".
//      * @stable ICU 57
//      */
//     UDAT_REL_UNIT_DAY,
//     /**
//      * Specifies that relative unit is hour, e.g. "1 hour ago",
//      * "in 5 hours".
//      * @stable ICU 57
//      */
//     UDAT_REL_UNIT_HOUR,
//     /**
//      * Specifies that relative unit is minute, e.g. "1 minute ago",
//      * "in 5 minutes".
//      * @stable ICU 57
//      */
//     UDAT_REL_UNIT_MINUTE,
//     /**
//      * Specifies that relative unit is second, e.g. "1 second ago",
//      * "in 5 seconds".
//      * @stable ICU 57
//      */
//     UDAT_REL_UNIT_SECOND,
//     /**
//      * Specifies that relative unit is Sunday, e.g. "last Sunday",
//      * "this Sunday", "next Sunday", "in 5 Sundays".
//      * @stable ICU 57
//      */
//     UDAT_REL_UNIT_SUNDAY,
//     /**
//      * Specifies that relative unit is Monday, e.g. "last Monday",
//      * "this Monday", "next Monday", "in 5 Mondays".
//      * @stable ICU 57
//      */
//     UDAT_REL_UNIT_MONDAY,
//     /**
//      * Specifies that relative unit is Tuesday, e.g. "last Tuesday",
//      * "this Tuesday", "next Tuesday", "in 5 Tuesdays".
//      * @stable ICU 57
//      */
//     UDAT_REL_UNIT_TUESDAY,
//     /**
//      * Specifies that relative unit is Wednesday, e.g. "last Wednesday",
//      * "this Wednesday", "next Wednesday", "in 5 Wednesdays".
//      * @stable ICU 57
//      */
//     UDAT_REL_UNIT_WEDNESDAY,
//     /**
//      * Specifies that relative unit is Thursday, e.g. "last Thursday",
//      * "this Thursday", "next Thursday", "in 5 Thursdays".
//      * @stable ICU 57
//      */
//     UDAT_REL_UNIT_THURSDAY,
//     /**
//      * Specifies that relative unit is Friday, e.g. "last Friday",
//      * "this Friday", "next Friday", "in 5 Fridays".
//      * @stable ICU 57
//      */
//     UDAT_REL_UNIT_FRIDAY,
//     /**
//      * Specifies that relative unit is Saturday, e.g. "last Saturday",
//      * "this Saturday", "next Saturday", "in 5 Saturdays".
//      * @stable ICU 57
//      */
//     UDAT_REL_UNIT_SATURDAY,
// #ifndef U_HIDE_DEPRECATED_API
//     /**
//      * One more than the highest normal URelativeDateTimeUnit value.
//      * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420.
//      */
//     UDAT_REL_UNIT_COUNT
// #endif  /* U_HIDE_DEPRECATED_API */
// } URelativeDateTimeUnit;

// #ifndef U_HIDE_DRAFT_API
// /**
//  * FieldPosition and UFieldPosition selectors for format fields
//  * defined by RelativeDateTimeFormatter.
//  * @draft ICU 64
//  */
// typedef enum URelativeDateTimeFormatterField {
//     /**
//      * Represents a literal text string, like "tomorrow" or "days ago".
//      * @draft ICU 64
//      */
//     UDAT_REL_LITERAL_FIELD,
//     /**
//      * Represents a number quantity, like "3" in "3 days ago".
//      * @draft ICU 64
//      */
//     UDAT_REL_NUMERIC_FIELD,
// } URelativeDateTimeFormatterField;
// #endif // U_HIDE_DRAFT_API


// /**
//  * Opaque URelativeDateTimeFormatter object for use in C programs.
//  * @stable ICU 57
//  */
// struct URelativeDateTimeFormatter;
// typedef struct URelativeDateTimeFormatter URelativeDateTimeFormatter;  /**< C typedef for struct URelativeDateTimeFormatter. @stable ICU 57 */


// /**
//  * Open a new URelativeDateTimeFormatter object for a given locale using the
//  * specified width and capitalizationContext, along with a number formatter
//  * (if desired) to override the default formatter that would be used for
//  * display of numeric field offsets. The default formatter typically rounds
//  * toward 0 and has a minimum of 0 fraction digits and a maximum of 3
//  * fraction digits (i.e. it will show as many decimal places as necessary
//  * up to 3, without showing trailing 0s).
//  *
//  * @param locale
//  *          The locale
//  * @param nfToAdopt
//  *          A number formatter to set for this URelativeDateTimeFormatter
//  *          object (instead of the default decimal formatter). Ownership of
//  *          this UNumberFormat object will pass to the URelativeDateTimeFormatter
//  *          object (the URelativeDateTimeFormatter adopts the UNumberFormat),
//  *          which becomes responsible for closing it. If the caller wishes to
//  *          retain ownership of the UNumberFormat object, the caller must clone
//  *          it (with unum_clone) and pass the clone to ureldatefmt_open. May be
//  *          NULL to use the default decimal formatter.
//  * @param width
//  *          The width - wide, short, narrow, etc.
//  * @param capitalizationContext
//  *          A value from UDisplayContext that pertains to capitalization, e.g.
//  *          UDISPCTX_CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE.
//  * @param status
//  *          A pointer to a UErrorCode to receive any errors.
//  * @return
//  *          A pointer to a URelativeDateTimeFormatter object for the specified locale,
//  *          or NULL if an error occurred.
//  * @stable ICU 57
//  */
// U_STABLE URelativeDateTimeFormatter* U_EXPORT2
// ureldatefmt_open( const char*          locale,
//                   UNumberFormat*       nfToAdopt,
//                   UDateRelativeDateTimeFormatterStyle width,
//                   UDisplayContext      capitalizationContext,
//                   UErrorCode*          status );

// /**
//  * Close a URelativeDateTimeFormatter object. Once closed it may no longer be used.
//  * @param reldatefmt
//  *            The URelativeDateTimeFormatter object to close.
//  * @stable ICU 57
//  */
// U_STABLE void U_EXPORT2
// ureldatefmt_close(URelativeDateTimeFormatter *reldatefmt);

// #ifndef U_HIDE_DRAFT_API
// struct UFormattedRelativeDateTime;
// /**
//  * Opaque struct to contain the results of a URelativeDateTimeFormatter operation.
//  * @draft ICU 64
//  */
// typedef struct UFormattedRelativeDateTime UFormattedRelativeDateTime;

// /**
//  * Creates an object to hold the result of a URelativeDateTimeFormatter
//  * operation. The object can be used repeatedly; it is cleared whenever
//  * passed to a format function.
//  *
//  * @param ec Set if an error occurs.
//  * @return A pointer needing ownership.
//  * @draft ICU 64
//  */
// U_DRAFT UFormattedRelativeDateTime* U_EXPORT2
// ureldatefmt_openResult(UErrorCode* ec);

// /**
//  * Returns a representation of a UFormattedRelativeDateTime as a UFormattedValue,
//  * which can be subsequently passed to any API requiring that type.
//  *
//  * The returned object is owned by the UFormattedRelativeDateTime and is valid
//  * only as long as the UFormattedRelativeDateTime is present and unchanged in memory.
//  *
//  * You can think of this method as a cast between types.
//  *
//  * @param ufrdt The object containing the formatted string.
//  * @param ec Set if an error occurs.
//  * @return A UFormattedValue owned by the input object.
//  * @draft ICU 64
//  */
// U_DRAFT const UFormattedValue* U_EXPORT2
// ureldatefmt_resultAsValue(const UFormattedRelativeDateTime* ufrdt, UErrorCode* ec);

// /**
//  * Releases the UFormattedRelativeDateTime created by ureldatefmt_openResult.
//  *
//  * @param ufrdt The object to release.
//  * @draft ICU 64
//  */
// U_DRAFT void U_EXPORT2
// ureldatefmt_closeResult(UFormattedRelativeDateTime* ufrdt);
// #endif  /* U_HIDE_DRAFT_API */


// #if U_SHOW_CPLUSPLUS_API

// U_NAMESPACE_BEGIN

// /**
//  * \class LocalURelativeDateTimeFormatterPointer
//  * "Smart pointer" class, closes a URelativeDateTimeFormatter via ureldatefmt_close().
//  * For most methods see the LocalPointerBase base class.
//  *
//  * @see LocalPointerBase
//  * @see LocalPointer
//  * @stable ICU 57
//  */
// U_DEFINE_LOCAL_OPEN_POINTER(LocalURelativeDateTimeFormatterPointer, URelativeDateTimeFormatter, ureldatefmt_close);

// #ifndef U_HIDE_DRAFT_API
// /**
//  * \class LocalUFormattedRelativeDateTimePointer
//  * "Smart pointer" class, closes a UFormattedRelativeDateTime via ureldatefmt_closeResult().
//  * For most methods see the LocalPointerBase base class.
//  *
//  * @see LocalPointerBase
//  * @see LocalPointer
//  * @draft ICU 64
//  */
// U_DEFINE_LOCAL_OPEN_POINTER(LocalUFormattedRelativeDateTimePointer, UFormattedRelativeDateTime, ureldatefmt_closeResult);
// #endif  /* U_HIDE_DRAFT_API */

// U_NAMESPACE_END

// #endif

// /**
//  * Format a combination of URelativeDateTimeUnit and numeric
//  * offset using a numeric style, e.g. "1 week ago", "in 1 week",
//  * "5 weeks ago", "in 5 weeks".
//  *
//  * @param reldatefmt
//  *          The URelativeDateTimeFormatter object specifying the
//  *          format conventions.
//  * @param offset
//  *          The signed offset for the specified unit. This will
//  *          be formatted according to this object's UNumberFormat
//  *          object.
//  * @param unit
//  *          The unit to use when formatting the relative
//  *          date, e.g. UDAT_REL_UNIT_WEEK, UDAT_REL_UNIT_FRIDAY.
//  * @param result
//  *          A pointer to a buffer to receive the formatted result.
//  * @param resultCapacity
//  *          The maximum size of result.
//  * @param status
//  *          A pointer to a UErrorCode to receive any errors. In
//  *          case of error status, the contents of result are
//  *          undefined.
//  * @return
//  *          The length of the formatted result; may be greater
//  *          than resultCapacity, in which case an error is returned.
//  * @stable ICU 57
//  */
// U_STABLE int32_t U_EXPORT2
// ureldatefmt_formatNumeric( const URelativeDateTimeFormatter* reldatefmt,
//                     double                offset,
//                     URelativeDateTimeUnit unit,
//                     UChar*                result,
//                     int32_t               resultCapacity,
//                     UErrorCode*           status);

// #ifndef U_HIDE_DRAFT_API
// /**
//  * Format a combination of URelativeDateTimeUnit and numeric
//  * offset using a numeric style, e.g. "1 week ago", "in 1 week",
//  * "5 weeks ago", "in 5 weeks".
//  *
//  * @param reldatefmt
//  *          The URelativeDateTimeFormatter object specifying the
//  *          format conventions.
//  * @param offset
//  *          The signed offset for the specified unit. This will
//  *          be formatted according to this object's UNumberFormat
//  *          object.
//  * @param unit
//  *          The unit to use when formatting the relative
//  *          date, e.g. UDAT_REL_UNIT_WEEK, UDAT_REL_UNIT_FRIDAY.
//  * @param result
//  *          A pointer to a UFormattedRelativeDateTime to populate.
//  * @param status
//  *          A pointer to a UErrorCode to receive any errors. In
//  *          case of error status, the contents of result are
//  *          undefined.
//  * @draft ICU 64
//  */
// U_DRAFT void U_EXPORT2
// ureldatefmt_formatNumericToResult(
//     const URelativeDateTimeFormatter* reldatefmt,
//     double                            offset,
//     URelativeDateTimeUnit             unit,
//     UFormattedRelativeDateTime*       result,
//     UErrorCode*                       status);
// #endif  /* U_HIDE_DRAFT_API */

// /**
//  * Format a combination of URelativeDateTimeUnit and numeric offset
//  * using a text style if possible, e.g. "last week", "this week",
//  * "next week", "yesterday", "tomorrow". Falls back to numeric
//  * style if no appropriate text term is available for the specified
//  * offset in the object's locale.
//  *
//  * @param reldatefmt
//  *          The URelativeDateTimeFormatter object specifying the
//  *          format conventions.
//  * @param offset
//  *          The signed offset for the specified unit.
//  * @param unit
//  *          The unit to use when formatting the relative
//  *          date, e.g. UDAT_REL_UNIT_WEEK, UDAT_REL_UNIT_FRIDAY.
//  * @param result
//  *          A pointer to a buffer to receive the formatted result.
//  * @param resultCapacity
//  *          The maximum size of result.
//  * @param status
//  *          A pointer to a UErrorCode to receive any errors. In
//  *          case of error status, the contents of result are
//  *          undefined.
//  * @return
//  *          The length of the formatted result; may be greater
//  *          than resultCapacity, in which case an error is returned.
//  * @stable ICU 57
//  */
// U_STABLE int32_t U_EXPORT2
// ureldatefmt_format( const URelativeDateTimeFormatter* reldatefmt,
//                     double                offset,
//                     URelativeDateTimeUnit unit,
//                     UChar*                result,
//                     int32_t               resultCapacity,
//                     UErrorCode*           status);

// #ifndef U_HIDE_DRAFT_API
// /**
//  * Format a combination of URelativeDateTimeUnit and numeric offset
//  * using a text style if possible, e.g. "last week", "this week",
//  * "next week", "yesterday", "tomorrow". Falls back to numeric
//  * style if no appropriate text term is available for the specified
//  * offset in the object's locale.
//  *
//  * This method populates a UFormattedRelativeDateTime, which exposes more
//  * information than the string populated by format().
//  *
//  * @param reldatefmt
//  *          The URelativeDateTimeFormatter object specifying the
//  *          format conventions.
//  * @param offset
//  *          The signed offset for the specified unit.
//  * @param unit
//  *          The unit to use when formatting the relative
//  *          date, e.g. UDAT_REL_UNIT_WEEK, UDAT_REL_UNIT_FRIDAY.
//  * @param result
//  *          A pointer to a UFormattedRelativeDateTime to populate.
//  * @param status
//  *          A pointer to a UErrorCode to receive any errors. In
//  *          case of error status, the contents of result are
//  *          undefined.
//  * @draft ICU 64
//  */
// U_DRAFT void U_EXPORT2
// ureldatefmt_formatToResult(
//     const URelativeDateTimeFormatter* reldatefmt,
//     double                            offset,
//     URelativeDateTimeUnit             unit,
//     UFormattedRelativeDateTime*       result,
//     UErrorCode*                       status);
// #endif  /* U_HIDE_DRAFT_API */

// /**
//  * Combines a relative date string and a time string in this object's
//  * locale. This is done with the same date-time separator used for the
//  * default calendar in this locale to produce a result such as
//  * "yesterday at 3:45 PM".
//  *
//  * @param reldatefmt
//  *          The URelativeDateTimeFormatter object specifying the format conventions.
//  * @param relativeDateString
//  *          The relative date string.
//  * @param relativeDateStringLen
//  *          The length of relativeDateString; may be -1 if relativeDateString
//  *          is zero-terminated.
//  * @param timeString
//  *          The time string.
//  * @param timeStringLen
//  *          The length of timeString; may be -1 if timeString is zero-terminated.
//  * @param result
//  *          A pointer to a buffer to receive the formatted result.
//  * @param resultCapacity
//  *          The maximum size of result.
//  * @param status
//  *          A pointer to a UErrorCode to receive any errors. In case of error status,
//  *          the contents of result are undefined.
//  * @return
//  *          The length of the formatted result; may be greater than resultCapacity,
//  *          in which case an error is returned.
//  * @stable ICU 57
//  */
// U_STABLE int32_t U_EXPORT2
// ureldatefmt_combineDateAndTime( const URelativeDateTimeFormatter* reldatefmt,
//                     const UChar *     relativeDateString,
//                     int32_t           relativeDateStringLen,
//                     const UChar *     timeString,
//                     int32_t           timeStringLen,
//                     UChar*            result,
//                     int32_t           resultCapacity,
//                     UErrorCode*       status );

// #endif /* !UCONFIG_NO_FORMATTING && !UCONFIG_NO_BREAK_ITERATION */

// #endif
