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