Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(202)

Side by Side Diff: source/i18n/datefmt.cpp

Issue 1621843002: ICU 56 update step 1 (Closed) Base URL: https://chromium.googlesource.com/chromium/deps/icu.git@561
Patch Set: Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « source/i18n/currpinf.cpp ('k') | source/i18n/dcfmtsym.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 ******************************************************************************* 2 *******************************************************************************
3 * Copyright (C) 1997-2014, International Business Machines Corporation and * 3 * Copyright (C) 1997-2015, International Business Machines Corporation and *
4 * others. All Rights Reserved. * 4 * others. All Rights Reserved. *
5 ******************************************************************************* 5 *******************************************************************************
6 * 6 *
7 * File DATEFMT.CPP 7 * File DATEFMT.CPP
8 * 8 *
9 * Modification History: 9 * Modification History:
10 * 10 *
11 * Date Name Description 11 * Date Name Description
12 * 02/19/97 aliu Converted from java. 12 * 02/19/97 aliu Converted from java.
13 * 03/31/97 aliu Modified extensively to work with 50 locales. 13 * 03/31/97 aliu Modified extensively to work with 50 locales.
14 * 04/01/97 aliu Added support for centuries. 14 * 04/01/97 aliu Added support for centuries.
15 * 08/12/97 aliu Fixed operator== to use Calendar::equivalentTo. 15 * 08/12/97 aliu Fixed operator== to use Calendar::equivalentTo.
16 * 07/20/98 stephen Changed ParsePosition initialization 16 * 07/20/98 stephen Changed ParsePosition initialization
17 ******************************************************************************* * 17 ******************************************************************************* *
18 */ 18 */
19 19
20 #include "unicode/utypes.h" 20 #include "unicode/utypes.h"
21 21
22 #if !UCONFIG_NO_FORMATTING 22 #if !UCONFIG_NO_FORMATTING
23 23
24 #include "unicode/ures.h" 24 #include "unicode/ures.h"
25 #include "unicode/datefmt.h" 25 #include "unicode/datefmt.h"
26 #include "unicode/smpdtfmt.h" 26 #include "unicode/smpdtfmt.h"
27 #include "unicode/dtptngen.h" 27 #include "unicode/dtptngen.h"
28 #include "unicode/udisplaycontext.h" 28 #include "unicode/udisplaycontext.h"
29 #include "reldtfmt.h" 29 #include "reldtfmt.h"
30 #include "sharedobject.h"
31 #include "unifiedcache.h"
32 #include "uarrsort.h"
30 33
31 #include "cstring.h" 34 #include "cstring.h"
32 #include "windtfmt.h" 35 #include "windtfmt.h"
33 36
34 #if defined( U_DEBUG_CALSVC ) || defined (U_DEBUG_CAL) 37 #if defined( U_DEBUG_CALSVC ) || defined (U_DEBUG_CAL)
35 #include <stdio.h> 38 #include <stdio.h>
36 #endif 39 #endif
37 40
38 // ***************************************************************************** 41 // *****************************************************************************
39 // class DateFormat 42 // class DateFormat
40 // ***************************************************************************** 43 // *****************************************************************************
41 44
42 U_NAMESPACE_BEGIN 45 U_NAMESPACE_BEGIN
43 46
47 class U_I18N_API DateFmtBestPattern : public SharedObject {
48 public:
49 UnicodeString fPattern;
50
51 DateFmtBestPattern(const UnicodeString &pattern)
52 : fPattern(pattern) { }
53 ~DateFmtBestPattern();
54 };
55
56 DateFmtBestPattern::~DateFmtBestPattern() {
57 }
58
59 template<> U_I18N_API
60 const DateFmtBestPattern *LocaleCacheKey<DateFmtBestPattern>::createObject(
61 const void * /*creationContext*/, UErrorCode &status) const {
62 status = U_UNSUPPORTED_ERROR;
63 return NULL;
64 }
65
66 class U_I18N_API DateFmtBestPatternKey : public LocaleCacheKey<DateFmtBestPatter n> {
67 private:
68 UnicodeString fSkeleton;
69 public:
70 DateFmtBestPatternKey(
71 const Locale &loc,
72 const UnicodeString &skeleton,
73 UErrorCode &status)
74 : LocaleCacheKey<DateFmtBestPattern>(loc),
75 fSkeleton(DateTimePatternGenerator::staticGetSkeleton(skeleton, st atus)) { }
76 DateFmtBestPatternKey(const DateFmtBestPatternKey &other) :
77 LocaleCacheKey<DateFmtBestPattern>(other),
78 fSkeleton(other.fSkeleton) { }
79 virtual ~DateFmtBestPatternKey();
80 virtual int32_t hashCode() const {
81 return 37 * LocaleCacheKey<DateFmtBestPattern>::hashCode() + fSkeleton.h ashCode();
82 }
83 virtual UBool operator==(const CacheKeyBase &other) const {
84 // reflexive
85 if (this == &other) {
86 return TRUE;
87 }
88 if (!LocaleCacheKey<DateFmtBestPattern>::operator==(other)) {
89 return FALSE;
90 }
91 // We know that this and other are of same class if we get this far.
92 const DateFmtBestPatternKey &realOther =
93 static_cast<const DateFmtBestPatternKey &>(other);
94 return (realOther.fSkeleton == fSkeleton);
95 }
96 virtual CacheKeyBase *clone() const {
97 return new DateFmtBestPatternKey(*this);
98 }
99 virtual const DateFmtBestPattern *createObject(
100 const void * /*unused*/, UErrorCode &status) const {
101 LocalPointer<DateTimePatternGenerator> dtpg(
102 DateTimePatternGenerator::createInstance(fLoc, status));
103 if (U_FAILURE(status)) {
104 return NULL;
105 }
106
107 LocalPointer<DateFmtBestPattern> pattern(
108 new DateFmtBestPattern(
109 dtpg->getBestPattern(fSkeleton, status)),
110 status);
111 if (U_FAILURE(status)) {
112 return NULL;
113 }
114 DateFmtBestPattern *result = pattern.orphan();
115 result->addRef();
116 return result;
117 }
118 };
119
120 DateFmtBestPatternKey::~DateFmtBestPatternKey() { }
121
122
44 DateFormat::DateFormat() 123 DateFormat::DateFormat()
45 : fCalendar(0), 124 : fCalendar(0),
46 fNumberFormat(0), 125 fNumberFormat(0),
47 fCapitalizationContext(UDISPCTX_CAPITALIZATION_NONE) 126 fCapitalizationContext(UDISPCTX_CAPITALIZATION_NONE)
48 { 127 {
49 } 128 }
50 129
51 //---------------------------------------------------------------------- 130 //----------------------------------------------------------------------
52 131
53 DateFormat::DateFormat(const DateFormat& other) 132 DateFormat::DateFormat(const DateFormat& other)
(...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after
302 { 381 {
303 result.setDate(parse(source, pos)); 382 result.setDate(parse(source, pos));
304 } 383 }
305 384
306 //---------------------------------------------------------------------- 385 //----------------------------------------------------------------------
307 386
308 DateFormat* U_EXPORT2 387 DateFormat* U_EXPORT2
309 DateFormat::createTimeInstance(DateFormat::EStyle style, 388 DateFormat::createTimeInstance(DateFormat::EStyle style,
310 const Locale& aLocale) 389 const Locale& aLocale)
311 { 390 {
312 return create(style, kNone, aLocale); 391 return createDateTimeInstance(kNone, style, aLocale);
313 } 392 }
314 393
315 //---------------------------------------------------------------------- 394 //----------------------------------------------------------------------
316 395
317 DateFormat* U_EXPORT2 396 DateFormat* U_EXPORT2
318 DateFormat::createDateInstance(DateFormat::EStyle style, 397 DateFormat::createDateInstance(DateFormat::EStyle style,
319 const Locale& aLocale) 398 const Locale& aLocale)
320 { 399 {
321 // +4 to set the correct index for getting data out of 400 return createDateTimeInstance(style, kNone, aLocale);
322 // LocaleElements.
323 if(style != kNone)
324 {
325 style = (EStyle) (style + kDateOffset);
326 }
327 return create(kNone, (EStyle) (style), aLocale);
328 } 401 }
329 402
330 //---------------------------------------------------------------------- 403 //----------------------------------------------------------------------
331 404
332 DateFormat* U_EXPORT2 405 DateFormat* U_EXPORT2
333 DateFormat::createDateTimeInstance(EStyle dateStyle, 406 DateFormat::createDateTimeInstance(EStyle dateStyle,
334 EStyle timeStyle, 407 EStyle timeStyle,
335 const Locale& aLocale) 408 const Locale& aLocale)
336 { 409 {
337 if(dateStyle != kNone) 410 if(dateStyle != kNone)
338 { 411 {
339 dateStyle = (EStyle) (dateStyle + kDateOffset); 412 dateStyle = (EStyle) (dateStyle + kDateOffset);
340 } 413 }
341 return create(timeStyle, dateStyle, aLocale); 414 return create(timeStyle, dateStyle, aLocale);
342 } 415 }
343 416
344 //---------------------------------------------------------------------- 417 //----------------------------------------------------------------------
345 418
346 DateFormat* U_EXPORT2 419 DateFormat* U_EXPORT2
347 DateFormat::createInstance() 420 DateFormat::createInstance()
348 { 421 {
349 return create(kShort, (EStyle) (kShort + kDateOffset), Locale::getDefault()) ; 422 return createDateTimeInstance(kShort, kShort, Locale::getDefault());
350 } 423 }
351 424
352 //---------------------------------------------------------------------- 425 //----------------------------------------------------------------------
426
427 UnicodeString U_EXPORT2
428 DateFormat::getBestPattern(
429 const Locale &locale,
430 const UnicodeString &skeleton,
431 UErrorCode &status) {
432 UnifiedCache *cache = UnifiedCache::getInstance(status);
433 if (U_FAILURE(status)) {
434 return UnicodeString();
435 }
436 DateFmtBestPatternKey key(locale, skeleton, status);
437 const DateFmtBestPattern *patternPtr = NULL;
438 cache->get(key, patternPtr, status);
439 if (U_FAILURE(status)) {
440 return UnicodeString();
441 }
442 UnicodeString result(patternPtr->fPattern);
443 patternPtr->removeRef();
444 return result;
445 }
446
447 DateFormat* U_EXPORT2
448 DateFormat::createInstanceForSkeleton(
449 Calendar *calendarToAdopt,
450 const UnicodeString& skeleton,
451 const Locale &locale,
452 UErrorCode &status) {
453 LocalPointer<Calendar> calendar(calendarToAdopt);
454 if (U_FAILURE(status)) {
455 return NULL;
456 }
457 if (calendar.isNull()) {
458 status = U_ILLEGAL_ARGUMENT_ERROR;
459 return NULL;
460 }
461 DateFormat *result = createInstanceForSkeleton(skeleton, locale, status);
462 if (U_FAILURE(status)) {
463 return NULL;
464 }
465 result->adoptCalendar(calendar.orphan());
466 return result;
467 }
468
469 DateFormat* U_EXPORT2
470 DateFormat::createInstanceForSkeleton(
471 const UnicodeString& skeleton,
472 const Locale &locale,
473 UErrorCode &status) {
474 if (U_FAILURE(status)) {
475 return NULL;
476 }
477 LocalPointer<DateFormat> df(
478 new SimpleDateFormat(
479 getBestPattern(locale, skeleton, status),
480 locale, status),
481 status);
482 return U_SUCCESS(status) ? df.orphan() : NULL;
483 }
484
485 DateFormat* U_EXPORT2
486 DateFormat::createInstanceForSkeleton(
487 const UnicodeString& skeleton,
488 UErrorCode &status) {
489 return createInstanceForSkeleton(
490 skeleton, Locale::getDefault(), status);
491 }
492
493 //----------------------------------------------------------------------
353 494
354 DateFormat* U_EXPORT2 495 DateFormat* U_EXPORT2
355 DateFormat::create(EStyle timeStyle, EStyle dateStyle, const Locale& locale) 496 DateFormat::create(EStyle timeStyle, EStyle dateStyle, const Locale& locale)
356 { 497 {
357 UErrorCode status = U_ZERO_ERROR; 498 UErrorCode status = U_ZERO_ERROR;
358 #if U_PLATFORM_HAS_WIN32_API 499 #if U_PLATFORM_HAS_WIN32_API
359 char buffer[8]; 500 char buffer[8];
360 int32_t count = locale.getKeywordValue("compat", buffer, sizeof(buffer), sta tus); 501 int32_t count = locale.getKeywordValue("compat", buffer, sizeof(buffer), sta tus);
361 502
362 // if the locale has "@compat=host", create a host-specific DateFormat... 503 // if the locale has "@compat=host", create a host-specific DateFormat...
(...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after
596 DateFormat::getBooleanAttribute(UDateFormatBooleanAttribute attr, UErrorCode &/* status*/) const { 737 DateFormat::getBooleanAttribute(UDateFormatBooleanAttribute attr, UErrorCode &/* status*/) const {
597 738
598 return fBoolFlags.get(attr); 739 return fBoolFlags.get(attr);
599 } 740 }
600 741
601 U_NAMESPACE_END 742 U_NAMESPACE_END
602 743
603 #endif /* #if !UCONFIG_NO_FORMATTING */ 744 #endif /* #if !UCONFIG_NO_FORMATTING */
604 745
605 //eof 746 //eof
OLDNEW
« no previous file with comments | « source/i18n/currpinf.cpp ('k') | source/i18n/dcfmtsym.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698