Mercurial > projects > ldc
comparison lphobos/typeinfo2/ti_Along.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_Along; | |
2 | |
3 extern(C) int memcmp(void*,void*,size_t); | |
4 | |
5 // long[] | |
6 | |
7 class TypeInfo_Al : TypeInfo | |
8 { | |
9 char[] toString() { return "long[]"; } | |
10 | |
11 hash_t getHash(void *p) | |
12 { long[] s = *cast(long[]*)p; | |
13 size_t len = s.length; | |
14 auto str = s.ptr; | |
15 hash_t hash = 0; | |
16 | |
17 while (len) | |
18 { | |
19 hash *= 9; | |
20 hash += *cast(uint *)str + *(cast(uint *)str + 1); | |
21 str++; | |
22 len--; | |
23 } | |
24 | |
25 return hash; | |
26 } | |
27 | |
28 int equals(void *p1, void *p2) | |
29 { | |
30 long[] s1 = *cast(long[]*)p1; | |
31 long[] s2 = *cast(long[]*)p2; | |
32 | |
33 return s1.length == s2.length && | |
34 memcmp(cast(void *)s1, cast(void *)s2, s1.length * long.sizeof) == 0; | |
35 } | |
36 | |
37 int compare(void *p1, void *p2) | |
38 { | |
39 long[] s1 = *cast(long[]*)p1; | |
40 long[] s2 = *cast(long[]*)p2; | |
41 size_t len = s1.length; | |
42 | |
43 if (s2.length < len) | |
44 len = s2.length; | |
45 for (size_t u = 0; u < len; u++) | |
46 { | |
47 if (s1[u] < s2[u]) | |
48 return -1; | |
49 else if (s1[u] > s2[u]) | |
50 return 1; | |
51 } | |
52 return cast(int)s1.length - cast(int)s2.length; | |
53 } | |
54 | |
55 size_t tsize() | |
56 { | |
57 return (long[]).sizeof; | |
58 } | |
59 | |
60 uint flags() | |
61 { | |
62 return 1; | |
63 } | |
64 | |
65 TypeInfo next() | |
66 { | |
67 return typeid(long); | |
68 } | |
69 } | |
70 | |
71 | |
72 // ulong[] | |
73 | |
74 class TypeInfo_Am : TypeInfo_Al | |
75 { | |
76 char[] toString() { return "ulong[]"; } | |
77 | |
78 int compare(void *p1, void *p2) | |
79 { | |
80 ulong[] s1 = *cast(ulong[]*)p1; | |
81 ulong[] s2 = *cast(ulong[]*)p2; | |
82 size_t len = s1.length; | |
83 | |
84 if (s2.length < len) | |
85 len = s2.length; | |
86 for (size_t u = 0; u < len; u++) | |
87 { | |
88 if (s1[u] < s2[u]) | |
89 return -1; | |
90 else if (s1[u] > s2[u]) | |
91 return 1; | |
92 } | |
93 return cast(int)s1.length - cast(int)s2.length; | |
94 } | |
95 | |
96 TypeInfo next() | |
97 { | |
98 return typeid(ulong); | |
99 } | |
100 } | |
101 | |
102 |