annotate lphobos/internal/switch.d @ 837:331a176c1f4f

Removed error on naked, not fully complete, but I'll be doing more work on it during this Christmas, and some things do work. Fixed taking delegate of final class method. see mini/delegate3.d.
author Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
date Tue, 09 Dec 2008 14:07:30 +0100
parents 373489eeaf90
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
122
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
1 /*
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
2 * Copyright (C) 2004-2007 by Digital Mars, www.digitalmars.com
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
3 * Written by Walter Bright
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
4 *
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
5 * This software is provided 'as-is', without any express or implied
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
6 * warranty. In no event will the authors be held liable for any damages
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
7 * arising from the use of this software.
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
8 *
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
9 * Permission is granted to anyone to use this software for any purpose,
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
10 * including commercial applications, and to alter it and redistribute it
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
11 * freely, in both source and binary form, subject to the following
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
12 * restrictions:
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
13 *
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
14 * o The origin of this software must not be misrepresented; you must not
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
15 * claim that you wrote the original software. If you use this software
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
16 * in a product, an acknowledgment in the product documentation would be
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
17 * appreciated but is not required.
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
18 * o Altered source versions must be plainly marked as such, and must not
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
19 * be misrepresented as being the original software.
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
20 * o This notice may not be removed or altered from any source
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
21 * distribution.
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
22 */
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
23
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
24
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
25 import std.c.stdio;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
26 import std.c.string;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
27 import std.string;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
28
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
29 /******************************************************
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
30 * Support for switch statements switching on strings.
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
31 * Input:
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
32 * table[] sorted array of strings generated by compiler
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
33 * ca string to look up in table
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
34 * Output:
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
35 * result index of match in table[]
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
36 * -1 if not in table
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
37 */
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
38
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
39 extern (C):
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
40
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
41 int _d_switch_string(char[][] table, char[] ca)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
42 in
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
43 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
44 //printf("in _d_switch_string()\n");
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
45 assert(table.length >= 0);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
46 assert(ca.length >= 0);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
47
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
48 // Make sure table[] is sorted correctly
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
49 int j;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
50
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
51 for (j = 1; j < table.length; j++)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
52 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
53 int len1 = table[j - 1].length;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
54 int len2 = table[j].length;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
55
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
56 assert(len1 <= len2);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
57 if (len1 == len2)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
58 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
59 int ci;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
60
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
61 ci = memcmp(table[j - 1].ptr, table[j].ptr, len1);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
62 assert(ci < 0); // ci==0 means a duplicate
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
63 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
64 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
65 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
66 out (result)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
67 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
68 int i;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
69 int cj;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
70
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
71 //printf("out _d_switch_string()\n");
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
72 if (result == -1)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
73 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
74 // Not found
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
75 for (i = 0; i < table.length; i++)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
76 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
77 if (table[i].length == ca.length)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
78 { cj = memcmp(table[i].ptr, ca.ptr, ca.length);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
79 assert(cj != 0);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
80 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
81 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
82 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
83 else
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
84 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
85 assert(0 <= result && result < table.length);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
86 for (i = 0; 1; i++)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
87 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
88 assert(i < table.length);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
89 if (table[i].length == ca.length)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
90 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
91 cj = memcmp(table[i].ptr, ca.ptr, ca.length);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
92 if (cj == 0)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
93 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
94 assert(i == result);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
95 break;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
96 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
97 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
98 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
99 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
100 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
101 body
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
102 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
103 //printf("body _d_switch_string(%.*s)\n", ca);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
104 int low;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
105 int high;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
106 int mid;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
107 int c;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
108 char[] pca;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
109
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
110 low = 0;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
111 high = table.length;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
112
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
113 version (none)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
114 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
115 // Print table
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
116 printf("ca[] = '%s'\n", cast(char *)ca);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
117 for (mid = 0; mid < high; mid++)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
118 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
119 pca = table[mid];
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
120 printf("table[%d] = %d, '%.*s'\n", mid, pca.length, pca);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
121 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
122 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
123 if (high &&
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
124 ca.length >= table[0].length &&
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
125 ca.length <= table[high - 1].length)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
126 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
127 // Looking for 0 length string, which would only be at the beginning
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
128 if (ca.length == 0)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
129 return 0;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
130
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
131 char c1 = ca[0];
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
132
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
133 // Do binary search
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
134 while (low < high)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
135 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
136 mid = (low + high) >> 1;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
137 pca = table[mid];
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
138 c = ca.length - pca.length;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
139 if (c == 0)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
140 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
141 c = cast(ubyte)c1 - cast(ubyte)pca[0];
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
142 if (c == 0)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
143 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
144 c = memcmp(ca.ptr, pca.ptr, ca.length);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
145 if (c == 0)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
146 { //printf("found %d\n", mid);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
147 return mid;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
148 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
149 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
150 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
151 if (c < 0)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
152 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
153 high = mid;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
154 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
155 else
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
156 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
157 low = mid + 1;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
158 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
159 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
160 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
161
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
162 //printf("not found\n");
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
163 return -1; // not found
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
164 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
165
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
166 unittest
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
167 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
168 switch (cast(char []) "c")
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
169 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
170 case "coo":
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
171 default:
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
172 break;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
173 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
174 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
175
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
176 /**********************************
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
177 * Same thing, but for wide chars.
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
178 */
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
179
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
180 int _d_switch_ustring(wchar[][] table, wchar[] ca)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
181 in
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
182 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
183 //printf("in _d_switch_ustring()\n");
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
184 assert(table.length >= 0);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
185 assert(ca.length >= 0);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
186
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
187 // Make sure table[] is sorted correctly
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
188 int j;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
189
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
190 for (j = 1; j < table.length; j++)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
191 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
192 int len1 = table[j - 1].length;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
193 int len2 = table[j].length;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
194
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
195 assert(len1 <= len2);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
196 if (len1 == len2)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
197 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
198 int c;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
199
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
200 c = memcmp(table[j - 1].ptr, table[j].ptr, len1 * wchar.sizeof);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
201 assert(c < 0); // c==0 means a duplicate
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
202 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
203 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
204 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
205 out (result)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
206 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
207 int i;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
208 int c;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
209
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
210 //printf("out _d_switch_string()\n");
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
211 if (result == -1)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
212 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
213 // Not found
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
214 for (i = 0; i < table.length; i++)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
215 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
216 if (table[i].length == ca.length)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
217 { c = memcmp(table[i].ptr, ca.ptr, ca.length * wchar.sizeof);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
218 assert(c != 0);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
219 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
220 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
221 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
222 else
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
223 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
224 assert(0 <= result && result < table.length);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
225 for (i = 0; 1; i++)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
226 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
227 assert(i < table.length);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
228 if (table[i].length == ca.length)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
229 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
230 c = memcmp(table[i].ptr, ca.ptr, ca.length * wchar.sizeof);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
231 if (c == 0)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
232 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
233 assert(i == result);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
234 break;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
235 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
236 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
237 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
238 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
239 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
240 body
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
241 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
242 //printf("body _d_switch_ustring()\n");
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
243 int low;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
244 int high;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
245 int mid;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
246 int c;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
247 wchar[] pca;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
248
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
249 low = 0;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
250 high = table.length;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
251
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
252 /*
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
253 // Print table
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
254 wprintf("ca[] = '%.*s'\n", ca);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
255 for (mid = 0; mid < high; mid++)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
256 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
257 pca = table[mid];
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
258 wprintf("table[%d] = %d, '%.*s'\n", mid, pca.length, pca);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
259 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
260 */
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
261
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
262 // Do binary search
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
263 while (low < high)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
264 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
265 mid = (low + high) >> 1;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
266 pca = table[mid];
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
267 c = ca.length - pca.length;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
268 if (c == 0)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
269 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
270 c = memcmp(ca.ptr, pca.ptr, ca.length * wchar.sizeof);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
271 if (c == 0)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
272 { //printf("found %d\n", mid);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
273 return mid;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
274 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
275 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
276 if (c < 0)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
277 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
278 high = mid;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
279 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
280 else
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
281 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
282 low = mid + 1;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
283 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
284 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
285 //printf("not found\n");
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
286 return -1; // not found
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
287 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
288
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
289
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
290 unittest
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
291 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
292 switch (cast(wchar []) "c")
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
293 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
294 case "coo":
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
295 default:
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
296 break;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
297 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
298 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
299
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
300
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
301 /**********************************
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
302 * Same thing, but for wide chars.
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
303 */
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
304
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
305 int _d_switch_dstring(dchar[][] table, dchar[] ca)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
306 in
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
307 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
308 //printf("in _d_switch_dstring()\n");
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
309 assert(table.length >= 0);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
310 assert(ca.length >= 0);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
311
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
312 // Make sure table[] is sorted correctly
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
313 int j;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
314
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
315 for (j = 1; j < table.length; j++)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
316 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
317 int len1 = table[j - 1].length;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
318 int len2 = table[j].length;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
319
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
320 assert(len1 <= len2);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
321 if (len1 == len2)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
322 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
323 int c;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
324
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
325 c = memcmp(table[j - 1].ptr, table[j].ptr, len1 * dchar.sizeof);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
326 assert(c < 0); // c==0 means a duplicate
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
327 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
328 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
329 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
330 out (result)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
331 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
332 int i;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
333 int c;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
334
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
335 //printf("out _d_switch_string()\n");
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
336 if (result == -1)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
337 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
338 // Not found
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
339 for (i = 0; i < table.length; i++)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
340 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
341 if (table[i].length == ca.length)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
342 { c = memcmp(table[i].ptr, ca.ptr, ca.length * dchar.sizeof);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
343 assert(c != 0);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
344 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
345 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
346 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
347 else
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
348 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
349 assert(0 <= result && result < table.length);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
350 for (i = 0; 1; i++)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
351 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
352 assert(i < table.length);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
353 if (table[i].length == ca.length)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
354 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
355 c = memcmp(table[i].ptr, ca.ptr, ca.length * dchar.sizeof);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
356 if (c == 0)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
357 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
358 assert(i == result);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
359 break;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
360 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
361 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
362 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
363 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
364 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
365 body
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
366 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
367 //printf("body _d_switch_ustring()\n");
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
368 int low;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
369 int high;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
370 int mid;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
371 int c;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
372 dchar[] pca;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
373
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
374 low = 0;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
375 high = table.length;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
376
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
377 /*
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
378 // Print table
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
379 wprintf("ca[] = '%.*s'\n", ca);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
380 for (mid = 0; mid < high; mid++)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
381 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
382 pca = table[mid];
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
383 wprintf("table[%d] = %d, '%.*s'\n", mid, pca.length, pca);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
384 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
385 */
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
386
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
387 // Do binary search
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
388 while (low < high)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
389 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
390 mid = (low + high) >> 1;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
391 pca = table[mid];
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
392 c = ca.length - pca.length;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
393 if (c == 0)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
394 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
395 c = memcmp(ca.ptr, pca.ptr, ca.length * dchar.sizeof);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
396 if (c == 0)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
397 { //printf("found %d\n", mid);
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
398 return mid;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
399 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
400 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
401 if (c < 0)
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
402 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
403 high = mid;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
404 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
405 else
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
406 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
407 low = mid + 1;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
408 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
409 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
410 //printf("not found\n");
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
411 return -1; // not found
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
412 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
413
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
414
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
415 unittest
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
416 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
417 switch (cast(dchar []) "c")
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
418 {
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
419 case "coo":
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
420 default:
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
421 break;
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
422 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
423 }
36ab367572df [svn r126] String switch is now implemented.
lindquist
parents:
diff changeset
424
473
373489eeaf90 Applied downs' lphobos update
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 122
diff changeset
425 void _d_switch_error(string fn, int line)
373489eeaf90 Applied downs' lphobos update
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 122
diff changeset
426 {
373489eeaf90 Applied downs' lphobos update
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 122
diff changeset
427 throw new Exception(fn~toString(line)~": switch missing default");
373489eeaf90 Applied downs' lphobos update
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 122
diff changeset
428 }