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); |
} |
//---------------------------------------------------------------------- |