comparison druntime/src/compiler/ldc/typeinfo/ti_Ag.d @ 759:d3eb054172f9

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