DateFmtPerf.h revision 27f654740f2a26ad62a5c155af9199af9e69b889
127f654740f2a26ad62a5c155af9199af9e69b889claireho/* 227f654740f2a26ad62a5c155af9199af9e69b889claireho********************************************************************** 327f654740f2a26ad62a5c155af9199af9e69b889claireho* Copyright (c) 2002-2010,International Business Machines 427f654740f2a26ad62a5c155af9199af9e69b889claireho* Corporation and others. All Rights Reserved. 527f654740f2a26ad62a5c155af9199af9e69b889claireho********************************************************************** 627f654740f2a26ad62a5c155af9199af9e69b889claireho********************************************************************** 727f654740f2a26ad62a5c155af9199af9e69b889claireho*/ 827f654740f2a26ad62a5c155af9199af9e69b889claireho 927f654740f2a26ad62a5c155af9199af9e69b889claireho#ifndef _DATEFMTPERF_H 1027f654740f2a26ad62a5c155af9199af9e69b889claireho#define _DATEFMTPERF_H 1127f654740f2a26ad62a5c155af9199af9e69b889claireho 1227f654740f2a26ad62a5c155af9199af9e69b889claireho 1327f654740f2a26ad62a5c155af9199af9e69b889claireho#include "unicode/stringpiece.h" 1427f654740f2a26ad62a5c155af9199af9e69b889claireho#include "unicode/unistr.h" 1527f654740f2a26ad62a5c155af9199af9e69b889claireho#include "unicode/uperf.h" 1627f654740f2a26ad62a5c155af9199af9e69b889claireho 1727f654740f2a26ad62a5c155af9199af9e69b889claireho#include "unicode/utypes.h" 1827f654740f2a26ad62a5c155af9199af9e69b889claireho#include "unicode/datefmt.h" 1927f654740f2a26ad62a5c155af9199af9e69b889claireho#include "unicode/calendar.h" 2027f654740f2a26ad62a5c155af9199af9e69b889claireho#include "unicode/uclean.h" 2127f654740f2a26ad62a5c155af9199af9e69b889claireho#include "unicode/brkiter.h" 2227f654740f2a26ad62a5c155af9199af9e69b889claireho#include "unicode/numfmt.h" 2327f654740f2a26ad62a5c155af9199af9e69b889claireho#include "unicode/coll.h" 2427f654740f2a26ad62a5c155af9199af9e69b889claireho#include "util.h" 2527f654740f2a26ad62a5c155af9199af9e69b889claireho 2627f654740f2a26ad62a5c155af9199af9e69b889claireho#include "datedata.h" 2727f654740f2a26ad62a5c155af9199af9e69b889claireho#include "breakdata.h" 2827f654740f2a26ad62a5c155af9199af9e69b889claireho#include "collationdata.h" 2927f654740f2a26ad62a5c155af9199af9e69b889claireho 3027f654740f2a26ad62a5c155af9199af9e69b889claireho#include <stdlib.h> 3127f654740f2a26ad62a5c155af9199af9e69b889claireho#include <fstream> 3227f654740f2a26ad62a5c155af9199af9e69b889claireho#include <string> 3327f654740f2a26ad62a5c155af9199af9e69b889claireho 3427f654740f2a26ad62a5c155af9199af9e69b889claireho#include <iostream> 3527f654740f2a26ad62a5c155af9199af9e69b889clairehousing namespace std; 3627f654740f2a26ad62a5c155af9199af9e69b889claireho 3727f654740f2a26ad62a5c155af9199af9e69b889claireho// Stubs for Windows API functions when building on UNIXes. 3827f654740f2a26ad62a5c155af9199af9e69b889claireho// 3927f654740f2a26ad62a5c155af9199af9e69b889claireho#if defined(U_WINDOWS) 4027f654740f2a26ad62a5c155af9199af9e69b889claireho// do nothing 4127f654740f2a26ad62a5c155af9199af9e69b889claireho#else 4227f654740f2a26ad62a5c155af9199af9e69b889claireho#define _UNICODE 4327f654740f2a26ad62a5c155af9199af9e69b889clairehotypedef int DWORD; 4427f654740f2a26ad62a5c155af9199af9e69b889clairehoinline int FoldStringW(DWORD dwMapFlags, const UChar* lpSrcStr,int cchSrc, UChar* lpDestStr,int cchDest); 4527f654740f2a26ad62a5c155af9199af9e69b889claireho#endif 4627f654740f2a26ad62a5c155af9199af9e69b889claireho 4727f654740f2a26ad62a5c155af9199af9e69b889clairehoclass BreakItFunction : public UPerfFunction 4827f654740f2a26ad62a5c155af9199af9e69b889claireho{ 4927f654740f2a26ad62a5c155af9199af9e69b889clairehoprivate: 5027f654740f2a26ad62a5c155af9199af9e69b889claireho int num; 5127f654740f2a26ad62a5c155af9199af9e69b889claireho bool wordIteration; 5227f654740f2a26ad62a5c155af9199af9e69b889claireho 5327f654740f2a26ad62a5c155af9199af9e69b889clairehopublic: 5427f654740f2a26ad62a5c155af9199af9e69b889claireho 5527f654740f2a26ad62a5c155af9199af9e69b889claireho BreakItFunction(){num = -1;} 5627f654740f2a26ad62a5c155af9199af9e69b889claireho BreakItFunction(int a, bool b){num = a; wordIteration = b;} 5727f654740f2a26ad62a5c155af9199af9e69b889claireho 5827f654740f2a26ad62a5c155af9199af9e69b889claireho virtual void call(UErrorCode *status) 5927f654740f2a26ad62a5c155af9199af9e69b889claireho { 6027f654740f2a26ad62a5c155af9199af9e69b889claireho BreakIterator* boundary; 6127f654740f2a26ad62a5c155af9199af9e69b889claireho 6227f654740f2a26ad62a5c155af9199af9e69b889claireho if(wordIteration) 6327f654740f2a26ad62a5c155af9199af9e69b889claireho { 6427f654740f2a26ad62a5c155af9199af9e69b889claireho for(int i = 0; i < num; i++) 6527f654740f2a26ad62a5c155af9199af9e69b889claireho { 6627f654740f2a26ad62a5c155af9199af9e69b889claireho boundary = BreakIterator::createWordInstance("en", *status); 6727f654740f2a26ad62a5c155af9199af9e69b889claireho boundary->setText(str); 6827f654740f2a26ad62a5c155af9199af9e69b889claireho 6927f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t start = boundary->first(); 7027f654740f2a26ad62a5c155af9199af9e69b889claireho for (int32_t end = boundary->next(); 7127f654740f2a26ad62a5c155af9199af9e69b889claireho end != BreakIterator::DONE; 7227f654740f2a26ad62a5c155af9199af9e69b889claireho start = end, end = boundary->next()) 7327f654740f2a26ad62a5c155af9199af9e69b889claireho { 7427f654740f2a26ad62a5c155af9199af9e69b889claireho printTextRange( *boundary, start, end ); 7527f654740f2a26ad62a5c155af9199af9e69b889claireho } 7627f654740f2a26ad62a5c155af9199af9e69b889claireho } 7727f654740f2a26ad62a5c155af9199af9e69b889claireho } 7827f654740f2a26ad62a5c155af9199af9e69b889claireho 7927f654740f2a26ad62a5c155af9199af9e69b889claireho else // character iteration 8027f654740f2a26ad62a5c155af9199af9e69b889claireho { 8127f654740f2a26ad62a5c155af9199af9e69b889claireho for(int i = 0; i < num; i++) 8227f654740f2a26ad62a5c155af9199af9e69b889claireho { 8327f654740f2a26ad62a5c155af9199af9e69b889claireho boundary = BreakIterator::createCharacterInstance(Locale::getUS(), *status); 8427f654740f2a26ad62a5c155af9199af9e69b889claireho boundary->setText(str); 8527f654740f2a26ad62a5c155af9199af9e69b889claireho 8627f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t start = boundary->first(); 8727f654740f2a26ad62a5c155af9199af9e69b889claireho for (int32_t end = boundary->next(); 8827f654740f2a26ad62a5c155af9199af9e69b889claireho end != BreakIterator::DONE; 8927f654740f2a26ad62a5c155af9199af9e69b889claireho start = end, end = boundary->next()) 9027f654740f2a26ad62a5c155af9199af9e69b889claireho { 9127f654740f2a26ad62a5c155af9199af9e69b889claireho printTextRange( *boundary, start, end ); 9227f654740f2a26ad62a5c155af9199af9e69b889claireho } 9327f654740f2a26ad62a5c155af9199af9e69b889claireho } 9427f654740f2a26ad62a5c155af9199af9e69b889claireho } 9527f654740f2a26ad62a5c155af9199af9e69b889claireho 9627f654740f2a26ad62a5c155af9199af9e69b889claireho 9727f654740f2a26ad62a5c155af9199af9e69b889claireho } 9827f654740f2a26ad62a5c155af9199af9e69b889claireho 9927f654740f2a26ad62a5c155af9199af9e69b889claireho virtual long getOperationsPerIteration() 10027f654740f2a26ad62a5c155af9199af9e69b889claireho { 10127f654740f2a26ad62a5c155af9199af9e69b889claireho if(wordIteration) return 125*num; 10227f654740f2a26ad62a5c155af9199af9e69b889claireho else return 355*num; 10327f654740f2a26ad62a5c155af9199af9e69b889claireho } 10427f654740f2a26ad62a5c155af9199af9e69b889claireho 10527f654740f2a26ad62a5c155af9199af9e69b889claireho void printUnicodeString(const UnicodeString &s) { 10627f654740f2a26ad62a5c155af9199af9e69b889claireho char charBuf[1000]; 10727f654740f2a26ad62a5c155af9199af9e69b889claireho s.extract(0, s.length(), charBuf, sizeof(charBuf)-1, 0); 10827f654740f2a26ad62a5c155af9199af9e69b889claireho charBuf[sizeof(charBuf)-1] = 0; 10927f654740f2a26ad62a5c155af9199af9e69b889claireho printf("%s", charBuf); 11027f654740f2a26ad62a5c155af9199af9e69b889claireho } 11127f654740f2a26ad62a5c155af9199af9e69b889claireho 11227f654740f2a26ad62a5c155af9199af9e69b889claireho 11327f654740f2a26ad62a5c155af9199af9e69b889claireho void printTextRange( BreakIterator& iterator, 11427f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t start, int32_t end ) 11527f654740f2a26ad62a5c155af9199af9e69b889claireho { 11627f654740f2a26ad62a5c155af9199af9e69b889claireho CharacterIterator *strIter = iterator.getText().clone(); 11727f654740f2a26ad62a5c155af9199af9e69b889claireho UnicodeString s; 11827f654740f2a26ad62a5c155af9199af9e69b889claireho strIter->getText(s); 11927f654740f2a26ad62a5c155af9199af9e69b889claireho //printUnicodeString(UnicodeString(s, start, end-start)); 12027f654740f2a26ad62a5c155af9199af9e69b889claireho //puts(""); 12127f654740f2a26ad62a5c155af9199af9e69b889claireho delete strIter; 12227f654740f2a26ad62a5c155af9199af9e69b889claireho } 12327f654740f2a26ad62a5c155af9199af9e69b889claireho 12427f654740f2a26ad62a5c155af9199af9e69b889claireho // Print the given string to stdout (for debugging purposes) 12527f654740f2a26ad62a5c155af9199af9e69b889claireho void uprintf(const UnicodeString &str) { 12627f654740f2a26ad62a5c155af9199af9e69b889claireho char *buf = 0; 12727f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t len = str.length(); 12827f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t bufLen = len + 16; 12927f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t actualLen; 13027f654740f2a26ad62a5c155af9199af9e69b889claireho buf = new char[bufLen + 1]; 13127f654740f2a26ad62a5c155af9199af9e69b889claireho actualLen = str.extract(0, len, buf/*, bufLen*/); // Default codepage conversion 13227f654740f2a26ad62a5c155af9199af9e69b889claireho buf[actualLen] = 0; 13327f654740f2a26ad62a5c155af9199af9e69b889claireho printf("%s", buf); 13427f654740f2a26ad62a5c155af9199af9e69b889claireho delete[] buf; 13527f654740f2a26ad62a5c155af9199af9e69b889claireho } 13627f654740f2a26ad62a5c155af9199af9e69b889claireho 13727f654740f2a26ad62a5c155af9199af9e69b889claireho}; 13827f654740f2a26ad62a5c155af9199af9e69b889claireho 13927f654740f2a26ad62a5c155af9199af9e69b889clairehoclass DateFmtFunction : public UPerfFunction 14027f654740f2a26ad62a5c155af9199af9e69b889claireho{ 14127f654740f2a26ad62a5c155af9199af9e69b889claireho 14227f654740f2a26ad62a5c155af9199af9e69b889clairehoprivate: 14327f654740f2a26ad62a5c155af9199af9e69b889claireho int num; 14427f654740f2a26ad62a5c155af9199af9e69b889claireho char locale[25]; 14527f654740f2a26ad62a5c155af9199af9e69b889clairehopublic: 14627f654740f2a26ad62a5c155af9199af9e69b889claireho 14727f654740f2a26ad62a5c155af9199af9e69b889claireho DateFmtFunction() 14827f654740f2a26ad62a5c155af9199af9e69b889claireho { 14927f654740f2a26ad62a5c155af9199af9e69b889claireho num = -1; 15027f654740f2a26ad62a5c155af9199af9e69b889claireho } 15127f654740f2a26ad62a5c155af9199af9e69b889claireho 15227f654740f2a26ad62a5c155af9199af9e69b889claireho DateFmtFunction(int a, const char* loc) 15327f654740f2a26ad62a5c155af9199af9e69b889claireho { 15427f654740f2a26ad62a5c155af9199af9e69b889claireho num = a; 15527f654740f2a26ad62a5c155af9199af9e69b889claireho strcpy(locale, loc); 15627f654740f2a26ad62a5c155af9199af9e69b889claireho } 15727f654740f2a26ad62a5c155af9199af9e69b889claireho 15827f654740f2a26ad62a5c155af9199af9e69b889claireho virtual void call(UErrorCode* status) 15927f654740f2a26ad62a5c155af9199af9e69b889claireho { 16027f654740f2a26ad62a5c155af9199af9e69b889claireho 16127f654740f2a26ad62a5c155af9199af9e69b889claireho UErrorCode status2 = U_ZERO_ERROR; 16227f654740f2a26ad62a5c155af9199af9e69b889claireho Calendar *cal; 16327f654740f2a26ad62a5c155af9199af9e69b889claireho TimeZone *zone; 16427f654740f2a26ad62a5c155af9199af9e69b889claireho UnicodeString str; 16527f654740f2a26ad62a5c155af9199af9e69b889claireho UDate date; 16627f654740f2a26ad62a5c155af9199af9e69b889claireho 16727f654740f2a26ad62a5c155af9199af9e69b889claireho cal = Calendar::createInstance(status2); 16827f654740f2a26ad62a5c155af9199af9e69b889claireho check(status2, "Calendar::createInstance"); 16927f654740f2a26ad62a5c155af9199af9e69b889claireho zone = TimeZone::createTimeZone("GMT"); // Create a GMT zone 17027f654740f2a26ad62a5c155af9199af9e69b889claireho cal->adoptTimeZone(zone); 17127f654740f2a26ad62a5c155af9199af9e69b889claireho 17227f654740f2a26ad62a5c155af9199af9e69b889claireho Locale loc(locale); 17327f654740f2a26ad62a5c155af9199af9e69b889claireho DateFormat *fmt; 17427f654740f2a26ad62a5c155af9199af9e69b889claireho fmt = DateFormat::createDateTimeInstance( 17527f654740f2a26ad62a5c155af9199af9e69b889claireho DateFormat::kShort, DateFormat::kFull, loc); 17627f654740f2a26ad62a5c155af9199af9e69b889claireho 17727f654740f2a26ad62a5c155af9199af9e69b889claireho 17827f654740f2a26ad62a5c155af9199af9e69b889claireho // (dates are imported from datedata.h) 17927f654740f2a26ad62a5c155af9199af9e69b889claireho for(int j = 0; j < num; j++) 18027f654740f2a26ad62a5c155af9199af9e69b889claireho for(int i = 0; i < NUM_DATES; i++) 18127f654740f2a26ad62a5c155af9199af9e69b889claireho { 18227f654740f2a26ad62a5c155af9199af9e69b889claireho cal->clear(); 18327f654740f2a26ad62a5c155af9199af9e69b889claireho cal->set(years[i], months[i], days[i]); 18427f654740f2a26ad62a5c155af9199af9e69b889claireho date = cal->getTime(status2); 18527f654740f2a26ad62a5c155af9199af9e69b889claireho check(status2, "Calendar::getTime"); 18627f654740f2a26ad62a5c155af9199af9e69b889claireho 18727f654740f2a26ad62a5c155af9199af9e69b889claireho fmt->setCalendar(*cal); 18827f654740f2a26ad62a5c155af9199af9e69b889claireho 18927f654740f2a26ad62a5c155af9199af9e69b889claireho // Format the date 19027f654740f2a26ad62a5c155af9199af9e69b889claireho str.remove(); 19127f654740f2a26ad62a5c155af9199af9e69b889claireho fmt->format(date, str, status2); 19227f654740f2a26ad62a5c155af9199af9e69b889claireho 19327f654740f2a26ad62a5c155af9199af9e69b889claireho 19427f654740f2a26ad62a5c155af9199af9e69b889claireho // Display the formatted date string 19527f654740f2a26ad62a5c155af9199af9e69b889claireho //uprintf(str); 19627f654740f2a26ad62a5c155af9199af9e69b889claireho //printf("\n"); 19727f654740f2a26ad62a5c155af9199af9e69b889claireho 19827f654740f2a26ad62a5c155af9199af9e69b889claireho } 19927f654740f2a26ad62a5c155af9199af9e69b889claireho 20027f654740f2a26ad62a5c155af9199af9e69b889claireho delete fmt; 20127f654740f2a26ad62a5c155af9199af9e69b889claireho delete cal; 20227f654740f2a26ad62a5c155af9199af9e69b889claireho //u_cleanup(); 20327f654740f2a26ad62a5c155af9199af9e69b889claireho } 20427f654740f2a26ad62a5c155af9199af9e69b889claireho 20527f654740f2a26ad62a5c155af9199af9e69b889claireho virtual long getOperationsPerIteration() 20627f654740f2a26ad62a5c155af9199af9e69b889claireho { 20727f654740f2a26ad62a5c155af9199af9e69b889claireho return NUM_DATES * num; 20827f654740f2a26ad62a5c155af9199af9e69b889claireho } 20927f654740f2a26ad62a5c155af9199af9e69b889claireho 21027f654740f2a26ad62a5c155af9199af9e69b889claireho // Print the given string to stdout (for debugging purposes) 21127f654740f2a26ad62a5c155af9199af9e69b889claireho void uprintf(const UnicodeString &str) { 21227f654740f2a26ad62a5c155af9199af9e69b889claireho char *buf = 0; 21327f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t len = str.length(); 21427f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t bufLen = len + 16; 21527f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t actualLen; 21627f654740f2a26ad62a5c155af9199af9e69b889claireho buf = new char[bufLen + 1]; 21727f654740f2a26ad62a5c155af9199af9e69b889claireho actualLen = str.extract(0, len, buf/*, bufLen*/); // Default codepage conversion 21827f654740f2a26ad62a5c155af9199af9e69b889claireho buf[actualLen] = 0; 21927f654740f2a26ad62a5c155af9199af9e69b889claireho printf("%s", buf); 22027f654740f2a26ad62a5c155af9199af9e69b889claireho delete[] buf; 22127f654740f2a26ad62a5c155af9199af9e69b889claireho } 22227f654740f2a26ad62a5c155af9199af9e69b889claireho 22327f654740f2a26ad62a5c155af9199af9e69b889claireho // Verify that a UErrorCode is successful; exit(1) if not 22427f654740f2a26ad62a5c155af9199af9e69b889claireho void check(UErrorCode& status, const char* msg) { 22527f654740f2a26ad62a5c155af9199af9e69b889claireho if (U_FAILURE(status)) { 22627f654740f2a26ad62a5c155af9199af9e69b889claireho printf("ERROR: %s (%s)\n", u_errorName(status), msg); 22727f654740f2a26ad62a5c155af9199af9e69b889claireho exit(1); 22827f654740f2a26ad62a5c155af9199af9e69b889claireho } 22927f654740f2a26ad62a5c155af9199af9e69b889claireho } 23027f654740f2a26ad62a5c155af9199af9e69b889claireho 23127f654740f2a26ad62a5c155af9199af9e69b889claireho}; 23227f654740f2a26ad62a5c155af9199af9e69b889claireho 23327f654740f2a26ad62a5c155af9199af9e69b889clairehoclass NumFmtFunction : public UPerfFunction 23427f654740f2a26ad62a5c155af9199af9e69b889claireho{ 23527f654740f2a26ad62a5c155af9199af9e69b889claireho 23627f654740f2a26ad62a5c155af9199af9e69b889clairehoprivate: 23727f654740f2a26ad62a5c155af9199af9e69b889claireho int num; 23827f654740f2a26ad62a5c155af9199af9e69b889claireho char locale[25]; 23927f654740f2a26ad62a5c155af9199af9e69b889clairehopublic: 24027f654740f2a26ad62a5c155af9199af9e69b889claireho 24127f654740f2a26ad62a5c155af9199af9e69b889claireho NumFmtFunction() 24227f654740f2a26ad62a5c155af9199af9e69b889claireho { 24327f654740f2a26ad62a5c155af9199af9e69b889claireho num = -1; 24427f654740f2a26ad62a5c155af9199af9e69b889claireho } 24527f654740f2a26ad62a5c155af9199af9e69b889claireho 24627f654740f2a26ad62a5c155af9199af9e69b889claireho NumFmtFunction(int a, const char* loc) 24727f654740f2a26ad62a5c155af9199af9e69b889claireho { 24827f654740f2a26ad62a5c155af9199af9e69b889claireho num = a; 24927f654740f2a26ad62a5c155af9199af9e69b889claireho strcpy(locale, loc); 25027f654740f2a26ad62a5c155af9199af9e69b889claireho } 25127f654740f2a26ad62a5c155af9199af9e69b889claireho 25227f654740f2a26ad62a5c155af9199af9e69b889claireho virtual void call(UErrorCode* status2) 25327f654740f2a26ad62a5c155af9199af9e69b889claireho { 25427f654740f2a26ad62a5c155af9199af9e69b889claireho Locale loc(locale); 25527f654740f2a26ad62a5c155af9199af9e69b889claireho UErrorCode status = U_ZERO_ERROR; 25627f654740f2a26ad62a5c155af9199af9e69b889claireho 25727f654740f2a26ad62a5c155af9199af9e69b889claireho // Create a number formatter for the locale 25827f654740f2a26ad62a5c155af9199af9e69b889claireho NumberFormat *fmt = NumberFormat::createInstance(loc, status); 25927f654740f2a26ad62a5c155af9199af9e69b889claireho 26027f654740f2a26ad62a5c155af9199af9e69b889claireho // Parse a string. The string uses the digits '0' through '9' 26127f654740f2a26ad62a5c155af9199af9e69b889claireho // and the decimal separator '.', standard in the US locale 26227f654740f2a26ad62a5c155af9199af9e69b889claireho 26327f654740f2a26ad62a5c155af9199af9e69b889claireho for(int i = 0; i < num; i++) 26427f654740f2a26ad62a5c155af9199af9e69b889claireho { 26527f654740f2a26ad62a5c155af9199af9e69b889claireho UnicodeString str("9876543210.123"); 26627f654740f2a26ad62a5c155af9199af9e69b889claireho Formattable result; 26727f654740f2a26ad62a5c155af9199af9e69b889claireho fmt->parse(str, result, status); 26827f654740f2a26ad62a5c155af9199af9e69b889claireho 26927f654740f2a26ad62a5c155af9199af9e69b889claireho //uprintf(formattableToString(result)); 27027f654740f2a26ad62a5c155af9199af9e69b889claireho //printf("\n"); 27127f654740f2a26ad62a5c155af9199af9e69b889claireho 27227f654740f2a26ad62a5c155af9199af9e69b889claireho // Take the number parsed above, and use the formatter to 27327f654740f2a26ad62a5c155af9199af9e69b889claireho // format it. 27427f654740f2a26ad62a5c155af9199af9e69b889claireho str.remove(); // format() will APPEND to this string 27527f654740f2a26ad62a5c155af9199af9e69b889claireho fmt->format(result, str, status); 27627f654740f2a26ad62a5c155af9199af9e69b889claireho 27727f654740f2a26ad62a5c155af9199af9e69b889claireho //uprintf(str); 27827f654740f2a26ad62a5c155af9199af9e69b889claireho //printf("\n"); 27927f654740f2a26ad62a5c155af9199af9e69b889claireho } 28027f654740f2a26ad62a5c155af9199af9e69b889claireho 28127f654740f2a26ad62a5c155af9199af9e69b889claireho delete fmt; // Release the storage used by the formatter 28227f654740f2a26ad62a5c155af9199af9e69b889claireho } 28327f654740f2a26ad62a5c155af9199af9e69b889claireho 28427f654740f2a26ad62a5c155af9199af9e69b889claireho enum { 28527f654740f2a26ad62a5c155af9199af9e69b889claireho U_SPACE=0x20, 28627f654740f2a26ad62a5c155af9199af9e69b889claireho U_DQUOTE=0x22, 28727f654740f2a26ad62a5c155af9199af9e69b889claireho U_COMMA=0x2c, 28827f654740f2a26ad62a5c155af9199af9e69b889claireho U_LEFT_SQUARE_BRACKET=0x5b, 28927f654740f2a26ad62a5c155af9199af9e69b889claireho U_BACKSLASH=0x5c, 29027f654740f2a26ad62a5c155af9199af9e69b889claireho U_RIGHT_SQUARE_BRACKET=0x5d, 29127f654740f2a26ad62a5c155af9199af9e69b889claireho U_SMALL_U=0x75 29227f654740f2a26ad62a5c155af9199af9e69b889claireho }; 29327f654740f2a26ad62a5c155af9199af9e69b889claireho 29427f654740f2a26ad62a5c155af9199af9e69b889claireho // Create a display string for a formattable 29527f654740f2a26ad62a5c155af9199af9e69b889claireho UnicodeString formattableToString(const Formattable& f) { 29627f654740f2a26ad62a5c155af9199af9e69b889claireho switch (f.getType()) { 29727f654740f2a26ad62a5c155af9199af9e69b889claireho case Formattable::kDate: 29827f654740f2a26ad62a5c155af9199af9e69b889claireho // TODO: Finish implementing this 29927f654740f2a26ad62a5c155af9199af9e69b889claireho return UNICODE_STRING_SIMPLE("Formattable_DATE_TBD"); 30027f654740f2a26ad62a5c155af9199af9e69b889claireho case Formattable::kDouble: 30127f654740f2a26ad62a5c155af9199af9e69b889claireho { 30227f654740f2a26ad62a5c155af9199af9e69b889claireho char buf[256]; 30327f654740f2a26ad62a5c155af9199af9e69b889claireho sprintf(buf, "%gD", f.getDouble()); 30427f654740f2a26ad62a5c155af9199af9e69b889claireho return UnicodeString(buf, ""); 30527f654740f2a26ad62a5c155af9199af9e69b889claireho } 30627f654740f2a26ad62a5c155af9199af9e69b889claireho case Formattable::kLong: 30727f654740f2a26ad62a5c155af9199af9e69b889claireho case Formattable::kInt64: 30827f654740f2a26ad62a5c155af9199af9e69b889claireho { 30927f654740f2a26ad62a5c155af9199af9e69b889claireho char buf[256]; 31027f654740f2a26ad62a5c155af9199af9e69b889claireho sprintf(buf, "%ldL", f.getLong()); 31127f654740f2a26ad62a5c155af9199af9e69b889claireho return UnicodeString(buf, ""); 31227f654740f2a26ad62a5c155af9199af9e69b889claireho } 31327f654740f2a26ad62a5c155af9199af9e69b889claireho case Formattable::kString: 31427f654740f2a26ad62a5c155af9199af9e69b889claireho return UnicodeString((UChar)U_DQUOTE).append(f.getString()).append((UChar)U_DQUOTE); 31527f654740f2a26ad62a5c155af9199af9e69b889claireho case Formattable::kArray: 31627f654740f2a26ad62a5c155af9199af9e69b889claireho { 31727f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t i, count; 31827f654740f2a26ad62a5c155af9199af9e69b889claireho const Formattable* array = f.getArray(count); 31927f654740f2a26ad62a5c155af9199af9e69b889claireho UnicodeString result((UChar)U_LEFT_SQUARE_BRACKET); 32027f654740f2a26ad62a5c155af9199af9e69b889claireho for (i=0; i<count; ++i) { 32127f654740f2a26ad62a5c155af9199af9e69b889claireho if (i > 0) { 32227f654740f2a26ad62a5c155af9199af9e69b889claireho (result += (UChar)U_COMMA) += (UChar)U_SPACE; 32327f654740f2a26ad62a5c155af9199af9e69b889claireho } 32427f654740f2a26ad62a5c155af9199af9e69b889claireho result += formattableToString(array[i]); 32527f654740f2a26ad62a5c155af9199af9e69b889claireho } 32627f654740f2a26ad62a5c155af9199af9e69b889claireho result += (UChar)U_RIGHT_SQUARE_BRACKET; 32727f654740f2a26ad62a5c155af9199af9e69b889claireho return result; 32827f654740f2a26ad62a5c155af9199af9e69b889claireho } 32927f654740f2a26ad62a5c155af9199af9e69b889claireho default: 33027f654740f2a26ad62a5c155af9199af9e69b889claireho return UNICODE_STRING_SIMPLE("INVALID_Formattable"); 33127f654740f2a26ad62a5c155af9199af9e69b889claireho } 33227f654740f2a26ad62a5c155af9199af9e69b889claireho } 33327f654740f2a26ad62a5c155af9199af9e69b889claireho 33427f654740f2a26ad62a5c155af9199af9e69b889claireho virtual long getOperationsPerIteration() 33527f654740f2a26ad62a5c155af9199af9e69b889claireho { 33627f654740f2a26ad62a5c155af9199af9e69b889claireho return num; 33727f654740f2a26ad62a5c155af9199af9e69b889claireho } 33827f654740f2a26ad62a5c155af9199af9e69b889claireho 33927f654740f2a26ad62a5c155af9199af9e69b889claireho // Print the given string to stdout using the UTF-8 converter (for debugging purposes only) 34027f654740f2a26ad62a5c155af9199af9e69b889claireho void uprintf(const UnicodeString &str) { 34127f654740f2a26ad62a5c155af9199af9e69b889claireho char stackBuffer[100]; 34227f654740f2a26ad62a5c155af9199af9e69b889claireho char *buf = 0; 34327f654740f2a26ad62a5c155af9199af9e69b889claireho 34427f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t bufLen = str.extract(0, 0x7fffffff, stackBuffer, sizeof(stackBuffer), "UTF-8"); 34527f654740f2a26ad62a5c155af9199af9e69b889claireho if(bufLen < sizeof(stackBuffer)) { 34627f654740f2a26ad62a5c155af9199af9e69b889claireho buf = stackBuffer; 34727f654740f2a26ad62a5c155af9199af9e69b889claireho } else { 34827f654740f2a26ad62a5c155af9199af9e69b889claireho buf = new char[bufLen + 1]; 34927f654740f2a26ad62a5c155af9199af9e69b889claireho bufLen = str.extract(0, 0x7fffffff, buf, bufLen + 1, "UTF-8"); 35027f654740f2a26ad62a5c155af9199af9e69b889claireho } 35127f654740f2a26ad62a5c155af9199af9e69b889claireho printf("%s", buf); 35227f654740f2a26ad62a5c155af9199af9e69b889claireho if(buf != stackBuffer) { 35327f654740f2a26ad62a5c155af9199af9e69b889claireho delete[] buf; 35427f654740f2a26ad62a5c155af9199af9e69b889claireho } 35527f654740f2a26ad62a5c155af9199af9e69b889claireho } 35627f654740f2a26ad62a5c155af9199af9e69b889claireho}; 35727f654740f2a26ad62a5c155af9199af9e69b889claireho 35827f654740f2a26ad62a5c155af9199af9e69b889clairehoclass CollationFunction : public UPerfFunction 35927f654740f2a26ad62a5c155af9199af9e69b889claireho{ 36027f654740f2a26ad62a5c155af9199af9e69b889claireho 36127f654740f2a26ad62a5c155af9199af9e69b889clairehoprivate: 36227f654740f2a26ad62a5c155af9199af9e69b889claireho int num; 36327f654740f2a26ad62a5c155af9199af9e69b889claireho char locale[25]; 36427f654740f2a26ad62a5c155af9199af9e69b889claireho UnicodeString *collation_strings; 36527f654740f2a26ad62a5c155af9199af9e69b889claireho 36627f654740f2a26ad62a5c155af9199af9e69b889claireho /** 36727f654740f2a26ad62a5c155af9199af9e69b889claireho * Unescape the strings 36827f654740f2a26ad62a5c155af9199af9e69b889claireho */ 36927f654740f2a26ad62a5c155af9199af9e69b889claireho void init() { 37027f654740f2a26ad62a5c155af9199af9e69b889claireho uint32_t listSize = sizeof(collation_strings_escaped)/sizeof(collation_strings_escaped[0]); 37127f654740f2a26ad62a5c155af9199af9e69b889claireho collation_strings = new UnicodeString[listSize]; 37227f654740f2a26ad62a5c155af9199af9e69b889claireho for(uint32_t k=0;k<listSize;k++) { 37327f654740f2a26ad62a5c155af9199af9e69b889claireho collation_strings[k] = collation_strings_escaped[k].unescape(); 37427f654740f2a26ad62a5c155af9199af9e69b889claireho } 37527f654740f2a26ad62a5c155af9199af9e69b889claireho UnicodeString shorty((UChar32)0x12345); 37627f654740f2a26ad62a5c155af9199af9e69b889claireho } 37727f654740f2a26ad62a5c155af9199af9e69b889clairehopublic: 37827f654740f2a26ad62a5c155af9199af9e69b889claireho 37927f654740f2a26ad62a5c155af9199af9e69b889claireho CollationFunction() 38027f654740f2a26ad62a5c155af9199af9e69b889claireho { 38127f654740f2a26ad62a5c155af9199af9e69b889claireho num = -1; 38227f654740f2a26ad62a5c155af9199af9e69b889claireho 38327f654740f2a26ad62a5c155af9199af9e69b889claireho init(); 38427f654740f2a26ad62a5c155af9199af9e69b889claireho } 38527f654740f2a26ad62a5c155af9199af9e69b889claireho 38627f654740f2a26ad62a5c155af9199af9e69b889claireho ~CollationFunction() { 38727f654740f2a26ad62a5c155af9199af9e69b889claireho delete [] collation_strings; 38827f654740f2a26ad62a5c155af9199af9e69b889claireho } 38927f654740f2a26ad62a5c155af9199af9e69b889claireho 39027f654740f2a26ad62a5c155af9199af9e69b889claireho CollationFunction(int a, const char* loc) 39127f654740f2a26ad62a5c155af9199af9e69b889claireho { 39227f654740f2a26ad62a5c155af9199af9e69b889claireho num = a; 39327f654740f2a26ad62a5c155af9199af9e69b889claireho strcpy(locale, loc); 39427f654740f2a26ad62a5c155af9199af9e69b889claireho init(); 39527f654740f2a26ad62a5c155af9199af9e69b889claireho } 39627f654740f2a26ad62a5c155af9199af9e69b889claireho 39727f654740f2a26ad62a5c155af9199af9e69b889claireho virtual void call(UErrorCode* status2) 39827f654740f2a26ad62a5c155af9199af9e69b889claireho { 39927f654740f2a26ad62a5c155af9199af9e69b889claireho uint32_t listSize = sizeof(collation_strings_escaped)/sizeof(collation_strings_escaped[0]); 40027f654740f2a26ad62a5c155af9199af9e69b889claireho UErrorCode status = U_ZERO_ERROR; 40127f654740f2a26ad62a5c155af9199af9e69b889claireho Collator *coll = Collator::createInstance(Locale(locale), status); 40227f654740f2a26ad62a5c155af9199af9e69b889claireho 40327f654740f2a26ad62a5c155af9199af9e69b889claireho for(int k = 0; k < num; k++) 40427f654740f2a26ad62a5c155af9199af9e69b889claireho { 40527f654740f2a26ad62a5c155af9199af9e69b889claireho uint32_t i, j; 40627f654740f2a26ad62a5c155af9199af9e69b889claireho for(i=listSize-1; i>=1; i--) { 40727f654740f2a26ad62a5c155af9199af9e69b889claireho for(j=0; j<i; j++) { 40827f654740f2a26ad62a5c155af9199af9e69b889claireho if(coll->compare(collation_strings[j], collation_strings[j+1]) == UCOL_LESS) { 40927f654740f2a26ad62a5c155af9199af9e69b889claireho //cout << "Success!" << endl; 41027f654740f2a26ad62a5c155af9199af9e69b889claireho } 41127f654740f2a26ad62a5c155af9199af9e69b889claireho } 41227f654740f2a26ad62a5c155af9199af9e69b889claireho } 41327f654740f2a26ad62a5c155af9199af9e69b889claireho } 41427f654740f2a26ad62a5c155af9199af9e69b889claireho delete coll; 41527f654740f2a26ad62a5c155af9199af9e69b889claireho } 41627f654740f2a26ad62a5c155af9199af9e69b889claireho 41727f654740f2a26ad62a5c155af9199af9e69b889claireho virtual long getOperationsPerIteration() 41827f654740f2a26ad62a5c155af9199af9e69b889claireho { 41927f654740f2a26ad62a5c155af9199af9e69b889claireho return num; 42027f654740f2a26ad62a5c155af9199af9e69b889claireho } 42127f654740f2a26ad62a5c155af9199af9e69b889claireho}; 42227f654740f2a26ad62a5c155af9199af9e69b889claireho 42327f654740f2a26ad62a5c155af9199af9e69b889clairehoclass DateFormatPerfTest : public UPerfTest 42427f654740f2a26ad62a5c155af9199af9e69b889claireho{ 42527f654740f2a26ad62a5c155af9199af9e69b889clairehoprivate: 42627f654740f2a26ad62a5c155af9199af9e69b889claireho 42727f654740f2a26ad62a5c155af9199af9e69b889clairehopublic: 42827f654740f2a26ad62a5c155af9199af9e69b889claireho 42927f654740f2a26ad62a5c155af9199af9e69b889claireho DateFormatPerfTest(int32_t argc, const char* argv[], UErrorCode& status); 43027f654740f2a26ad62a5c155af9199af9e69b889claireho ~DateFormatPerfTest(); 43127f654740f2a26ad62a5c155af9199af9e69b889claireho virtual UPerfFunction* runIndexedTest(int32_t index, UBool exec,const char* &name, char* par); 43227f654740f2a26ad62a5c155af9199af9e69b889claireho 43327f654740f2a26ad62a5c155af9199af9e69b889claireho UPerfFunction* DateFmt250(); 43427f654740f2a26ad62a5c155af9199af9e69b889claireho UPerfFunction* DateFmt10000(); 43527f654740f2a26ad62a5c155af9199af9e69b889claireho UPerfFunction* DateFmt100000(); 43627f654740f2a26ad62a5c155af9199af9e69b889claireho UPerfFunction* BreakItWord250(); 43727f654740f2a26ad62a5c155af9199af9e69b889claireho UPerfFunction* BreakItWord10000(); 43827f654740f2a26ad62a5c155af9199af9e69b889claireho UPerfFunction* BreakItChar250(); 43927f654740f2a26ad62a5c155af9199af9e69b889claireho UPerfFunction* BreakItChar10000(); 44027f654740f2a26ad62a5c155af9199af9e69b889claireho UPerfFunction* NumFmt10000(); 44127f654740f2a26ad62a5c155af9199af9e69b889claireho UPerfFunction* NumFmt100000(); 44227f654740f2a26ad62a5c155af9199af9e69b889claireho UPerfFunction* Collation10000(); 44327f654740f2a26ad62a5c155af9199af9e69b889claireho UPerfFunction* Collation100000(); 44427f654740f2a26ad62a5c155af9199af9e69b889claireho}; 44527f654740f2a26ad62a5c155af9199af9e69b889claireho 44627f654740f2a26ad62a5c155af9199af9e69b889claireho#endif // DateFmtPerf 447