00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #ifndef __RELDATEFMT_H
00015 #define __RELDATEFMT_H
00016
00017 #include "unicode/utypes.h"
00018 #include "unicode/uobject.h"
00019 #include "unicode/udisplaycontext.h"
00020 #include "unicode/ureldatefmt.h"
00021 #include "unicode/locid.h"
00022 #include "unicode/formattedvalue.h"
00023
00029 #if !UCONFIG_NO_FORMATTING
00030
00036 typedef enum UDateRelativeUnit {
00037
00042 UDAT_RELATIVE_SECONDS,
00043
00048 UDAT_RELATIVE_MINUTES,
00049
00054 UDAT_RELATIVE_HOURS,
00055
00060 UDAT_RELATIVE_DAYS,
00061
00066 UDAT_RELATIVE_WEEKS,
00067
00072 UDAT_RELATIVE_MONTHS,
00073
00078 UDAT_RELATIVE_YEARS,
00079
00080 #ifndef U_HIDE_DEPRECATED_API
00081
00085 UDAT_RELATIVE_UNIT_COUNT
00086 #endif // U_HIDE_DEPRECATED_API
00087 } UDateRelativeUnit;
00088
00093 typedef enum UDateAbsoluteUnit {
00094
00095
00096
00101 UDAT_ABSOLUTE_SUNDAY,
00102
00107 UDAT_ABSOLUTE_MONDAY,
00108
00113 UDAT_ABSOLUTE_TUESDAY,
00114
00119 UDAT_ABSOLUTE_WEDNESDAY,
00120
00125 UDAT_ABSOLUTE_THURSDAY,
00126
00131 UDAT_ABSOLUTE_FRIDAY,
00132
00137 UDAT_ABSOLUTE_SATURDAY,
00138
00143 UDAT_ABSOLUTE_DAY,
00144
00149 UDAT_ABSOLUTE_WEEK,
00150
00155 UDAT_ABSOLUTE_MONTH,
00156
00161 UDAT_ABSOLUTE_YEAR,
00162
00167 UDAT_ABSOLUTE_NOW,
00168
00169 #ifndef U_HIDE_DRAFT_API
00170
00174 UDAT_ABSOLUTE_QUARTER,
00175 #endif // U_HIDE_DRAFT_API
00176
00177 #ifndef U_HIDE_DEPRECATED_API
00178
00182 UDAT_ABSOLUTE_UNIT_COUNT = UDAT_ABSOLUTE_NOW + 2
00183 #endif // U_HIDE_DEPRECATED_API
00184 } UDateAbsoluteUnit;
00185
00191 typedef enum UDateDirection {
00192
00197 UDAT_DIRECTION_LAST_2,
00198
00203 UDAT_DIRECTION_LAST,
00204
00209 UDAT_DIRECTION_THIS,
00210
00215 UDAT_DIRECTION_NEXT,
00216
00221 UDAT_DIRECTION_NEXT_2,
00222
00227 UDAT_DIRECTION_PLAIN,
00228
00229 #ifndef U_HIDE_DEPRECATED_API
00230
00234 UDAT_DIRECTION_COUNT
00235 #endif // U_HIDE_DEPRECATED_API
00236 } UDateDirection;
00237
00238 #if !UCONFIG_NO_BREAK_ITERATION
00239
00240 U_NAMESPACE_BEGIN
00241
00242 class BreakIterator;
00243 class RelativeDateTimeCacheData;
00244 class SharedNumberFormat;
00245 class SharedPluralRules;
00246 class SharedBreakIterator;
00247 class NumberFormat;
00248 class UnicodeString;
00249 class FormattedRelativeDateTimeData;
00250
00251 #ifndef U_HIDE_DRAFT_API
00252
00261 class U_I18N_API FormattedRelativeDateTime : public UMemory, public FormattedValue {
00262 public:
00267 FormattedRelativeDateTime() : fData(nullptr), fErrorCode(U_INVALID_STATE_ERROR) {}
00268
00273 FormattedRelativeDateTime(FormattedRelativeDateTime&& src) U_NOEXCEPT;
00274
00279 virtual ~FormattedRelativeDateTime() U_OVERRIDE;
00280
00282 FormattedRelativeDateTime(const FormattedRelativeDateTime&) = delete;
00283
00285 FormattedRelativeDateTime& operator=(const FormattedRelativeDateTime&) = delete;
00286
00291 FormattedRelativeDateTime& operator=(FormattedRelativeDateTime&& src) U_NOEXCEPT;
00292
00294 UnicodeString toString(UErrorCode& status) const U_OVERRIDE;
00295
00297 UnicodeString toTempString(UErrorCode& status) const U_OVERRIDE;
00298
00300 Appendable &appendTo(Appendable& appendable, UErrorCode& status) const U_OVERRIDE;
00301
00303 UBool nextPosition(ConstrainedFieldPosition& cfpos, UErrorCode& status) const U_OVERRIDE;
00304
00305 private:
00306 FormattedRelativeDateTimeData *fData;
00307 UErrorCode fErrorCode;
00308 explicit FormattedRelativeDateTime(FormattedRelativeDateTimeData *results)
00309 : fData(results), fErrorCode(U_ZERO_ERROR) {}
00310 explicit FormattedRelativeDateTime(UErrorCode errorCode)
00311 : fData(nullptr), fErrorCode(errorCode) {}
00312 friend class RelativeDateTimeFormatter;
00313 };
00314 #endif
00315
00384 class U_I18N_API RelativeDateTimeFormatter : public UObject {
00385 public:
00386
00391 RelativeDateTimeFormatter(UErrorCode& status);
00392
00397 RelativeDateTimeFormatter(const Locale& locale, UErrorCode& status);
00398
00409 RelativeDateTimeFormatter(
00410 const Locale& locale, NumberFormat *nfToAdopt, UErrorCode& status);
00411
00427 RelativeDateTimeFormatter(
00428 const Locale& locale,
00429 NumberFormat *nfToAdopt,
00430 UDateRelativeDateTimeFormatterStyle style,
00431 UDisplayContext capitalizationContext,
00432 UErrorCode& status);
00433
00438 RelativeDateTimeFormatter(const RelativeDateTimeFormatter& other);
00439
00444 RelativeDateTimeFormatter& operator=(
00445 const RelativeDateTimeFormatter& other);
00446
00451 virtual ~RelativeDateTimeFormatter();
00452
00472 UnicodeString& format(
00473 double quantity,
00474 UDateDirection direction,
00475 UDateRelativeUnit unit,
00476 UnicodeString& appendTo,
00477 UErrorCode& status) const;
00478
00479 #ifndef U_HIDE_DRAFT_API
00480
00497 FormattedRelativeDateTime formatToValue(
00498 double quantity,
00499 UDateDirection direction,
00500 UDateRelativeUnit unit,
00501 UErrorCode& status) const;
00502 #endif
00503
00520 UnicodeString& format(
00521 UDateDirection direction,
00522 UDateAbsoluteUnit unit,
00523 UnicodeString& appendTo,
00524 UErrorCode& status) const;
00525
00526 #ifndef U_HIDE_DRAFT_API
00527
00542 FormattedRelativeDateTime formatToValue(
00543 UDateDirection direction,
00544 UDateAbsoluteUnit unit,
00545 UErrorCode& status) const;
00546 #endif
00547
00568 UnicodeString& formatNumeric(
00569 double offset,
00570 URelativeDateTimeUnit unit,
00571 UnicodeString& appendTo,
00572 UErrorCode& status) const;
00573
00574 #ifndef U_HIDE_DRAFT_API
00575
00593 FormattedRelativeDateTime formatNumericToValue(
00594 double offset,
00595 URelativeDateTimeUnit unit,
00596 UErrorCode& status) const;
00597 #endif
00598
00619 UnicodeString& format(
00620 double offset,
00621 URelativeDateTimeUnit unit,
00622 UnicodeString& appendTo,
00623 UErrorCode& status) const;
00624
00625 #ifndef U_HIDE_DRAFT_API
00626
00644 FormattedRelativeDateTime formatToValue(
00645 double offset,
00646 URelativeDateTimeUnit unit,
00647 UErrorCode& status) const;
00648 #endif
00649
00662 UnicodeString& combineDateAndTime(
00663 const UnicodeString& relativeDateString,
00664 const UnicodeString& timeString,
00665 UnicodeString& appendTo,
00666 UErrorCode& status) const;
00667
00673 const NumberFormat& getNumberFormat() const;
00674
00680 UDisplayContext getCapitalizationContext() const;
00681
00687 UDateRelativeDateTimeFormatterStyle getFormatStyle() const;
00688
00689 private:
00690 const RelativeDateTimeCacheData* fCache;
00691 const SharedNumberFormat *fNumberFormat;
00692 const SharedPluralRules *fPluralRules;
00693 UDateRelativeDateTimeFormatterStyle fStyle;
00694 UDisplayContext fContext;
00695 const SharedBreakIterator *fOptBreakIterator;
00696 Locale fLocale;
00697 void init(
00698 NumberFormat *nfToAdopt,
00699 BreakIterator *brkIter,
00700 UErrorCode &status);
00701 UnicodeString& adjustForContext(UnicodeString &) const;
00702 UBool checkNoAdjustForContext(UErrorCode& status) const;
00703
00704 template<typename F, typename... Args>
00705 UnicodeString& doFormat(
00706 F callback,
00707 UnicodeString& appendTo,
00708 UErrorCode& status,
00709 Args... args) const;
00710
00711 #ifndef U_HIDE_DRAFT_API // for FormattedRelativeDateTime
00712 template<typename F, typename... Args>
00713 FormattedRelativeDateTime doFormatToValue(
00714 F callback,
00715 UErrorCode& status,
00716 Args... args) const;
00717 #endif // U_HIDE_DRAFT_API
00718
00719 void formatImpl(
00720 double quantity,
00721 UDateDirection direction,
00722 UDateRelativeUnit unit,
00723 FormattedRelativeDateTimeData& output,
00724 UErrorCode& status) const;
00725 void formatAbsoluteImpl(
00726 UDateDirection direction,
00727 UDateAbsoluteUnit unit,
00728 FormattedRelativeDateTimeData& output,
00729 UErrorCode& status) const;
00730 void formatNumericImpl(
00731 double offset,
00732 URelativeDateTimeUnit unit,
00733 FormattedRelativeDateTimeData& output,
00734 UErrorCode& status) const;
00735 void formatRelativeImpl(
00736 double offset,
00737 URelativeDateTimeUnit unit,
00738 FormattedRelativeDateTimeData& output,
00739 UErrorCode& status) const;
00740 };
00741
00742 U_NAMESPACE_END
00743
00744 #endif
00745 #endif
00746 #endif