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