Mercurial > projects > ldc
comparison lphobos/typeinfo2/ti_Ag.d @ 59:362825278842 trunk
[svn r63] Forgot lphobos/typeinfo2
author | lindquist |
---|---|
date | Thu, 25 Oct 2007 09:04:00 +0200 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
58:2c3cd3596187 | 59:362825278842 |
---|---|
1 module typeinfo2.ti_Ag; | |
2 | |
3 private int string_cmp(char[] s1, char[] s2) | |
4 { | |
5 auto len = s1.length; | |
6 if (s2.length < len) | |
7 len = s2.length; | |
8 int result = memcmp(s1.ptr, s2.ptr, len); | |
9 if (result == 0) | |
10 result = cast(int)(cast(ptrdiff_t)s1.length - cast(ptrdiff_t)s2.length); | |
11 return result; | |
12 } | |
13 | |
14 extern(C) int memcmp(void*,void*,size_t); | |
15 | |
16 // byte[] | |
17 | |
18 class TypeInfo_Ag : TypeInfo | |
19 { | |
20 char[] toString() { return "byte[]"; } | |
21 | |
22 hash_t getHash(void *p) | |
23 { byte[] s = *cast(byte[]*)p; | |
24 size_t len = s.length; | |
25 byte *str = s.ptr; | |
26 hash_t hash = 0; | |
27 | |
28 while (1) | |
29 { | |
30 switch (len) | |
31 { | |
32 case 0: | |
33 return hash; | |
34 | |
35 case 1: | |
36 hash *= 9; | |
37 hash += *cast(ubyte *)str; | |
38 return hash; | |
39 | |
40 case 2: | |
41 hash *= 9; | |
42 hash += *cast(ushort *)str; | |
43 return hash; | |
44 | |
45 case 3: | |
46 hash *= 9; | |
47 hash += (*cast(ushort *)str << 8) + | |
48 (cast(ubyte *)str)[2]; | |
49 return hash; | |
50 | |
51 default: | |
52 hash *= 9; | |
53 hash += *cast(uint *)str; | |
54 str += 4; | |
55 len -= 4; | |
56 break; | |
57 } | |
58 } | |
59 | |
60 return hash; | |
61 } | |
62 | |
63 int equals(void *p1, void *p2) | |
64 { | |
65 byte[] s1 = *cast(byte[]*)p1; | |
66 byte[] s2 = *cast(byte[]*)p2; | |
67 | |
68 return s1.length == s2.length && | |
69 memcmp(cast(byte *)s1, cast(byte *)s2, s1.length) == 0; | |
70 } | |
71 | |
72 int compare(void *p1, void *p2) | |
73 { | |
74 byte[] s1 = *cast(byte[]*)p1; | |
75 byte[] s2 = *cast(byte[]*)p2; | |
76 size_t len = s1.length; | |
77 | |
78 if (s2.length < len) | |
79 len = s2.length; | |
80 for (size_t u = 0; u < len; u++) | |
81 { | |
82 int result = s1[u] - s2[u]; | |
83 if (result) | |
84 return result; | |
85 } | |
86 return cast(int)s1.length - cast(int)s2.length; | |
87 } | |
88 | |
89 size_t tsize() | |
90 { | |
91 return (byte[]).sizeof; | |
92 } | |
93 | |
94 uint flags() | |
95 { | |
96 return 1; | |
97 } | |
98 | |
99 TypeInfo next() | |
100 { | |
101 return typeid(byte); | |
102 } | |
103 } | |
104 | |
105 | |
106 // ubyte[] | |
107 | |
108 class TypeInfo_Ah : TypeInfo_Ag | |
109 { | |
110 char[] toString() { return "ubyte[]"; } | |
111 | |
112 int compare(void *p1, void *p2) | |
113 { | |
114 char[] s1 = *cast(char[]*)p1; | |
115 char[] s2 = *cast(char[]*)p2; | |
116 | |
117 return string_cmp(s1, s2); | |
118 } | |
119 | |
120 TypeInfo next() | |
121 { | |
122 return typeid(ubyte); | |
123 } | |
124 } | |
125 | |
126 // void[] | |
127 | |
128 class TypeInfo_Av : TypeInfo_Ah | |
129 { | |
130 char[] toString() { return "void[]"; } | |
131 | |
132 TypeInfo next() | |
133 { | |
134 return typeid(void); | |
135 } | |
136 } | |
137 | |
138 // bool[] | |
139 | |
140 class TypeInfo_Ab : TypeInfo_Ah | |
141 { | |
142 char[] toString() { return "bool[]"; } | |
143 | |
144 TypeInfo next() | |
145 { | |
146 return typeid(bool); | |
147 } | |
148 } | |
149 | |
150 // char[] | |
151 | |
152 class TypeInfo_Aa : TypeInfo_Ag | |
153 { | |
154 char[] toString() { return "char[]"; } | |
155 | |
156 hash_t getHash(void *p) | |
157 { char[] s = *cast(char[]*)p; | |
158 hash_t hash = 0; | |
159 | |
160 version (all) | |
161 { | |
162 foreach (char c; s) | |
163 hash = hash * 11 + c; | |
164 } | |
165 else | |
166 { | |
167 size_t len = s.length; | |
168 char *str = s; | |
169 | |
170 while (1) | |
171 { | |
172 switch (len) | |
173 { | |
174 case 0: | |
175 return hash; | |
176 | |
177 case 1: | |
178 hash *= 9; | |
179 hash += *cast(ubyte *)str; | |
180 return hash; | |
181 | |
182 case 2: | |
183 hash *= 9; | |
184 hash += *cast(ushort *)str; | |
185 return hash; | |
186 | |
187 case 3: | |
188 hash *= 9; | |
189 hash += (*cast(ushort *)str << 8) + | |
190 (cast(ubyte *)str)[2]; | |
191 return hash; | |
192 | |
193 default: | |
194 hash *= 9; | |
195 hash += *cast(uint *)str; | |
196 str += 4; | |
197 len -= 4; | |
198 break; | |
199 } | |
200 } | |
201 } | |
202 return hash; | |
203 } | |
204 | |
205 TypeInfo next() | |
206 { | |
207 return typeid(char); | |
208 } | |
209 } | |
210 | |
211 |