comparison lphobos/std/typeinfounsupported/ti_Along.d @ 1:c53b6e3fe49a trunk

[svn r5] Initial commit. Most things are very rough.
author lindquist
date Sat, 01 Sep 2007 21:43:27 +0200
parents
children
comparison
equal deleted inserted replaced
0:a9e71648e74d 1:c53b6e3fe49a
1
2 module std.typeinfo.ti_Along;
3
4 private import std.c.string;
5
6 // long[]
7
8 class TypeInfo_Al : TypeInfo
9 {
10 char[] toString() { return "long[]"; }
11
12 hash_t getHash(void *p)
13 { long[] s = *cast(long[]*)p;
14 size_t len = s.length;
15 auto str = s.ptr;
16 hash_t hash = 0;
17
18 while (len)
19 {
20 hash *= 9;
21 hash += *cast(uint *)str + *(cast(uint *)str + 1);
22 str++;
23 len--;
24 }
25
26 return hash;
27 }
28
29 int equals(void *p1, void *p2)
30 {
31 long[] s1 = *cast(long[]*)p1;
32 long[] s2 = *cast(long[]*)p2;
33
34 return s1.length == s2.length &&
35 memcmp(cast(void *)s1, cast(void *)s2, s1.length * long.sizeof) == 0;
36 }
37
38 int compare(void *p1, void *p2)
39 {
40 long[] s1 = *cast(long[]*)p1;
41 long[] s2 = *cast(long[]*)p2;
42 size_t len = s1.length;
43
44 if (s2.length < len)
45 len = s2.length;
46 for (size_t u = 0; u < len; u++)
47 {
48 if (s1[u] < s2[u])
49 return -1;
50 else if (s1[u] > s2[u])
51 return 1;
52 }
53 return cast(int)s1.length - cast(int)s2.length;
54 }
55
56 size_t tsize()
57 {
58 return (long[]).sizeof;
59 }
60
61 uint flags()
62 {
63 return 1;
64 }
65
66 TypeInfo next()
67 {
68 return typeid(long);
69 }
70 }
71
72
73 // ulong[]
74
75 class TypeInfo_Am : TypeInfo_Al
76 {
77 char[] toString() { return "ulong[]"; }
78
79 int compare(void *p1, void *p2)
80 {
81 ulong[] s1 = *cast(ulong[]*)p1;
82 ulong[] s2 = *cast(ulong[]*)p2;
83 size_t len = s1.length;
84
85 if (s2.length < len)
86 len = s2.length;
87 for (size_t u = 0; u < len; u++)
88 {
89 if (s1[u] < s2[u])
90 return -1;
91 else if (s1[u] > s2[u])
92 return 1;
93 }
94 return cast(int)s1.length - cast(int)s2.length;
95 }
96
97 TypeInfo next()
98 {
99 return typeid(ulong);
100 }
101 }
102
103