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