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
00019 #if U_SHOW_CPLUSPLUS_API
00020
00021 #include "unicode/uobject.h"
00022 #include "unicode/udisplaycontext.h"
00023 #include "unicode/ureldatefmt.h"
00024 #include "unicode/locid.h"
00025 #include "unicode/formattedvalue.h"
00026
00032 #if !UCONFIG_NO_FORMATTING
00033
00039 typedef enum UDateRelativeUnit {
00040
00045 UDAT_RELATIVE_SECONDS,
00046
00051 UDAT_RELATIVE_MINUTES,
00052
00057 UDAT_RELATIVE_HOURS,
00058
00063 UDAT_RELATIVE_DAYS,
00064
00069 UDAT_RELATIVE_WEEKS,
00070
00075 UDAT_RELATIVE_MONTHS,
00076
00081 UDAT_RELATIVE_YEARS,
00082
00083 #ifndef U_HIDE_DEPRECATED_API
00084
00088 UDAT_RELATIVE_UNIT_COUNT
00089 #endif // U_HIDE_DEPRECATED_API
00090 } UDateRelativeUnit;
00091
00096 typedef enum UDateAbsoluteUnit {
00097
00098
00099
00104 UDAT_ABSOLUTE_SUNDAY,
00105
00110 UDAT_ABSOLUTE_MONDAY,
00111
00116 UDAT_ABSOLUTE_TUESDAY,
00117
00122 UDAT_ABSOLUTE_WEDNESDAY,
00123
00128 UDAT_ABSOLUTE_THURSDAY,
00129
00134 UDAT_ABSOLUTE_FRIDAY,
00135
00140 UDAT_ABSOLUTE_SATURDAY,
00141
00146 UDAT_ABSOLUTE_DAY,
00147
00152 UDAT_ABSOLUTE_WEEK,
00153
00158 UDAT_ABSOLUTE_MONTH,
00159
00164 UDAT_ABSOLUTE_YEAR,
00165
00170 UDAT_ABSOLUTE_NOW,
00171
00176 UDAT_ABSOLUTE_QUARTER,
00177
00182 UDAT_ABSOLUTE_HOUR,
00183
00188 UDAT_ABSOLUTE_MINUTE,
00189
00190 #ifndef U_HIDE_DEPRECATED_API
00191
00195 UDAT_ABSOLUTE_UNIT_COUNT = UDAT_ABSOLUTE_NOW + 4
00196 #endif // U_HIDE_DEPRECATED_API
00197 } UDateAbsoluteUnit;
00198
00204 typedef enum UDateDirection {
00205
00210 UDAT_DIRECTION_LAST_2,
00211
00216 UDAT_DIRECTION_LAST,
00217
00222 UDAT_DIRECTION_THIS,
00223
00228 UDAT_DIRECTION_NEXT,
00229
00234 UDAT_DIRECTION_NEXT_2,
00235
00240 UDAT_DIRECTION_PLAIN,
00241
00242 #ifndef U_HIDE_DEPRECATED_API
00243
00247 UDAT_DIRECTION_COUNT
00248 #endif // U_HIDE_DEPRECATED_API
00249 } UDateDirection;
00250
00251 #if !UCONFIG_NO_BREAK_ITERATION
00252
00253 U_NAMESPACE_BEGIN
00254
00255 class BreakIterator;
00256 class RelativeDateTimeCacheData;
00257 class SharedNumberFormat;
00258 class SharedPluralRules;
00259 class SharedBreakIterator;
00260 class NumberFormat;
00261 class UnicodeString;
00262 class FormattedRelativeDateTime;
00263 class FormattedRelativeDateTimeData;
00264
00274 class U_I18N_API FormattedRelativeDateTime : public UMemory, public FormattedValue {
00275 public:
00280 FormattedRelativeDateTime() : fData(nullptr), fErrorCode(U_INVALID_STATE_ERROR) {}
00281
00286 FormattedRelativeDateTime(FormattedRelativeDateTime&& src) U_NOEXCEPT;
00287
00292 virtual ~FormattedRelativeDateTime() U_OVERRIDE;
00293
00295 FormattedRelativeDateTime(const FormattedRelativeDateTime&) = delete;
00296
00298 FormattedRelativeDateTime& operator=(const FormattedRelativeDateTime&) = delete;
00299
00304 FormattedRelativeDateTime& operator=(FormattedRelativeDateTime&& src) U_NOEXCEPT;
00305
00307 UnicodeString toString(UErrorCode& status) const U_OVERRIDE;
00308
00310 UnicodeString toTempString(UErrorCode& status) const U_OVERRIDE;
00311
00313 Appendable &appendTo(Appendable& appendable, UErrorCode& status) const U_OVERRIDE;
00314
00316 UBool nextPosition(ConstrainedFieldPosition& cfpos, UErrorCode& status) const U_OVERRIDE;
00317
00318 private:
00319 FormattedRelativeDateTimeData *fData;
00320 UErrorCode fErrorCode;
00321 explicit FormattedRelativeDateTime(FormattedRelativeDateTimeData *results)
00322 : fData(results), fErrorCode(U_ZERO_ERROR) {}
00323 explicit FormattedRelativeDateTime(UErrorCode errorCode)
00324 : fData(nullptr), fErrorCode(errorCode) {}
00325 friend class RelativeDateTimeFormatter;
00326 };
00327
00396 class U_I18N_API RelativeDateTimeFormatter : public UObject {
00397 public:
00398
00403 RelativeDateTimeFormatter(UErrorCode& status);
00404
00409 RelativeDateTimeFormatter(const Locale& locale, UErrorCode& status);
00410
00421 RelativeDateTimeFormatter(
00422 const Locale& locale, NumberFormat *nfToAdopt, UErrorCode& status);
00423
00439 RelativeDateTimeFormatter(
00440 const Locale& locale,
00441 NumberFormat *nfToAdopt,
00442 UDateRelativeDateTimeFormatterStyle style,
00443 UDisplayContext capitalizationContext,
00444 UErrorCode& status);
00445
00450 RelativeDateTimeFormatter(const RelativeDateTimeFormatter& other);
00451
00456 RelativeDateTimeFormatter& operator=(
00457 const RelativeDateTimeFormatter& other);
00458
00463 virtual ~RelativeDateTimeFormatter();
00464
00484 UnicodeString& format(
00485 double quantity,
00486 UDateDirection direction,
00487 UDateRelativeUnit unit,
00488 UnicodeString& appendTo,
00489 UErrorCode& status) const;
00490
00508 FormattedRelativeDateTime formatToValue(
00509 double quantity,
00510 UDateDirection direction,
00511 UDateRelativeUnit unit,
00512 UErrorCode& status) const;
00513
00530 UnicodeString& format(
00531 UDateDirection direction,
00532 UDateAbsoluteUnit unit,
00533 UnicodeString& appendTo,
00534 UErrorCode& status) const;
00535
00551 FormattedRelativeDateTime formatToValue(
00552 UDateDirection direction,
00553 UDateAbsoluteUnit unit,
00554 UErrorCode& status) const;
00555
00576 UnicodeString& formatNumeric(
00577 double offset,
00578 URelativeDateTimeUnit unit,
00579 UnicodeString& appendTo,
00580 UErrorCode& status) const;
00581
00600 FormattedRelativeDateTime formatNumericToValue(
00601 double offset,
00602 URelativeDateTimeUnit unit,
00603 UErrorCode& status) const;
00604
00625 UnicodeString& format(
00626 double offset,
00627 URelativeDateTimeUnit unit,
00628 UnicodeString& appendTo,
00629 UErrorCode& status) const;
00630
00649 FormattedRelativeDateTime formatToValue(
00650 double offset,
00651 URelativeDateTimeUnit unit,
00652 UErrorCode& status) const;
00653
00666 UnicodeString& combineDateAndTime(
00667 const UnicodeString& relativeDateString,
00668 const UnicodeString& timeString,
00669 UnicodeString& appendTo,
00670 UErrorCode& status) const;
00671
00677 const NumberFormat& getNumberFormat() const;
00678
00684 UDisplayContext getCapitalizationContext() const;
00685
00691 UDateRelativeDateTimeFormatterStyle getFormatStyle() const;
00692
00693 private:
00694 const RelativeDateTimeCacheData* fCache;
00695 const SharedNumberFormat *fNumberFormat;
00696 const SharedPluralRules *fPluralRules;
00697 UDateRelativeDateTimeFormatterStyle fStyle;
00698 UDisplayContext fContext;
00699 const SharedBreakIterator *fOptBreakIterator;
00700 Locale fLocale;
00701 void init(
00702 NumberFormat *nfToAdopt,
00703 BreakIterator *brkIter,
00704 UErrorCode &status);
00705 UnicodeString& adjustForContext(UnicodeString &) const;
00706 UBool checkNoAdjustForContext(UErrorCode& status) const;
00707
00708 template<typename F, typename... Args>
00709 UnicodeString& doFormat(
00710 F callback,
00711 UnicodeString& appendTo,
00712 UErrorCode& status,
00713 Args... args) const;
00714
00715 template<typename F, typename... Args>
00716 FormattedRelativeDateTime doFormatToValue(
00717 F callback,
00718 UErrorCode& status,
00719 Args... args) const;
00720
00721 void formatImpl(
00722 double quantity,
00723 UDateDirection direction,
00724 UDateRelativeUnit unit,
00725 FormattedRelativeDateTimeData& output,
00726 UErrorCode& status) const;
00727 void formatAbsoluteImpl(
00728 UDateDirection direction,
00729 UDateAbsoluteUnit unit,
00730 FormattedRelativeDateTimeData& output,
00731 UErrorCode& status) const;
00732 void formatNumericImpl(
00733 double offset,
00734 URelativeDateTimeUnit unit,
00735 FormattedRelativeDateTimeData& output,
00736 UErrorCode& status) const;
00737 void formatRelativeImpl(
00738 double offset,
00739 URelativeDateTimeUnit unit,
00740 FormattedRelativeDateTimeData& output,
00741 UErrorCode& status) const;
00742 };
00743
00744 U_NAMESPACE_END
00745
00746 #endif
00747 #endif
00748
00749 #endif
00750
00751 #endif