ICU 73.2  73.2
reldatefmt.h
Go to the documentation of this file.
00001 // © 2016 and later: Unicode, Inc. and others.
00002 // License & terms of use: http://www.unicode.org/copyright.html
00003 /*
00004 *****************************************************************************
00005 * Copyright (C) 2014-2016, International Business Machines Corporation and
00006 * others.
00007 * All Rights Reserved.
00008 *****************************************************************************
00009 *
00010 * File RELDATEFMT.H
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     // Days of week have to remain together and in order from Sunday to
00099     // Saturday.
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) noexcept;
00287 
00292     virtual ~FormattedRelativeDateTime() override;
00293 
00295     FormattedRelativeDateTime(const FormattedRelativeDateTime&) = delete;
00296 
00298     FormattedRelativeDateTime& operator=(const FormattedRelativeDateTime&) = delete;
00299 
00304     FormattedRelativeDateTime& operator=(FormattedRelativeDateTime&& src) noexcept;
00305 
00307     UnicodeString toString(UErrorCode& status) const override;
00308 
00310     UnicodeString toTempString(UErrorCode& status) const override;
00311 
00313     Appendable &appendTo(Appendable& appendable, UErrorCode& status) const override;
00314 
00316     UBool nextPosition(ConstrainedFieldPosition& cfpos, UErrorCode& status) const 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 /* !UCONFIG_NO_BREAK_ITERATION */
00747 #endif /* !UCONFIG_NO_FORMATTING */
00748 
00749 #endif /* U_SHOW_CPLUSPLUS_API */
00750 
00751 #endif /* __RELDATEFMT_H */