| Index: source/i18n/datefmt.cpp
|
| diff --git a/source/i18n/datefmt.cpp b/source/i18n/datefmt.cpp
|
| index e205bf755f3ea31cea95fd22496c1b9fd868e4be..4f7a1046ea01c2a58833039ba80775d593cdc45a 100644
|
| --- a/source/i18n/datefmt.cpp
|
| +++ b/source/i18n/datefmt.cpp
|
| @@ -1,6 +1,6 @@
|
| /*
|
| *******************************************************************************
|
| - * Copyright (C) 1997-2014, International Business Machines Corporation and *
|
| + * Copyright (C) 1997-2015, International Business Machines Corporation and *
|
| * others. All Rights Reserved. *
|
| *******************************************************************************
|
| *
|
| @@ -27,6 +27,9 @@
|
| #include "unicode/dtptngen.h"
|
| #include "unicode/udisplaycontext.h"
|
| #include "reldtfmt.h"
|
| +#include "sharedobject.h"
|
| +#include "unifiedcache.h"
|
| +#include "uarrsort.h"
|
|
|
| #include "cstring.h"
|
| #include "windtfmt.h"
|
| @@ -41,6 +44,82 @@
|
|
|
| U_NAMESPACE_BEGIN
|
|
|
| +class U_I18N_API DateFmtBestPattern : public SharedObject {
|
| +public:
|
| + UnicodeString fPattern;
|
| +
|
| + DateFmtBestPattern(const UnicodeString &pattern)
|
| + : fPattern(pattern) { }
|
| + ~DateFmtBestPattern();
|
| +};
|
| +
|
| +DateFmtBestPattern::~DateFmtBestPattern() {
|
| +}
|
| +
|
| +template<> U_I18N_API
|
| +const DateFmtBestPattern *LocaleCacheKey<DateFmtBestPattern>::createObject(
|
| + const void * /*creationContext*/, UErrorCode &status) const {
|
| + status = U_UNSUPPORTED_ERROR;
|
| + return NULL;
|
| +}
|
| +
|
| +class U_I18N_API DateFmtBestPatternKey : public LocaleCacheKey<DateFmtBestPattern> {
|
| +private:
|
| + UnicodeString fSkeleton;
|
| +public:
|
| + DateFmtBestPatternKey(
|
| + const Locale &loc,
|
| + const UnicodeString &skeleton,
|
| + UErrorCode &status)
|
| + : LocaleCacheKey<DateFmtBestPattern>(loc),
|
| + fSkeleton(DateTimePatternGenerator::staticGetSkeleton(skeleton, status)) { }
|
| + DateFmtBestPatternKey(const DateFmtBestPatternKey &other) :
|
| + LocaleCacheKey<DateFmtBestPattern>(other),
|
| + fSkeleton(other.fSkeleton) { }
|
| + virtual ~DateFmtBestPatternKey();
|
| + virtual int32_t hashCode() const {
|
| + return 37 * LocaleCacheKey<DateFmtBestPattern>::hashCode() + fSkeleton.hashCode();
|
| + }
|
| + virtual UBool operator==(const CacheKeyBase &other) const {
|
| + // reflexive
|
| + if (this == &other) {
|
| + return TRUE;
|
| + }
|
| + if (!LocaleCacheKey<DateFmtBestPattern>::operator==(other)) {
|
| + return FALSE;
|
| + }
|
| + // We know that this and other are of same class if we get this far.
|
| + const DateFmtBestPatternKey &realOther =
|
| + static_cast<const DateFmtBestPatternKey &>(other);
|
| + return (realOther.fSkeleton == fSkeleton);
|
| + }
|
| + virtual CacheKeyBase *clone() const {
|
| + return new DateFmtBestPatternKey(*this);
|
| + }
|
| + virtual const DateFmtBestPattern *createObject(
|
| + const void * /*unused*/, UErrorCode &status) const {
|
| + LocalPointer<DateTimePatternGenerator> dtpg(
|
| + DateTimePatternGenerator::createInstance(fLoc, status));
|
| + if (U_FAILURE(status)) {
|
| + return NULL;
|
| + }
|
| +
|
| + LocalPointer<DateFmtBestPattern> pattern(
|
| + new DateFmtBestPattern(
|
| + dtpg->getBestPattern(fSkeleton, status)),
|
| + status);
|
| + if (U_FAILURE(status)) {
|
| + return NULL;
|
| + }
|
| + DateFmtBestPattern *result = pattern.orphan();
|
| + result->addRef();
|
| + return result;
|
| + }
|
| +};
|
| +
|
| +DateFmtBestPatternKey::~DateFmtBestPatternKey() { }
|
| +
|
| +
|
| DateFormat::DateFormat()
|
| : fCalendar(0),
|
| fNumberFormat(0),
|
| @@ -309,7 +388,7 @@ DateFormat* U_EXPORT2
|
| DateFormat::createTimeInstance(DateFormat::EStyle style,
|
| const Locale& aLocale)
|
| {
|
| - return create(style, kNone, aLocale);
|
| + return createDateTimeInstance(kNone, style, aLocale);
|
| }
|
|
|
| //----------------------------------------------------------------------
|
| @@ -318,13 +397,7 @@ DateFormat* U_EXPORT2
|
| DateFormat::createDateInstance(DateFormat::EStyle style,
|
| const Locale& aLocale)
|
| {
|
| - // +4 to set the correct index for getting data out of
|
| - // LocaleElements.
|
| - if(style != kNone)
|
| - {
|
| - style = (EStyle) (style + kDateOffset);
|
| - }
|
| - return create(kNone, (EStyle) (style), aLocale);
|
| + return createDateTimeInstance(style, kNone, aLocale);
|
| }
|
|
|
| //----------------------------------------------------------------------
|
| @@ -334,11 +407,11 @@ DateFormat::createDateTimeInstance(EStyle dateStyle,
|
| EStyle timeStyle,
|
| const Locale& aLocale)
|
| {
|
| - if(dateStyle != kNone)
|
| - {
|
| - dateStyle = (EStyle) (dateStyle + kDateOffset);
|
| - }
|
| - return create(timeStyle, dateStyle, aLocale);
|
| + if(dateStyle != kNone)
|
| + {
|
| + dateStyle = (EStyle) (dateStyle + kDateOffset);
|
| + }
|
| + return create(timeStyle, dateStyle, aLocale);
|
| }
|
|
|
| //----------------------------------------------------------------------
|
| @@ -346,7 +419,75 @@ DateFormat::createDateTimeInstance(EStyle dateStyle,
|
| DateFormat* U_EXPORT2
|
| DateFormat::createInstance()
|
| {
|
| - return create(kShort, (EStyle) (kShort + kDateOffset), Locale::getDefault());
|
| + return createDateTimeInstance(kShort, kShort, Locale::getDefault());
|
| +}
|
| +
|
| +//----------------------------------------------------------------------
|
| +
|
| +UnicodeString U_EXPORT2
|
| +DateFormat::getBestPattern(
|
| + const Locale &locale,
|
| + const UnicodeString &skeleton,
|
| + UErrorCode &status) {
|
| + UnifiedCache *cache = UnifiedCache::getInstance(status);
|
| + if (U_FAILURE(status)) {
|
| + return UnicodeString();
|
| + }
|
| + DateFmtBestPatternKey key(locale, skeleton, status);
|
| + const DateFmtBestPattern *patternPtr = NULL;
|
| + cache->get(key, patternPtr, status);
|
| + if (U_FAILURE(status)) {
|
| + return UnicodeString();
|
| + }
|
| + UnicodeString result(patternPtr->fPattern);
|
| + patternPtr->removeRef();
|
| + return result;
|
| +}
|
| +
|
| +DateFormat* U_EXPORT2
|
| +DateFormat::createInstanceForSkeleton(
|
| + Calendar *calendarToAdopt,
|
| + const UnicodeString& skeleton,
|
| + const Locale &locale,
|
| + UErrorCode &status) {
|
| + LocalPointer<Calendar> calendar(calendarToAdopt);
|
| + if (U_FAILURE(status)) {
|
| + return NULL;
|
| + }
|
| + if (calendar.isNull()) {
|
| + status = U_ILLEGAL_ARGUMENT_ERROR;
|
| + return NULL;
|
| + }
|
| + DateFormat *result = createInstanceForSkeleton(skeleton, locale, status);
|
| + if (U_FAILURE(status)) {
|
| + return NULL;
|
| + }
|
| + result->adoptCalendar(calendar.orphan());
|
| + return result;
|
| +}
|
| +
|
| +DateFormat* U_EXPORT2
|
| +DateFormat::createInstanceForSkeleton(
|
| + const UnicodeString& skeleton,
|
| + const Locale &locale,
|
| + UErrorCode &status) {
|
| + if (U_FAILURE(status)) {
|
| + return NULL;
|
| + }
|
| + LocalPointer<DateFormat> df(
|
| + new SimpleDateFormat(
|
| + getBestPattern(locale, skeleton, status),
|
| + locale, status),
|
| + status);
|
| + return U_SUCCESS(status) ? df.orphan() : NULL;
|
| +}
|
| +
|
| +DateFormat* U_EXPORT2
|
| +DateFormat::createInstanceForSkeleton(
|
| + const UnicodeString& skeleton,
|
| + UErrorCode &status) {
|
| + return createInstanceForSkeleton(
|
| + skeleton, Locale::getDefault(), status);
|
| }
|
|
|
| //----------------------------------------------------------------------
|
|
|