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
00178 #ifndef U_HIDE_DRAFT_API
00179
00183 UDAT_ABSOLUTE_HOUR,
00184
00189 UDAT_ABSOLUTE_MINUTE,
00190 #endif // U_HIDE_DRAFT_API
00191
00192 #ifndef U_HIDE_DEPRECATED_API
00193
00197 UDAT_ABSOLUTE_UNIT_COUNT = UDAT_ABSOLUTE_NOW + 4
00198 #endif // U_HIDE_DEPRECATED_API
00199 } UDateAbsoluteUnit;
00200
00206 typedef enum UDateDirection {
00207
00212 UDAT_DIRECTION_LAST_2,
00213
00218 UDAT_DIRECTION_LAST,
00219
00224 UDAT_DIRECTION_THIS,
00225
00230 UDAT_DIRECTION_NEXT,
00231
00236 UDAT_DIRECTION_NEXT_2,
00237
00242 UDAT_DIRECTION_PLAIN,
00243
00244 #ifndef U_HIDE_DEPRECATED_API
00245
00249 UDAT_DIRECTION_COUNT
00250 #endif // U_HIDE_DEPRECATED_API
00251 } UDateDirection;
00252
00253 #if !UCONFIG_NO_BREAK_ITERATION
00254
00255 U_NAMESPACE_BEGIN
00256
00257 class BreakIterator;
00258 class RelativeDateTimeCacheData;
00259 class SharedNumberFormat;
00260 class SharedPluralRules;
00261 class SharedBreakIterator;
00262 class NumberFormat;
00263 class UnicodeString;
00264 class FormattedRelativeDateTime;
00265 class FormattedRelativeDateTimeData;
00266
00276 class U_I18N_API FormattedRelativeDateTime : public UMemory, public FormattedValue {
00277 public:
00282 FormattedRelativeDateTime() : fData(nullptr), fErrorCode(U_INVALID_STATE_ERROR) {}
00283
00288 FormattedRelativeDateTime(FormattedRelativeDateTime&& src) U_NOEXCEPT;
00289
00294 virtual ~FormattedRelativeDateTime() U_OVERRIDE;
00295
00297 FormattedRelativeDateTime(const FormattedRelativeDateTime&) = delete;
00298
00300 FormattedRelativeDateTime& operator=(const FormattedRelativeDateTime&) = delete;
00301
00306 FormattedRelativeDateTime& operator=(FormattedRelativeDateTime&& src) U_NOEXCEPT;
00307
00309 UnicodeString toString(UErrorCode& status) const U_OVERRIDE;
00310
00312 UnicodeString toTempString(UErrorCode& status) const U_OVERRIDE;
00313
00315 Appendable &appendTo(Appendable& appendable, UErrorCode& status) const U_OVERRIDE;
00316
00318 UBool nextPosition(ConstrainedFieldPosition& cfpos, UErrorCode& status) const U_OVERRIDE;
00319
00320 private:
00321 FormattedRelativeDateTimeData *fData;
00322 UErrorCode fErrorCode;
00323 explicit FormattedRelativeDateTime(FormattedRelativeDateTimeData *results)
00324 : fData(results), fErrorCode(U_ZERO_ERROR) {}
00325 explicit FormattedRelativeDateTime(UErrorCode errorCode)
00326 : fData(nullptr), fErrorCode(errorCode) {}
00327 friend class RelativeDateTimeFormatter;
00328 };
00329
00398 class U_I18N_API RelativeDateTimeFormatter : public UObject {
00399 public:
00400
00405 RelativeDateTimeFormatter(UErrorCode& status);
00406
00411 RelativeDateTimeFormatter(const Locale& locale, UErrorCode& status);
00412
00423 RelativeDateTimeFormatter(
00424 const Locale& locale, NumberFormat *nfToAdopt, UErrorCode& status);
00425
00441 RelativeDateTimeFormatter(
00442 const Locale& locale,
00443 NumberFormat *nfToAdopt,
00444 UDateRelativeDateTimeFormatterStyle style,
00445 UDisplayContext capitalizationContext,
00446 UErrorCode& status);
00447
00452 RelativeDateTimeFormatter(const RelativeDateTimeFormatter& other);
00453
00458 RelativeDateTimeFormatter& operator=(
00459 const RelativeDateTimeFormatter& other);
00460
00465 virtual ~RelativeDateTimeFormatter();
00466
00486 UnicodeString& format(
00487 double quantity,
00488 UDateDirection direction,
00489 UDateRelativeUnit unit,
00490 UnicodeString& appendTo,
00491 UErrorCode& status) const;
00492
00510 FormattedRelativeDateTime formatToValue(
00511 double quantity,
00512 UDateDirection direction,
00513 UDateRelativeUnit unit,
00514 UErrorCode& status) const;
00515
00532 UnicodeString& format(
00533 UDateDirection direction,
00534 UDateAbsoluteUnit unit,
00535 UnicodeString& appendTo,
00536 UErrorCode& status) const;
00537
00553 FormattedRelativeDateTime formatToValue(
00554 UDateDirection direction,
00555 UDateAbsoluteUnit unit,
00556 UErrorCode& status) const;
00557
00578 UnicodeString& formatNumeric(
00579 double offset,
00580 URelativeDateTimeUnit unit,
00581 UnicodeString& appendTo,
00582 UErrorCode& status) const;
00583
00602 FormattedRelativeDateTime formatNumericToValue(
00603 double offset,
00604 URelativeDateTimeUnit unit,
00605 UErrorCode& status) const;
00606
00627 UnicodeString& format(
00628 double offset,
00629 URelativeDateTimeUnit unit,
00630 UnicodeString& appendTo,
00631 UErrorCode& status) const;
00632
00651 FormattedRelativeDateTime formatToValue(
00652 double offset,
00653 URelativeDateTimeUnit unit,
00654 UErrorCode& status) const;
00655
00668 UnicodeString& combineDateAndTime(
00669 const UnicodeString& relativeDateString,
00670 const UnicodeString& timeString,
00671 UnicodeString& appendTo,
00672 UErrorCode& status) const;
00673
00679 const NumberFormat& getNumberFormat() const;
00680
00686 UDisplayContext getCapitalizationContext() const;
00687
00693 UDateRelativeDateTimeFormatterStyle getFormatStyle() const;
00694
00695 private:
00696 const RelativeDateTimeCacheData* fCache;
00697 const SharedNumberFormat *fNumberFormat;
00698 const SharedPluralRules *fPluralRules;
00699 UDateRelativeDateTimeFormatterStyle fStyle;
00700 UDisplayContext fContext;
00701 const SharedBreakIterator *fOptBreakIterator;
00702 Locale fLocale;
00703 void init(
00704 NumberFormat *nfToAdopt,
00705 BreakIterator *brkIter,
00706 UErrorCode &status);
00707 UnicodeString& adjustForContext(UnicodeString &) const;
00708 UBool checkNoAdjustForContext(UErrorCode& status) const;
00709
00710 template<typename F, typename... Args>
00711 UnicodeString& doFormat(
00712 F callback,
00713 UnicodeString& appendTo,
00714 UErrorCode& status,
00715 Args... args) const;
00716
00717 template<typename F, typename... Args>
00718 FormattedRelativeDateTime doFormatToValue(
00719 F callback,
00720 UErrorCode& status,
00721 Args... args) const;
00722
00723 void formatImpl(
00724 double quantity,
00725 UDateDirection direction,
00726 UDateRelativeUnit unit,
00727 FormattedRelativeDateTimeData& output,
00728 UErrorCode& status) const;
00729 void formatAbsoluteImpl(
00730 UDateDirection direction,
00731 UDateAbsoluteUnit unit,
00732 FormattedRelativeDateTimeData& output,
00733 UErrorCode& status) const;
00734 void formatNumericImpl(
00735 double offset,
00736 URelativeDateTimeUnit unit,
00737 FormattedRelativeDateTimeData& output,
00738 UErrorCode& status) const;
00739 void formatRelativeImpl(
00740 double offset,
00741 URelativeDateTimeUnit unit,
00742 FormattedRelativeDateTimeData& output,
00743 UErrorCode& status) const;
00744 };
00745
00746 U_NAMESPACE_END
00747
00748 #endif
00749 #endif
00750
00751 #endif
00752
00753 #endif