127f654740f2a26ad62a5c155af9199af9e69b889claireho/* 227f654740f2a26ad62a5c155af9199af9e69b889claireho********************************************************************** 3b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho* Copyright (c) 2002-2011,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> 31b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include <string.h> 32b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 3327f654740f2a26ad62a5c155af9199af9e69b889claireho#include <fstream> 3427f654740f2a26ad62a5c155af9199af9e69b889claireho 3527f654740f2a26ad62a5c155af9199af9e69b889claireho#include <iostream> 3627f654740f2a26ad62a5c155af9199af9e69b889clairehousing namespace std; 3727f654740f2a26ad62a5c155af9199af9e69b889claireho 3827f654740f2a26ad62a5c155af9199af9e69b889claireho// Stubs for Windows API functions when building on UNIXes. 3927f654740f2a26ad62a5c155af9199af9e69b889claireho// 4083a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius#if U_PLATFORM_USES_ONLY_WIN32_API 4127f654740f2a26ad62a5c155af9199af9e69b889claireho// do nothing 4227f654740f2a26ad62a5c155af9199af9e69b889claireho#else 4327f654740f2a26ad62a5c155af9199af9e69b889claireho#define _UNICODE 4427f654740f2a26ad62a5c155af9199af9e69b889clairehotypedef int DWORD; 4527f654740f2a26ad62a5c155af9199af9e69b889clairehoinline int FoldStringW(DWORD dwMapFlags, const UChar* lpSrcStr,int cchSrc, UChar* lpDestStr,int cchDest); 4627f654740f2a26ad62a5c155af9199af9e69b889claireho#endif 4727f654740f2a26ad62a5c155af9199af9e69b889claireho 4827f654740f2a26ad62a5c155af9199af9e69b889clairehoclass BreakItFunction : public UPerfFunction 4927f654740f2a26ad62a5c155af9199af9e69b889claireho{ 5027f654740f2a26ad62a5c155af9199af9e69b889clairehoprivate: 5127f654740f2a26ad62a5c155af9199af9e69b889claireho int num; 5227f654740f2a26ad62a5c155af9199af9e69b889claireho bool wordIteration; 5327f654740f2a26ad62a5c155af9199af9e69b889claireho 5427f654740f2a26ad62a5c155af9199af9e69b889clairehopublic: 5527f654740f2a26ad62a5c155af9199af9e69b889claireho 5627f654740f2a26ad62a5c155af9199af9e69b889claireho BreakItFunction(){num = -1;} 5727f654740f2a26ad62a5c155af9199af9e69b889claireho BreakItFunction(int a, bool b){num = a; wordIteration = b;} 5827f654740f2a26ad62a5c155af9199af9e69b889claireho 5927f654740f2a26ad62a5c155af9199af9e69b889claireho virtual void call(UErrorCode *status) 6027f654740f2a26ad62a5c155af9199af9e69b889claireho { 6127f654740f2a26ad62a5c155af9199af9e69b889claireho BreakIterator* boundary; 6227f654740f2a26ad62a5c155af9199af9e69b889claireho 6327f654740f2a26ad62a5c155af9199af9e69b889claireho if(wordIteration) 6427f654740f2a26ad62a5c155af9199af9e69b889claireho { 6527f654740f2a26ad62a5c155af9199af9e69b889claireho for(int i = 0; i < num; i++) 6627f654740f2a26ad62a5c155af9199af9e69b889claireho { 6727f654740f2a26ad62a5c155af9199af9e69b889claireho boundary = BreakIterator::createWordInstance("en", *status); 6827f654740f2a26ad62a5c155af9199af9e69b889claireho boundary->setText(str); 6927f654740f2a26ad62a5c155af9199af9e69b889claireho 7027f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t start = boundary->first(); 7127f654740f2a26ad62a5c155af9199af9e69b889claireho for (int32_t end = boundary->next(); 7227f654740f2a26ad62a5c155af9199af9e69b889claireho end != BreakIterator::DONE; 7327f654740f2a26ad62a5c155af9199af9e69b889claireho start = end, end = boundary->next()) 7427f654740f2a26ad62a5c155af9199af9e69b889claireho { 7527f654740f2a26ad62a5c155af9199af9e69b889claireho printTextRange( *boundary, start, end ); 7627f654740f2a26ad62a5c155af9199af9e69b889claireho } 7727f654740f2a26ad62a5c155af9199af9e69b889claireho } 7827f654740f2a26ad62a5c155af9199af9e69b889claireho } 7927f654740f2a26ad62a5c155af9199af9e69b889claireho 8027f654740f2a26ad62a5c155af9199af9e69b889claireho else // character iteration 8127f654740f2a26ad62a5c155af9199af9e69b889claireho { 8227f654740f2a26ad62a5c155af9199af9e69b889claireho for(int i = 0; i < num; i++) 8327f654740f2a26ad62a5c155af9199af9e69b889claireho { 8427f654740f2a26ad62a5c155af9199af9e69b889claireho boundary = BreakIterator::createCharacterInstance(Locale::getUS(), *status); 8527f654740f2a26ad62a5c155af9199af9e69b889claireho boundary->setText(str); 8627f654740f2a26ad62a5c155af9199af9e69b889claireho 8727f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t start = boundary->first(); 8827f654740f2a26ad62a5c155af9199af9e69b889claireho for (int32_t end = boundary->next(); 8927f654740f2a26ad62a5c155af9199af9e69b889claireho end != BreakIterator::DONE; 9027f654740f2a26ad62a5c155af9199af9e69b889claireho start = end, end = boundary->next()) 9127f654740f2a26ad62a5c155af9199af9e69b889claireho { 9227f654740f2a26ad62a5c155af9199af9e69b889claireho printTextRange( *boundary, start, end ); 9327f654740f2a26ad62a5c155af9199af9e69b889claireho } 9427f654740f2a26ad62a5c155af9199af9e69b889claireho } 9527f654740f2a26ad62a5c155af9199af9e69b889claireho } 9627f654740f2a26ad62a5c155af9199af9e69b889claireho 9727f654740f2a26ad62a5c155af9199af9e69b889claireho 9827f654740f2a26ad62a5c155af9199af9e69b889claireho } 9927f654740f2a26ad62a5c155af9199af9e69b889claireho 10027f654740f2a26ad62a5c155af9199af9e69b889claireho virtual long getOperationsPerIteration() 10127f654740f2a26ad62a5c155af9199af9e69b889claireho { 10227f654740f2a26ad62a5c155af9199af9e69b889claireho if(wordIteration) return 125*num; 10327f654740f2a26ad62a5c155af9199af9e69b889claireho else return 355*num; 10427f654740f2a26ad62a5c155af9199af9e69b889claireho } 10527f654740f2a26ad62a5c155af9199af9e69b889claireho 10627f654740f2a26ad62a5c155af9199af9e69b889claireho void printUnicodeString(const UnicodeString &s) { 10727f654740f2a26ad62a5c155af9199af9e69b889claireho char charBuf[1000]; 10827f654740f2a26ad62a5c155af9199af9e69b889claireho s.extract(0, s.length(), charBuf, sizeof(charBuf)-1, 0); 10927f654740f2a26ad62a5c155af9199af9e69b889claireho charBuf[sizeof(charBuf)-1] = 0; 11027f654740f2a26ad62a5c155af9199af9e69b889claireho printf("%s", charBuf); 11127f654740f2a26ad62a5c155af9199af9e69b889claireho } 11227f654740f2a26ad62a5c155af9199af9e69b889claireho 11327f654740f2a26ad62a5c155af9199af9e69b889claireho 11427f654740f2a26ad62a5c155af9199af9e69b889claireho void printTextRange( BreakIterator& iterator, 11527f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t start, int32_t end ) 11627f654740f2a26ad62a5c155af9199af9e69b889claireho { 11727f654740f2a26ad62a5c155af9199af9e69b889claireho CharacterIterator *strIter = iterator.getText().clone(); 11827f654740f2a26ad62a5c155af9199af9e69b889claireho UnicodeString s; 11927f654740f2a26ad62a5c155af9199af9e69b889claireho strIter->getText(s); 12027f654740f2a26ad62a5c155af9199af9e69b889claireho //printUnicodeString(UnicodeString(s, start, end-start)); 12127f654740f2a26ad62a5c155af9199af9e69b889claireho //puts(""); 12227f654740f2a26ad62a5c155af9199af9e69b889claireho delete strIter; 12327f654740f2a26ad62a5c155af9199af9e69b889claireho } 12427f654740f2a26ad62a5c155af9199af9e69b889claireho 12527f654740f2a26ad62a5c155af9199af9e69b889claireho // Print the given string to stdout (for debugging purposes) 12627f654740f2a26ad62a5c155af9199af9e69b889claireho void uprintf(const UnicodeString &str) { 12727f654740f2a26ad62a5c155af9199af9e69b889claireho char *buf = 0; 12827f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t len = str.length(); 12927f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t bufLen = len + 16; 13027f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t actualLen; 13127f654740f2a26ad62a5c155af9199af9e69b889claireho buf = new char[bufLen + 1]; 13227f654740f2a26ad62a5c155af9199af9e69b889claireho actualLen = str.extract(0, len, buf/*, bufLen*/); // Default codepage conversion 13327f654740f2a26ad62a5c155af9199af9e69b889claireho buf[actualLen] = 0; 13427f654740f2a26ad62a5c155af9199af9e69b889claireho printf("%s", buf); 13527f654740f2a26ad62a5c155af9199af9e69b889claireho delete[] buf; 13627f654740f2a26ad62a5c155af9199af9e69b889claireho } 13727f654740f2a26ad62a5c155af9199af9e69b889claireho 13827f654740f2a26ad62a5c155af9199af9e69b889claireho}; 13927f654740f2a26ad62a5c155af9199af9e69b889claireho 14027f654740f2a26ad62a5c155af9199af9e69b889clairehoclass DateFmtFunction : public UPerfFunction 14127f654740f2a26ad62a5c155af9199af9e69b889claireho{ 14227f654740f2a26ad62a5c155af9199af9e69b889claireho 14327f654740f2a26ad62a5c155af9199af9e69b889clairehoprivate: 14427f654740f2a26ad62a5c155af9199af9e69b889claireho int num; 14527f654740f2a26ad62a5c155af9199af9e69b889claireho char locale[25]; 14627f654740f2a26ad62a5c155af9199af9e69b889clairehopublic: 14727f654740f2a26ad62a5c155af9199af9e69b889claireho 14827f654740f2a26ad62a5c155af9199af9e69b889claireho DateFmtFunction() 14927f654740f2a26ad62a5c155af9199af9e69b889claireho { 15027f654740f2a26ad62a5c155af9199af9e69b889claireho num = -1; 15127f654740f2a26ad62a5c155af9199af9e69b889claireho } 15227f654740f2a26ad62a5c155af9199af9e69b889claireho 15327f654740f2a26ad62a5c155af9199af9e69b889claireho DateFmtFunction(int a, const char* loc) 15427f654740f2a26ad62a5c155af9199af9e69b889claireho { 15527f654740f2a26ad62a5c155af9199af9e69b889claireho num = a; 15627f654740f2a26ad62a5c155af9199af9e69b889claireho strcpy(locale, loc); 15727f654740f2a26ad62a5c155af9199af9e69b889claireho } 15827f654740f2a26ad62a5c155af9199af9e69b889claireho 15927f654740f2a26ad62a5c155af9199af9e69b889claireho virtual void call(UErrorCode* status) 16027f654740f2a26ad62a5c155af9199af9e69b889claireho { 16127f654740f2a26ad62a5c155af9199af9e69b889claireho 16227f654740f2a26ad62a5c155af9199af9e69b889claireho UErrorCode status2 = U_ZERO_ERROR; 16327f654740f2a26ad62a5c155af9199af9e69b889claireho Calendar *cal; 16427f654740f2a26ad62a5c155af9199af9e69b889claireho TimeZone *zone; 16527f654740f2a26ad62a5c155af9199af9e69b889claireho UnicodeString str; 16627f654740f2a26ad62a5c155af9199af9e69b889claireho UDate date; 16727f654740f2a26ad62a5c155af9199af9e69b889claireho 16827f654740f2a26ad62a5c155af9199af9e69b889claireho cal = Calendar::createInstance(status2); 16927f654740f2a26ad62a5c155af9199af9e69b889claireho check(status2, "Calendar::createInstance"); 17027f654740f2a26ad62a5c155af9199af9e69b889claireho zone = TimeZone::createTimeZone("GMT"); // Create a GMT zone 17127f654740f2a26ad62a5c155af9199af9e69b889claireho cal->adoptTimeZone(zone); 17227f654740f2a26ad62a5c155af9199af9e69b889claireho 17327f654740f2a26ad62a5c155af9199af9e69b889claireho Locale loc(locale); 17427f654740f2a26ad62a5c155af9199af9e69b889claireho DateFormat *fmt; 17527f654740f2a26ad62a5c155af9199af9e69b889claireho fmt = DateFormat::createDateTimeInstance( 17627f654740f2a26ad62a5c155af9199af9e69b889claireho DateFormat::kShort, DateFormat::kFull, loc); 17727f654740f2a26ad62a5c155af9199af9e69b889claireho 17827f654740f2a26ad62a5c155af9199af9e69b889claireho 17927f654740f2a26ad62a5c155af9199af9e69b889claireho // (dates are imported from datedata.h) 18027f654740f2a26ad62a5c155af9199af9e69b889claireho for(int j = 0; j < num; j++) 18127f654740f2a26ad62a5c155af9199af9e69b889claireho for(int i = 0; i < NUM_DATES; i++) 18227f654740f2a26ad62a5c155af9199af9e69b889claireho { 18327f654740f2a26ad62a5c155af9199af9e69b889claireho cal->clear(); 18427f654740f2a26ad62a5c155af9199af9e69b889claireho cal->set(years[i], months[i], days[i]); 18527f654740f2a26ad62a5c155af9199af9e69b889claireho date = cal->getTime(status2); 18627f654740f2a26ad62a5c155af9199af9e69b889claireho check(status2, "Calendar::getTime"); 18727f654740f2a26ad62a5c155af9199af9e69b889claireho 18827f654740f2a26ad62a5c155af9199af9e69b889claireho fmt->setCalendar(*cal); 18927f654740f2a26ad62a5c155af9199af9e69b889claireho 19027f654740f2a26ad62a5c155af9199af9e69b889claireho // Format the date 19127f654740f2a26ad62a5c155af9199af9e69b889claireho str.remove(); 19227f654740f2a26ad62a5c155af9199af9e69b889claireho fmt->format(date, str, status2); 19327f654740f2a26ad62a5c155af9199af9e69b889claireho 19427f654740f2a26ad62a5c155af9199af9e69b889claireho 19527f654740f2a26ad62a5c155af9199af9e69b889claireho // Display the formatted date string 19627f654740f2a26ad62a5c155af9199af9e69b889claireho //uprintf(str); 19727f654740f2a26ad62a5c155af9199af9e69b889claireho //printf("\n"); 19827f654740f2a26ad62a5c155af9199af9e69b889claireho 19927f654740f2a26ad62a5c155af9199af9e69b889claireho } 20027f654740f2a26ad62a5c155af9199af9e69b889claireho 20127f654740f2a26ad62a5c155af9199af9e69b889claireho delete fmt; 20227f654740f2a26ad62a5c155af9199af9e69b889claireho delete cal; 20327f654740f2a26ad62a5c155af9199af9e69b889claireho //u_cleanup(); 20427f654740f2a26ad62a5c155af9199af9e69b889claireho } 20527f654740f2a26ad62a5c155af9199af9e69b889claireho 20627f654740f2a26ad62a5c155af9199af9e69b889claireho virtual long getOperationsPerIteration() 20727f654740f2a26ad62a5c155af9199af9e69b889claireho { 20827f654740f2a26ad62a5c155af9199af9e69b889claireho return NUM_DATES * num; 20927f654740f2a26ad62a5c155af9199af9e69b889claireho } 21027f654740f2a26ad62a5c155af9199af9e69b889claireho 21127f654740f2a26ad62a5c155af9199af9e69b889claireho // Print the given string to stdout (for debugging purposes) 21227f654740f2a26ad62a5c155af9199af9e69b889claireho void uprintf(const UnicodeString &str) { 21327f654740f2a26ad62a5c155af9199af9e69b889claireho char *buf = 0; 21427f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t len = str.length(); 21527f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t bufLen = len + 16; 21627f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t actualLen; 21727f654740f2a26ad62a5c155af9199af9e69b889claireho buf = new char[bufLen + 1]; 21827f654740f2a26ad62a5c155af9199af9e69b889claireho actualLen = str.extract(0, len, buf/*, bufLen*/); // Default codepage conversion 21927f654740f2a26ad62a5c155af9199af9e69b889claireho buf[actualLen] = 0; 22027f654740f2a26ad62a5c155af9199af9e69b889claireho printf("%s", buf); 22127f654740f2a26ad62a5c155af9199af9e69b889claireho delete[] buf; 22227f654740f2a26ad62a5c155af9199af9e69b889claireho } 22327f654740f2a26ad62a5c155af9199af9e69b889claireho 22427f654740f2a26ad62a5c155af9199af9e69b889claireho // Verify that a UErrorCode is successful; exit(1) if not 22527f654740f2a26ad62a5c155af9199af9e69b889claireho void check(UErrorCode& status, const char* msg) { 22627f654740f2a26ad62a5c155af9199af9e69b889claireho if (U_FAILURE(status)) { 22727f654740f2a26ad62a5c155af9199af9e69b889claireho printf("ERROR: %s (%s)\n", u_errorName(status), msg); 22827f654740f2a26ad62a5c155af9199af9e69b889claireho exit(1); 22927f654740f2a26ad62a5c155af9199af9e69b889claireho } 23027f654740f2a26ad62a5c155af9199af9e69b889claireho } 23127f654740f2a26ad62a5c155af9199af9e69b889claireho 23227f654740f2a26ad62a5c155af9199af9e69b889claireho}; 23327f654740f2a26ad62a5c155af9199af9e69b889claireho 23427f654740f2a26ad62a5c155af9199af9e69b889clairehoclass NumFmtFunction : public UPerfFunction 23527f654740f2a26ad62a5c155af9199af9e69b889claireho{ 23627f654740f2a26ad62a5c155af9199af9e69b889claireho 23727f654740f2a26ad62a5c155af9199af9e69b889clairehoprivate: 23827f654740f2a26ad62a5c155af9199af9e69b889claireho int num; 23927f654740f2a26ad62a5c155af9199af9e69b889claireho char locale[25]; 24027f654740f2a26ad62a5c155af9199af9e69b889clairehopublic: 24127f654740f2a26ad62a5c155af9199af9e69b889claireho 24227f654740f2a26ad62a5c155af9199af9e69b889claireho NumFmtFunction() 24327f654740f2a26ad62a5c155af9199af9e69b889claireho { 24427f654740f2a26ad62a5c155af9199af9e69b889claireho num = -1; 24527f654740f2a26ad62a5c155af9199af9e69b889claireho } 24627f654740f2a26ad62a5c155af9199af9e69b889claireho 24727f654740f2a26ad62a5c155af9199af9e69b889claireho NumFmtFunction(int a, const char* loc) 24827f654740f2a26ad62a5c155af9199af9e69b889claireho { 24927f654740f2a26ad62a5c155af9199af9e69b889claireho num = a; 25027f654740f2a26ad62a5c155af9199af9e69b889claireho strcpy(locale, loc); 25127f654740f2a26ad62a5c155af9199af9e69b889claireho } 25227f654740f2a26ad62a5c155af9199af9e69b889claireho 25327f654740f2a26ad62a5c155af9199af9e69b889claireho virtual void call(UErrorCode* status2) 25427f654740f2a26ad62a5c155af9199af9e69b889claireho { 25527f654740f2a26ad62a5c155af9199af9e69b889claireho Locale loc(locale); 25627f654740f2a26ad62a5c155af9199af9e69b889claireho UErrorCode status = U_ZERO_ERROR; 25727f654740f2a26ad62a5c155af9199af9e69b889claireho 25827f654740f2a26ad62a5c155af9199af9e69b889claireho // Create a number formatter for the locale 25927f654740f2a26ad62a5c155af9199af9e69b889claireho NumberFormat *fmt = NumberFormat::createInstance(loc, status); 26027f654740f2a26ad62a5c155af9199af9e69b889claireho 26127f654740f2a26ad62a5c155af9199af9e69b889claireho // Parse a string. The string uses the digits '0' through '9' 26227f654740f2a26ad62a5c155af9199af9e69b889claireho // and the decimal separator '.', standard in the US locale 26327f654740f2a26ad62a5c155af9199af9e69b889claireho 26427f654740f2a26ad62a5c155af9199af9e69b889claireho for(int i = 0; i < num; i++) 26527f654740f2a26ad62a5c155af9199af9e69b889claireho { 26627f654740f2a26ad62a5c155af9199af9e69b889claireho UnicodeString str("9876543210.123"); 26727f654740f2a26ad62a5c155af9199af9e69b889claireho Formattable result; 26827f654740f2a26ad62a5c155af9199af9e69b889claireho fmt->parse(str, result, status); 26927f654740f2a26ad62a5c155af9199af9e69b889claireho 27027f654740f2a26ad62a5c155af9199af9e69b889claireho //uprintf(formattableToString(result)); 27127f654740f2a26ad62a5c155af9199af9e69b889claireho //printf("\n"); 27227f654740f2a26ad62a5c155af9199af9e69b889claireho 27327f654740f2a26ad62a5c155af9199af9e69b889claireho // Take the number parsed above, and use the formatter to 27427f654740f2a26ad62a5c155af9199af9e69b889claireho // format it. 27527f654740f2a26ad62a5c155af9199af9e69b889claireho str.remove(); // format() will APPEND to this string 27627f654740f2a26ad62a5c155af9199af9e69b889claireho fmt->format(result, str, status); 27727f654740f2a26ad62a5c155af9199af9e69b889claireho 27827f654740f2a26ad62a5c155af9199af9e69b889claireho //uprintf(str); 27927f654740f2a26ad62a5c155af9199af9e69b889claireho //printf("\n"); 28027f654740f2a26ad62a5c155af9199af9e69b889claireho } 28127f654740f2a26ad62a5c155af9199af9e69b889claireho 28227f654740f2a26ad62a5c155af9199af9e69b889claireho delete fmt; // Release the storage used by the formatter 28327f654740f2a26ad62a5c155af9199af9e69b889claireho } 28427f654740f2a26ad62a5c155af9199af9e69b889claireho 28527f654740f2a26ad62a5c155af9199af9e69b889claireho enum { 28627f654740f2a26ad62a5c155af9199af9e69b889claireho U_SPACE=0x20, 28727f654740f2a26ad62a5c155af9199af9e69b889claireho U_DQUOTE=0x22, 28827f654740f2a26ad62a5c155af9199af9e69b889claireho U_COMMA=0x2c, 28927f654740f2a26ad62a5c155af9199af9e69b889claireho U_LEFT_SQUARE_BRACKET=0x5b, 29027f654740f2a26ad62a5c155af9199af9e69b889claireho U_BACKSLASH=0x5c, 29127f654740f2a26ad62a5c155af9199af9e69b889claireho U_RIGHT_SQUARE_BRACKET=0x5d, 29227f654740f2a26ad62a5c155af9199af9e69b889claireho U_SMALL_U=0x75 29327f654740f2a26ad62a5c155af9199af9e69b889claireho }; 29427f654740f2a26ad62a5c155af9199af9e69b889claireho 29527f654740f2a26ad62a5c155af9199af9e69b889claireho // Create a display string for a formattable 29627f654740f2a26ad62a5c155af9199af9e69b889claireho UnicodeString formattableToString(const Formattable& f) { 29727f654740f2a26ad62a5c155af9199af9e69b889claireho switch (f.getType()) { 29827f654740f2a26ad62a5c155af9199af9e69b889claireho case Formattable::kDate: 29927f654740f2a26ad62a5c155af9199af9e69b889claireho // TODO: Finish implementing this 30027f654740f2a26ad62a5c155af9199af9e69b889claireho return UNICODE_STRING_SIMPLE("Formattable_DATE_TBD"); 30127f654740f2a26ad62a5c155af9199af9e69b889claireho case Formattable::kDouble: 30227f654740f2a26ad62a5c155af9199af9e69b889claireho { 30327f654740f2a26ad62a5c155af9199af9e69b889claireho char buf[256]; 30427f654740f2a26ad62a5c155af9199af9e69b889claireho sprintf(buf, "%gD", f.getDouble()); 30527f654740f2a26ad62a5c155af9199af9e69b889claireho return UnicodeString(buf, ""); 30627f654740f2a26ad62a5c155af9199af9e69b889claireho } 30727f654740f2a26ad62a5c155af9199af9e69b889claireho case Formattable::kLong: 30827f654740f2a26ad62a5c155af9199af9e69b889claireho case Formattable::kInt64: 30927f654740f2a26ad62a5c155af9199af9e69b889claireho { 31027f654740f2a26ad62a5c155af9199af9e69b889claireho char buf[256]; 31127f654740f2a26ad62a5c155af9199af9e69b889claireho sprintf(buf, "%ldL", f.getLong()); 31227f654740f2a26ad62a5c155af9199af9e69b889claireho return UnicodeString(buf, ""); 31327f654740f2a26ad62a5c155af9199af9e69b889claireho } 31427f654740f2a26ad62a5c155af9199af9e69b889claireho case Formattable::kString: 31527f654740f2a26ad62a5c155af9199af9e69b889claireho return UnicodeString((UChar)U_DQUOTE).append(f.getString()).append((UChar)U_DQUOTE); 31627f654740f2a26ad62a5c155af9199af9e69b889claireho case Formattable::kArray: 31727f654740f2a26ad62a5c155af9199af9e69b889claireho { 31827f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t i, count; 31927f654740f2a26ad62a5c155af9199af9e69b889claireho const Formattable* array = f.getArray(count); 32027f654740f2a26ad62a5c155af9199af9e69b889claireho UnicodeString result((UChar)U_LEFT_SQUARE_BRACKET); 32127f654740f2a26ad62a5c155af9199af9e69b889claireho for (i=0; i<count; ++i) { 32227f654740f2a26ad62a5c155af9199af9e69b889claireho if (i > 0) { 32327f654740f2a26ad62a5c155af9199af9e69b889claireho (result += (UChar)U_COMMA) += (UChar)U_SPACE; 32427f654740f2a26ad62a5c155af9199af9e69b889claireho } 32527f654740f2a26ad62a5c155af9199af9e69b889claireho result += formattableToString(array[i]); 32627f654740f2a26ad62a5c155af9199af9e69b889claireho } 32727f654740f2a26ad62a5c155af9199af9e69b889claireho result += (UChar)U_RIGHT_SQUARE_BRACKET; 32827f654740f2a26ad62a5c155af9199af9e69b889claireho return result; 32927f654740f2a26ad62a5c155af9199af9e69b889claireho } 33027f654740f2a26ad62a5c155af9199af9e69b889claireho default: 33127f654740f2a26ad62a5c155af9199af9e69b889claireho return UNICODE_STRING_SIMPLE("INVALID_Formattable"); 33227f654740f2a26ad62a5c155af9199af9e69b889claireho } 33327f654740f2a26ad62a5c155af9199af9e69b889claireho } 33427f654740f2a26ad62a5c155af9199af9e69b889claireho 33527f654740f2a26ad62a5c155af9199af9e69b889claireho virtual long getOperationsPerIteration() 33627f654740f2a26ad62a5c155af9199af9e69b889claireho { 33727f654740f2a26ad62a5c155af9199af9e69b889claireho return num; 33827f654740f2a26ad62a5c155af9199af9e69b889claireho } 33927f654740f2a26ad62a5c155af9199af9e69b889claireho 34027f654740f2a26ad62a5c155af9199af9e69b889claireho // Print the given string to stdout using the UTF-8 converter (for debugging purposes only) 34127f654740f2a26ad62a5c155af9199af9e69b889claireho void uprintf(const UnicodeString &str) { 34227f654740f2a26ad62a5c155af9199af9e69b889claireho char stackBuffer[100]; 34327f654740f2a26ad62a5c155af9199af9e69b889claireho char *buf = 0; 34427f654740f2a26ad62a5c155af9199af9e69b889claireho 34527f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t bufLen = str.extract(0, 0x7fffffff, stackBuffer, sizeof(stackBuffer), "UTF-8"); 34627f654740f2a26ad62a5c155af9199af9e69b889claireho if(bufLen < sizeof(stackBuffer)) { 34727f654740f2a26ad62a5c155af9199af9e69b889claireho buf = stackBuffer; 34827f654740f2a26ad62a5c155af9199af9e69b889claireho } else { 34927f654740f2a26ad62a5c155af9199af9e69b889claireho buf = new char[bufLen + 1]; 35027f654740f2a26ad62a5c155af9199af9e69b889claireho bufLen = str.extract(0, 0x7fffffff, buf, bufLen + 1, "UTF-8"); 35127f654740f2a26ad62a5c155af9199af9e69b889claireho } 35227f654740f2a26ad62a5c155af9199af9e69b889claireho printf("%s", buf); 35327f654740f2a26ad62a5c155af9199af9e69b889claireho if(buf != stackBuffer) { 35427f654740f2a26ad62a5c155af9199af9e69b889claireho delete[] buf; 35527f654740f2a26ad62a5c155af9199af9e69b889claireho } 35627f654740f2a26ad62a5c155af9199af9e69b889claireho } 35727f654740f2a26ad62a5c155af9199af9e69b889claireho}; 35827f654740f2a26ad62a5c155af9199af9e69b889claireho 35983a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius 36083a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius 36183a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius#define NUM_STRING "9876543210.123" 36283a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius#define NUM_NUM 9876543210.123 36383a171d1a62abf406f7f44ae671823d5ec20db7dCraig Corneliusclass StdioNumFmtFunction : public UPerfFunction 36483a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius{ 36583a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius 36683a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius private: 36783a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius int num; 36883a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius char locale[25]; 36983a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius public: 37083a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius 37183a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius StdioNumFmtFunction() 37283a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius { 37383a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius num = -1; 37483a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius } 37583a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius 37683a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius StdioNumFmtFunction(int a, const char* loc) 37783a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius { 37883a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius num = a; 37983a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius strcpy(locale, loc); 38083a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius } 38183a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius 38283a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius virtual void call(UErrorCode* status2) 38383a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius { 38483a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius Locale loc(locale); 38583a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius UErrorCode status = U_ZERO_ERROR; 38683a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius 38783a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius // Parse a string. The string uses the digits '0' through '9' 38883a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius // and the decimal separator '.', standard in the US locale 38983a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius 39083a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius double result; 39183a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius char outbuf[500]; 39283a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius const char *str = NUM_STRING; 39383a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius 39483a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius for(int i = 0; i < num; i++) 39583a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius { 39683a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius if(sscanf(str, "%lg", &result)!=1) { 39783a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius cout << "Failed Stdio: failed to sscanf" << endl; 39883a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius *status2 = U_PARSE_ERROR; 39983a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius return; 40083a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius } 40183a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius 40283a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius sprintf(outbuf, "%lg", result); 40383a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius } 40483a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius 40583a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius if(result!=NUM_NUM) { 40683a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius cout << "Failed Stdio: sscanf got wrong result, expected " << NUM_NUM << " got " << result << endl; 40783a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius *status2 = U_PARSE_ERROR; 40883a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius } 40983a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius if(strcmp(str,NUM_STRING)) { 41083a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius cout << "Failed Stdio: sprintf got wrong result, expected " << NUM_STRING << " got " << str << endl; 41183a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius *status2 = U_PARSE_ERROR; 41283a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius } 41383a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius } 41483a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius 41583a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius virtual long getOperationsPerIteration() 41683a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius { 41783a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius return num; 41883a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius } 41983a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius 42083a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius}; 42183a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius 42227f654740f2a26ad62a5c155af9199af9e69b889clairehoclass CollationFunction : public UPerfFunction 42327f654740f2a26ad62a5c155af9199af9e69b889claireho{ 42427f654740f2a26ad62a5c155af9199af9e69b889claireho 42527f654740f2a26ad62a5c155af9199af9e69b889clairehoprivate: 42627f654740f2a26ad62a5c155af9199af9e69b889claireho int num; 42727f654740f2a26ad62a5c155af9199af9e69b889claireho char locale[25]; 42827f654740f2a26ad62a5c155af9199af9e69b889claireho UnicodeString *collation_strings; 42927f654740f2a26ad62a5c155af9199af9e69b889claireho 43027f654740f2a26ad62a5c155af9199af9e69b889claireho /** 43127f654740f2a26ad62a5c155af9199af9e69b889claireho * Unescape the strings 43227f654740f2a26ad62a5c155af9199af9e69b889claireho */ 43327f654740f2a26ad62a5c155af9199af9e69b889claireho void init() { 43427f654740f2a26ad62a5c155af9199af9e69b889claireho uint32_t listSize = sizeof(collation_strings_escaped)/sizeof(collation_strings_escaped[0]); 43527f654740f2a26ad62a5c155af9199af9e69b889claireho collation_strings = new UnicodeString[listSize]; 43627f654740f2a26ad62a5c155af9199af9e69b889claireho for(uint32_t k=0;k<listSize;k++) { 43727f654740f2a26ad62a5c155af9199af9e69b889claireho collation_strings[k] = collation_strings_escaped[k].unescape(); 43827f654740f2a26ad62a5c155af9199af9e69b889claireho } 43927f654740f2a26ad62a5c155af9199af9e69b889claireho UnicodeString shorty((UChar32)0x12345); 44027f654740f2a26ad62a5c155af9199af9e69b889claireho } 44127f654740f2a26ad62a5c155af9199af9e69b889clairehopublic: 44227f654740f2a26ad62a5c155af9199af9e69b889claireho 44327f654740f2a26ad62a5c155af9199af9e69b889claireho CollationFunction() 44427f654740f2a26ad62a5c155af9199af9e69b889claireho { 44527f654740f2a26ad62a5c155af9199af9e69b889claireho num = -1; 44627f654740f2a26ad62a5c155af9199af9e69b889claireho 44727f654740f2a26ad62a5c155af9199af9e69b889claireho init(); 44827f654740f2a26ad62a5c155af9199af9e69b889claireho } 44927f654740f2a26ad62a5c155af9199af9e69b889claireho 45027f654740f2a26ad62a5c155af9199af9e69b889claireho ~CollationFunction() { 45127f654740f2a26ad62a5c155af9199af9e69b889claireho delete [] collation_strings; 45227f654740f2a26ad62a5c155af9199af9e69b889claireho } 45327f654740f2a26ad62a5c155af9199af9e69b889claireho 45427f654740f2a26ad62a5c155af9199af9e69b889claireho CollationFunction(int a, const char* loc) 45527f654740f2a26ad62a5c155af9199af9e69b889claireho { 45627f654740f2a26ad62a5c155af9199af9e69b889claireho num = a; 45727f654740f2a26ad62a5c155af9199af9e69b889claireho strcpy(locale, loc); 45827f654740f2a26ad62a5c155af9199af9e69b889claireho init(); 45927f654740f2a26ad62a5c155af9199af9e69b889claireho } 46027f654740f2a26ad62a5c155af9199af9e69b889claireho 46127f654740f2a26ad62a5c155af9199af9e69b889claireho virtual void call(UErrorCode* status2) 46227f654740f2a26ad62a5c155af9199af9e69b889claireho { 46327f654740f2a26ad62a5c155af9199af9e69b889claireho uint32_t listSize = sizeof(collation_strings_escaped)/sizeof(collation_strings_escaped[0]); 46427f654740f2a26ad62a5c155af9199af9e69b889claireho UErrorCode status = U_ZERO_ERROR; 46527f654740f2a26ad62a5c155af9199af9e69b889claireho Collator *coll = Collator::createInstance(Locale(locale), status); 46627f654740f2a26ad62a5c155af9199af9e69b889claireho 46727f654740f2a26ad62a5c155af9199af9e69b889claireho for(int k = 0; k < num; k++) 46827f654740f2a26ad62a5c155af9199af9e69b889claireho { 46927f654740f2a26ad62a5c155af9199af9e69b889claireho uint32_t i, j; 47027f654740f2a26ad62a5c155af9199af9e69b889claireho for(i=listSize-1; i>=1; i--) { 47127f654740f2a26ad62a5c155af9199af9e69b889claireho for(j=0; j<i; j++) { 47227f654740f2a26ad62a5c155af9199af9e69b889claireho if(coll->compare(collation_strings[j], collation_strings[j+1]) == UCOL_LESS) { 47327f654740f2a26ad62a5c155af9199af9e69b889claireho //cout << "Success!" << endl; 47427f654740f2a26ad62a5c155af9199af9e69b889claireho } 47527f654740f2a26ad62a5c155af9199af9e69b889claireho } 47627f654740f2a26ad62a5c155af9199af9e69b889claireho } 47727f654740f2a26ad62a5c155af9199af9e69b889claireho } 47827f654740f2a26ad62a5c155af9199af9e69b889claireho delete coll; 47927f654740f2a26ad62a5c155af9199af9e69b889claireho } 48027f654740f2a26ad62a5c155af9199af9e69b889claireho 48127f654740f2a26ad62a5c155af9199af9e69b889claireho virtual long getOperationsPerIteration() 48227f654740f2a26ad62a5c155af9199af9e69b889claireho { 48327f654740f2a26ad62a5c155af9199af9e69b889claireho return num; 48427f654740f2a26ad62a5c155af9199af9e69b889claireho } 48527f654740f2a26ad62a5c155af9199af9e69b889claireho}; 48627f654740f2a26ad62a5c155af9199af9e69b889claireho 48727f654740f2a26ad62a5c155af9199af9e69b889clairehoclass DateFormatPerfTest : public UPerfTest 48827f654740f2a26ad62a5c155af9199af9e69b889claireho{ 48927f654740f2a26ad62a5c155af9199af9e69b889clairehoprivate: 49027f654740f2a26ad62a5c155af9199af9e69b889claireho 49127f654740f2a26ad62a5c155af9199af9e69b889clairehopublic: 49227f654740f2a26ad62a5c155af9199af9e69b889claireho 49327f654740f2a26ad62a5c155af9199af9e69b889claireho DateFormatPerfTest(int32_t argc, const char* argv[], UErrorCode& status); 49427f654740f2a26ad62a5c155af9199af9e69b889claireho ~DateFormatPerfTest(); 49527f654740f2a26ad62a5c155af9199af9e69b889claireho virtual UPerfFunction* runIndexedTest(int32_t index, UBool exec,const char* &name, char* par); 49627f654740f2a26ad62a5c155af9199af9e69b889claireho 49727f654740f2a26ad62a5c155af9199af9e69b889claireho UPerfFunction* DateFmt250(); 49827f654740f2a26ad62a5c155af9199af9e69b889claireho UPerfFunction* DateFmt10000(); 49927f654740f2a26ad62a5c155af9199af9e69b889claireho UPerfFunction* DateFmt100000(); 50027f654740f2a26ad62a5c155af9199af9e69b889claireho UPerfFunction* BreakItWord250(); 50127f654740f2a26ad62a5c155af9199af9e69b889claireho UPerfFunction* BreakItWord10000(); 50227f654740f2a26ad62a5c155af9199af9e69b889claireho UPerfFunction* BreakItChar250(); 50327f654740f2a26ad62a5c155af9199af9e69b889claireho UPerfFunction* BreakItChar10000(); 50427f654740f2a26ad62a5c155af9199af9e69b889claireho UPerfFunction* NumFmt10000(); 50527f654740f2a26ad62a5c155af9199af9e69b889claireho UPerfFunction* NumFmt100000(); 50627f654740f2a26ad62a5c155af9199af9e69b889claireho UPerfFunction* Collation10000(); 50727f654740f2a26ad62a5c155af9199af9e69b889claireho UPerfFunction* Collation100000(); 50827f654740f2a26ad62a5c155af9199af9e69b889claireho}; 50927f654740f2a26ad62a5c155af9199af9e69b889claireho 51027f654740f2a26ad62a5c155af9199af9e69b889claireho#endif // DateFmtPerf 511