1/*
2** Copyright 2003, Axel D��rfler, axeld@pinc-software.de. All rights reserved.
3** Distributed under the terms of the MIT License.
4*/
5
6
7#include <Collator.h>
8#include <Locale.h>
9#include <StopWatch.h>
10
11#include <stdio.h>
12#include <string.h>
13#include <stdlib.h>
14
15
16const char *kStrings[] = {
17	"a-b-c",
18	"a b c",
19	"A.b.c",
20	"��,b,c",
21	"abc",
22	"gehen",
23	"g��hen",
24	"aus",
25	"��U��",
26	"auss",
27	"WO",
28	"w��",
29	"SO",
30	"so",
31	"a����",
32	"acn",
33	"p��che",
34	"p��ch��",
35	"pech��",
36	"peche",
37	"pecher",
38	"e��e",
39	"ene",
40	"nz",
41	"��a",
42	"llamar",
43	"luz",
44};
45const uint32 kNumStrings = sizeof(kStrings) / sizeof(kStrings[0]);
46const uint32 kIterations = 50000;
47
48
49void
50test(BCollator *collator, const char *name, int8 strength)
51{
52	collator->SetDefaultStrength(strength);
53
54	BStopWatch watch(name, true);
55
56	for (uint32 j = 0; j < kIterations; j++) {
57		for (uint32 i = 0; i < kNumStrings; i++) {
58			BString key;
59			collator->GetSortKey(kStrings[i], &key);
60		}
61	}
62
63	watch.Suspend();
64	double secs = watch.ElapsedTime() / 1000000.0;
65	printf("\t%s%9Ld usecs, %6.3g secs,%9lu keys/s\n",
66		name, watch.ElapsedTime(), secs, uint32(kIterations * kNumStrings / secs));
67}
68
69
70void
71usage()
72{
73	fprintf(stderr,
74		"usage: collatorSpeed [-i] [<add-on path>]\n"
75		"  -i\tignore punctuation (defaults to: punctuation matters)\n");
76	exit(-1);
77}
78
79
80int
81main(int argc, char **argv)
82{
83	// Parse command line arguments
84
85	bool ignorePunctuation = false;
86	char *addon = NULL;
87	BCollator *collator = NULL;
88
89	while ((++argv)[0]) {
90		if (argv[0][0] == '-') {
91			if (!strcmp(argv[0], "-i"))
92				ignorePunctuation = true;
93			else if (!strcmp(argv[0], "--help"))
94				usage();
95		} else {
96			// this will be the add-on to be loaded
97			addon = argv[0];
98		}
99	}
100
101	// load the collator add-on if necessary
102
103	if (addon != NULL) {
104		image_id image = load_add_on(addon);
105		if (image < B_OK)
106			fprintf(stderr, "could not load add-on at \"%s\": %s.\n", addon, strerror(image));
107
108		BCollatorAddOn *(*instantiate)(void);
109		if (get_image_symbol(image, "instantiate_collator",
110				B_SYMBOL_TYPE_TEXT, (void **)&instantiate) == B_OK) {
111			BCollatorAddOn *collatorAddOn = instantiate();
112			if (collatorAddOn != NULL)
113				collator = new BCollator(collatorAddOn, B_COLLATE_PRIMARY, true);
114		} else if (image >= B_OK) {
115			fprintf(stderr, "could not find instantiate_collator() function in add-on!\n");
116			unload_add_on(image);
117		}
118	}
119
120	if (collator == NULL) {
121		collator = be_locale->Collator();
122		addon = (char*)"default";
123	}
124
125	// test key creation speed
126
127	collator->SetIgnorePunctuation(ignorePunctuation);
128
129	printf("%s:\n", addon);
130	test(collator, "primary:   ", B_COLLATE_PRIMARY);
131	test(collator, "secondary: ", B_COLLATE_SECONDARY);
132	test(collator, "tertiary:  ", B_COLLATE_TERTIARY);
133	test(collator, "quaternary:", B_COLLATE_QUATERNARY);
134	test(collator, "identical: ", B_COLLATE_IDENTICAL);
135
136	return 0;
137}
138
139