• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #ifndef U_HIDE_DRAFT_API
179     /**
180      * Hour
181      * @draft ICU 65
182      */
183     UDAT_ABSOLUTE_HOUR,
184 
185     /**
186      * Minute
187      * @draft ICU 65
188      */
189     UDAT_ABSOLUTE_MINUTE,
190 #endif // U_HIDE_DRAFT_API
191 
192 #ifndef U_HIDE_DEPRECATED_API
193     /**
194      * One more than the highest normal UDateAbsoluteUnit value.
195      * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420.
196      */
197     UDAT_ABSOLUTE_UNIT_COUNT = UDAT_ABSOLUTE_NOW + 4
198 #endif  // U_HIDE_DEPRECATED_API
199 } UDateAbsoluteUnit;
200 
201 /**
202  * Represents a direction for an absolute unit e.g "Next Tuesday"
203  * or "Last Tuesday"
204  * @stable ICU 53
205  */
206 typedef enum UDateDirection {
207 
208     /**
209      * Two before. Not fully supported in every locale.
210      * @stable ICU 53
211      */
212     UDAT_DIRECTION_LAST_2,
213 
214     /**
215      * Last
216      * @stable ICU 53
217      */
218     UDAT_DIRECTION_LAST,
219 
220     /**
221      * This
222      * @stable ICU 53
223      */
224     UDAT_DIRECTION_THIS,
225 
226     /**
227      * Next
228      * @stable ICU 53
229      */
230     UDAT_DIRECTION_NEXT,
231 
232     /**
233      * Two after. Not fully supported in every locale.
234      * @stable ICU 53
235      */
236     UDAT_DIRECTION_NEXT_2,
237 
238     /**
239      * Plain, which means the absence of a qualifier.
240      * @stable ICU 53
241      */
242     UDAT_DIRECTION_PLAIN,
243 
244 #ifndef U_HIDE_DEPRECATED_API
245     /**
246      * One more than the highest normal UDateDirection value.
247      * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420.
248      */
249     UDAT_DIRECTION_COUNT
250 #endif  // U_HIDE_DEPRECATED_API
251 } UDateDirection;
252 
253 #if !UCONFIG_NO_BREAK_ITERATION
254 
255 U_NAMESPACE_BEGIN
256 
257 class BreakIterator;
258 class RelativeDateTimeCacheData;
259 class SharedNumberFormat;
260 class SharedPluralRules;
261 class SharedBreakIterator;
262 class NumberFormat;
263 class UnicodeString;
264 class FormattedRelativeDateTime;
265 class FormattedRelativeDateTimeData;
266 
267 /**
268  * An immutable class containing the result of a relative datetime formatting operation.
269  *
270  * Instances of this class are immutable and thread-safe.
271  *
272  * Not intended for public subclassing.
273  *
274  * @stable ICU 64
275  */
276 class U_I18N_API FormattedRelativeDateTime : public UMemory, public FormattedValue {
277   public:
278     /**
279      * Default constructor; makes an empty FormattedRelativeDateTime.
280      * @stable ICU 64
281      */
FormattedRelativeDateTime()282     FormattedRelativeDateTime() : fData(nullptr), fErrorCode(U_INVALID_STATE_ERROR) {}
283 
284     /**
285      * Move constructor: Leaves the source FormattedRelativeDateTime in an undefined state.
286      * @stable ICU 64
287      */
288     FormattedRelativeDateTime(FormattedRelativeDateTime&& src) U_NOEXCEPT;
289 
290     /**
291      * Destruct an instance of FormattedRelativeDateTime.
292      * @stable ICU 64
293      */
294     virtual ~FormattedRelativeDateTime() U_OVERRIDE;
295 
296     /** Copying not supported; use move constructor instead. */
297     FormattedRelativeDateTime(const FormattedRelativeDateTime&) = delete;
298 
299     /** Copying not supported; use move assignment instead. */
300     FormattedRelativeDateTime& operator=(const FormattedRelativeDateTime&) = delete;
301 
302     /**
303      * Move assignment: Leaves the source FormattedRelativeDateTime in an undefined state.
304      * @stable ICU 64
305      */
306     FormattedRelativeDateTime& operator=(FormattedRelativeDateTime&& src) U_NOEXCEPT;
307 
308     /** @copydoc FormattedValue::toString() */
309     UnicodeString toString(UErrorCode& status) const U_OVERRIDE;
310 
311     /** @copydoc FormattedValue::toTempString() */
312     UnicodeString toTempString(UErrorCode& status) const U_OVERRIDE;
313 
314     /** @copydoc FormattedValue::appendTo() */
315     Appendable &appendTo(Appendable& appendable, UErrorCode& status) const U_OVERRIDE;
316 
317     /** @copydoc FormattedValue::nextPosition() */
318     UBool nextPosition(ConstrainedFieldPosition& cfpos, UErrorCode& status) const U_OVERRIDE;
319 
320   private:
321     FormattedRelativeDateTimeData *fData;
322     UErrorCode fErrorCode;
FormattedRelativeDateTime(FormattedRelativeDateTimeData * results)323     explicit FormattedRelativeDateTime(FormattedRelativeDateTimeData *results)
324         : fData(results), fErrorCode(U_ZERO_ERROR) {}
FormattedRelativeDateTime(UErrorCode errorCode)325     explicit FormattedRelativeDateTime(UErrorCode errorCode)
326         : fData(nullptr), fErrorCode(errorCode) {}
327     friend class RelativeDateTimeFormatter;
328 };
329 
330 /**
331  * Formats simple relative dates. There are two types of relative dates that
332  * it handles:
333  * <ul>
334  *   <li>relative dates with a quantity e.g "in 5 days"</li>
335  *   <li>relative dates without a quantity e.g "next Tuesday"</li>
336  * </ul>
337  * <p>
338  * This API is very basic and is intended to be a building block for more
339  * fancy APIs. The caller tells it exactly what to display in a locale
340  * independent way. While this class automatically provides the correct plural
341  * forms, the grammatical form is otherwise as neutral as possible. It is the
342  * caller's responsibility to handle cut-off logic such as deciding between
343  * displaying "in 7 days" or "in 1 week." This API supports relative dates
344  * involving one single unit. This API does not support relative dates
345  * involving compound units,
346  * e.g "in 5 days and 4 hours" nor does it support parsing.
347  * <p>
348  * This class is mostly thread safe and immutable with the following caveats:
349  * 1. The assignment operator violates Immutability. It must not be used
350  *    concurrently with other operations.
351  * 2. Caller must not hold onto adopted pointers.
352  * <p>
353  * This class is not intended for public subclassing.
354  * <p>
355  * Here are some examples of use:
356  * <blockquote>
357  * <pre>
358  * UErrorCode status = U_ZERO_ERROR;
359  * UnicodeString appendTo;
360  * RelativeDateTimeFormatter fmt(status);
361  * // Appends "in 1 day"
362  * fmt.format(
363  *     1, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_DAYS, appendTo, status);
364  * // Appends "in 3 days"
365  * fmt.format(
366  *     3, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_DAYS, appendTo, status);
367  * // Appends "3.2 years ago"
368  * fmt.format(
369  *     3.2, UDAT_DIRECTION_LAST, UDAT_RELATIVE_YEARS, appendTo, status);
370  * // Appends "last Sunday"
371  * fmt.format(UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_SUNDAY, appendTo, status);
372  * // Appends "this Sunday"
373  * fmt.format(UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_SUNDAY, appendTo, status);
374  * // Appends "next Sunday"
375  * fmt.format(UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_SUNDAY, appendTo, status);
376  * // Appends "Sunday"
377  * fmt.format(UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_SUNDAY, appendTo, status);
378  *
379  * // Appends "yesterday"
380  * fmt.format(UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_DAY, appendTo, status);
381  * // Appends "today"
382  * fmt.format(UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_DAY, appendTo, status);
383  * // Appends "tomorrow"
384  * fmt.format(UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_DAY, appendTo, status);
385  * // Appends "now"
386  * fmt.format(UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_NOW, appendTo, status);
387  *
388  * </pre>
389  * </blockquote>
390  * <p>
391  * In the future, we may add more forms, such as abbreviated/short forms
392  * (3 secs ago), and relative day periods ("yesterday afternoon"), etc.
393  *
394  * The RelativeDateTimeFormatter class is not intended for public subclassing.
395  *
396  * @stable ICU 53
397  */
398 class U_I18N_API RelativeDateTimeFormatter : public UObject {
399 public:
400 
401     /**
402      * Create RelativeDateTimeFormatter with default locale.
403      * @stable ICU 53
404      */
405     RelativeDateTimeFormatter(UErrorCode& status);
406 
407     /**
408      * Create RelativeDateTimeFormatter with given locale.
409      * @stable ICU 53
410      */
411     RelativeDateTimeFormatter(const Locale& locale, UErrorCode& status);
412 
413     /**
414      * Create RelativeDateTimeFormatter with given locale and NumberFormat.
415      *
416      * @param locale the locale
417      * @param nfToAdopt Constructed object takes ownership of this pointer.
418      *   It is an error for caller to delete this pointer or change its
419      *   contents after calling this constructor.
420      * @param status Any error is returned here.
421      * @stable ICU 53
422      */
423     RelativeDateTimeFormatter(
424         const Locale& locale, NumberFormat *nfToAdopt, UErrorCode& status);
425 
426     /**
427      * Create RelativeDateTimeFormatter with given locale, NumberFormat,
428      * and capitalization context.
429      *
430      * @param locale the locale
431      * @param nfToAdopt Constructed object takes ownership of this pointer.
432      *   It is an error for caller to delete this pointer or change its
433      *   contents after calling this constructor. Caller may pass NULL for
434      *   this argument if they want default number format behavior.
435      * @param style the format style. The UDAT_RELATIVE bit field has no effect.
436      * @param capitalizationContext A value from UDisplayContext that pertains to
437      * capitalization.
438      * @param status Any error is returned here.
439      * @stable ICU 54
440      */
441     RelativeDateTimeFormatter(
442             const Locale& locale,
443             NumberFormat *nfToAdopt,
444             UDateRelativeDateTimeFormatterStyle style,
445             UDisplayContext capitalizationContext,
446             UErrorCode& status);
447 
448     /**
449      * Copy constructor.
450      * @stable ICU 53
451      */
452     RelativeDateTimeFormatter(const RelativeDateTimeFormatter& other);
453 
454     /**
455      * Assignment operator.
456      * @stable ICU 53
457      */
458     RelativeDateTimeFormatter& operator=(
459             const RelativeDateTimeFormatter& other);
460 
461     /**
462      * Destructor.
463      * @stable ICU 53
464      */
465     virtual ~RelativeDateTimeFormatter();
466 
467     /**
468      * Formats a relative date with a quantity such as "in 5 days" or
469      * "3 months ago"
470      *
471      * This method returns a String. To get more information about the
472      * formatting result, use formatToValue().
473      *
474      * @param quantity The numerical amount e.g 5. This value is formatted
475      * according to this object's NumberFormat object.
476      * @param direction NEXT means a future relative date; LAST means a past
477      * relative date. If direction is anything else, this method sets
478      * status to U_ILLEGAL_ARGUMENT_ERROR.
479      * @param unit the unit e.g day? month? year?
480      * @param appendTo The string to which the formatted result will be
481      *  appended
482      * @param status ICU error code returned here.
483      * @return appendTo
484      * @stable ICU 53
485      */
486     UnicodeString& format(
487             double quantity,
488             UDateDirection direction,
489             UDateRelativeUnit unit,
490             UnicodeString& appendTo,
491             UErrorCode& status) const;
492 
493     /**
494      * Formats a relative date with a quantity such as "in 5 days" or
495      * "3 months ago"
496      *
497      * This method returns a FormattedRelativeDateTime, which exposes more
498      * information than the String returned by format().
499      *
500      * @param quantity The numerical amount e.g 5. This value is formatted
501      * according to this object's NumberFormat object.
502      * @param direction NEXT means a future relative date; LAST means a past
503      * relative date. If direction is anything else, this method sets
504      * status to U_ILLEGAL_ARGUMENT_ERROR.
505      * @param unit the unit e.g day? month? year?
506      * @param status ICU error code returned here.
507      * @return The formatted relative datetime
508      * @stable ICU 64
509      */
510     FormattedRelativeDateTime formatToValue(
511             double quantity,
512             UDateDirection direction,
513             UDateRelativeUnit unit,
514             UErrorCode& status) const;
515 
516     /**
517      * Formats a relative date without a quantity.
518      *
519      * This method returns a String. To get more information about the
520      * formatting result, use formatToValue().
521      *
522      * @param direction NEXT, LAST, THIS, etc.
523      * @param unit e.g SATURDAY, DAY, MONTH
524      * @param appendTo The string to which the formatted result will be
525      *  appended. If the value of direction is documented as not being fully
526      *  supported in all locales then this method leaves appendTo unchanged if
527      *  no format string is available.
528      * @param status ICU error code returned here.
529      * @return appendTo
530      * @stable ICU 53
531      */
532     UnicodeString& format(
533             UDateDirection direction,
534             UDateAbsoluteUnit unit,
535             UnicodeString& appendTo,
536             UErrorCode& status) const;
537 
538     /**
539      * Formats a relative date without a quantity.
540      *
541      * This method returns a FormattedRelativeDateTime, which exposes more
542      * information than the String returned by format().
543      *
544      * If the string is not available in the requested locale, the return
545      * value will be empty (calling toString will give an empty string).
546      *
547      * @param direction NEXT, LAST, THIS, etc.
548      * @param unit e.g SATURDAY, DAY, MONTH
549      * @param status ICU error code returned here.
550      * @return The formatted relative datetime
551      * @stable ICU 64
552      */
553     FormattedRelativeDateTime formatToValue(
554             UDateDirection direction,
555             UDateAbsoluteUnit unit,
556             UErrorCode& status) const;
557 
558     /**
559      * Format a combination of URelativeDateTimeUnit and numeric offset
560      * using a numeric style, e.g. "1 week ago", "in 1 week",
561      * "5 weeks ago", "in 5 weeks".
562      *
563      * This method returns a String. To get more information about the
564      * formatting result, use formatNumericToValue().
565      *
566      * @param offset    The signed offset for the specified unit. This
567      *                  will be formatted according to this object's
568      *                  NumberFormat object.
569      * @param unit      The unit to use when formatting the relative
570      *                  date, e.g. UDAT_REL_UNIT_WEEK,
571      *                  UDAT_REL_UNIT_FRIDAY.
572      * @param appendTo  The string to which the formatted result will be
573      *                  appended.
574      * @param status    ICU error code returned here.
575      * @return          appendTo
576      * @stable ICU 57
577      */
578     UnicodeString& formatNumeric(
579             double offset,
580             URelativeDateTimeUnit unit,
581             UnicodeString& appendTo,
582             UErrorCode& status) const;
583 
584     /**
585      * Format a combination of URelativeDateTimeUnit and numeric offset
586      * using a numeric style, e.g. "1 week ago", "in 1 week",
587      * "5 weeks ago", "in 5 weeks".
588      *
589      * This method returns a FormattedRelativeDateTime, which exposes more
590      * information than the String returned by formatNumeric().
591      *
592      * @param offset    The signed offset for the specified unit. This
593      *                  will be formatted according to this object's
594      *                  NumberFormat object.
595      * @param unit      The unit to use when formatting the relative
596      *                  date, e.g. UDAT_REL_UNIT_WEEK,
597      *                  UDAT_REL_UNIT_FRIDAY.
598      * @param status    ICU error code returned here.
599      * @return          The formatted relative datetime
600      * @stable ICU 64
601      */
602     FormattedRelativeDateTime formatNumericToValue(
603             double offset,
604             URelativeDateTimeUnit unit,
605             UErrorCode& status) const;
606 
607     /**
608      * Format a combination of URelativeDateTimeUnit and numeric offset
609      * using a text style if possible, e.g. "last week", "this week",
610      * "next week", "yesterday", "tomorrow". Falls back to numeric
611      * style if no appropriate text term is available for the specified
612      * offset in the object's locale.
613      *
614      * This method returns a String. To get more information about the
615      * formatting result, use formatToValue().
616      *
617      * @param offset    The signed offset for the specified unit.
618      * @param unit      The unit to use when formatting the relative
619      *                  date, e.g. UDAT_REL_UNIT_WEEK,
620      *                  UDAT_REL_UNIT_FRIDAY.
621      * @param appendTo  The string to which the formatted result will be
622      *                  appended.
623      * @param status    ICU error code returned here.
624      * @return          appendTo
625      * @stable ICU 57
626      */
627     UnicodeString& format(
628             double offset,
629             URelativeDateTimeUnit unit,
630             UnicodeString& appendTo,
631             UErrorCode& status) const;
632 
633     /**
634      * Format a combination of URelativeDateTimeUnit and numeric offset
635      * using a text style if possible, e.g. "last week", "this week",
636      * "next week", "yesterday", "tomorrow". Falls back to numeric
637      * style if no appropriate text term is available for the specified
638      * offset in the object's locale.
639      *
640      * This method returns a FormattedRelativeDateTime, which exposes more
641      * information than the String returned by format().
642      *
643      * @param offset    The signed offset for the specified unit.
644      * @param unit      The unit to use when formatting the relative
645      *                  date, e.g. UDAT_REL_UNIT_WEEK,
646      *                  UDAT_REL_UNIT_FRIDAY.
647      * @param status    ICU error code returned here.
648      * @return          The formatted relative datetime
649      * @stable ICU 64
650      */
651     FormattedRelativeDateTime formatToValue(
652             double offset,
653             URelativeDateTimeUnit unit,
654             UErrorCode& status) const;
655 
656     /**
657      * Combines a relative date string and a time string in this object's
658      * locale. This is done with the same date-time separator used for the
659      * default calendar in this locale.
660      *
661      * @param relativeDateString the relative date, e.g 'yesterday'
662      * @param timeString the time e.g '3:45'
663      * @param appendTo concatenated date and time appended here
664      * @param status ICU error code returned here.
665      * @return appendTo
666      * @stable ICU 53
667      */
668     UnicodeString& combineDateAndTime(
669             const UnicodeString& relativeDateString,
670             const UnicodeString& timeString,
671             UnicodeString& appendTo,
672             UErrorCode& status) const;
673 
674     /**
675      * Returns the NumberFormat this object is using.
676      *
677      * @stable ICU 53
678      */
679     const NumberFormat& getNumberFormat() const;
680 
681     /**
682      * Returns the capitalization context.
683      *
684      * @stable ICU 54
685      */
686     UDisplayContext getCapitalizationContext() const;
687 
688     /**
689      * Returns the format style.
690      *
691      * @stable ICU 54
692      */
693     UDateRelativeDateTimeFormatterStyle getFormatStyle() const;
694 
695 private:
696     const RelativeDateTimeCacheData* fCache;
697     const SharedNumberFormat *fNumberFormat;
698     const SharedPluralRules *fPluralRules;
699     UDateRelativeDateTimeFormatterStyle fStyle;
700     UDisplayContext fContext;
701     const SharedBreakIterator *fOptBreakIterator;
702     Locale fLocale;
703     void init(
704             NumberFormat *nfToAdopt,
705             BreakIterator *brkIter,
706             UErrorCode &status);
707     UnicodeString& adjustForContext(UnicodeString &) const;
708     UBool checkNoAdjustForContext(UErrorCode& status) const;
709 
710     template<typename F, typename... Args>
711     UnicodeString& doFormat(
712             F callback,
713             UnicodeString& appendTo,
714             UErrorCode& status,
715             Args... args) const;
716 
717     template<typename F, typename... Args>
718     FormattedRelativeDateTime doFormatToValue(
719             F callback,
720             UErrorCode& status,
721             Args... args) const;
722 
723     void formatImpl(
724             double quantity,
725             UDateDirection direction,
726             UDateRelativeUnit unit,
727             FormattedRelativeDateTimeData& output,
728             UErrorCode& status) const;
729     void formatAbsoluteImpl(
730             UDateDirection direction,
731             UDateAbsoluteUnit unit,
732             FormattedRelativeDateTimeData& output,
733             UErrorCode& status) const;
734     void formatNumericImpl(
735             double offset,
736             URelativeDateTimeUnit unit,
737             FormattedRelativeDateTimeData& output,
738             UErrorCode& status) const;
739     void formatRelativeImpl(
740             double offset,
741             URelativeDateTimeUnit unit,
742             FormattedRelativeDateTimeData& output,
743             UErrorCode& status) const;
744 };
745 
746 U_NAMESPACE_END
747 
748 #endif /* !UCONFIG_NO_BREAK_ITERATION */
749 #endif /* !UCONFIG_NO_FORMATTING */
750 
751 #endif /* U_SHOW_CPLUSPLUS_API */
752 
753 #endif /* __RELDATEFMT_H */
754