comparison druntime/src/compiler/ldc/typeinfo/ti_Aint.d @ 1458:e0b2d67cfe7c

Added druntime (this should be removed once it works).
author Robert Clipsham <robert@octarineparrot.com>
date Tue, 02 Jun 2009 17:43:06 +0100
parents
children
comparison
equal deleted inserted replaced
1456:7b218ec1044f 1458:e0b2d67cfe7c
1 /**
2 * TypeInfo support code.
3 *
4 * Copyright: Copyright Digital Mars 2004 - 2009.
5 * License: <a href="http://www.boost.org/LICENSE_1_0.txt>Boost License 1.0</a>.
6 * Authors: Walter Bright
7 *
8 * Copyright Digital Mars 2004 - 2009.
9 * Distributed under the Boost Software License, Version 1.0.
10 * (See accompanying file LICENSE_1_0.txt or copy at
11 * http://www.boost.org/LICENSE_1_0.txt)
12 */
13 module rt.typeinfo.ti_Aint;
14
15 private import core.stdc.string;
16
17 // int[]
18
19 class TypeInfo_Ai : TypeInfo
20 {
21 override string toString() { return "int[]"; }
22
23 override hash_t getHash(in void* p)
24 { int[] s = *cast(int[]*)p;
25 auto len = s.length;
26 auto str = s.ptr;
27 hash_t hash = 0;
28
29 while (len)
30 {
31 hash *= 9;
32 hash += *cast(uint *)str;
33 str++;
34 len--;
35 }
36
37 return hash;
38 }
39
40 override equals_t equals(in void* p1, in void* p2)
41 {
42 int[] s1 = *cast(int[]*)p1;
43 int[] s2 = *cast(int[]*)p2;
44
45 return s1.length == s2.length &&
46 memcmp(cast(void *)s1, cast(void *)s2, s1.length * int.sizeof) == 0;
47 }
48
49 override int compare(in void* p1, in void* p2)
50 {
51 int[] s1 = *cast(int[]*)p1;
52 int[] s2 = *cast(int[]*)p2;
53 size_t len = s1.length;
54
55 if (s2.length < len)
56 len = s2.length;
57 for (size_t u = 0; u < len; u++)
58 {
59 int result = s1[u] - s2[u];
60 if (result)
61 return result;
62 }
63 if (s1.length < s2.length)
64 return -1;
65 else if (s1.length > s2.length)
66 return 1;
67 return 0;
68 }
69
70 override size_t tsize()
71 {
72 return (int[]).sizeof;
73 }
74
75 override uint flags()
76 {
77 return 1;
78 }
79
80 override TypeInfo next()
81 {
82 return typeid(int);
83 }
84 }
85
86 unittest
87 {
88 int[][] a = [[5,3,8,7], [2,5,3,8,7]];
89 a.sort;
90 assert(a == [[2,5,3,8,7], [5,3,8,7]]);
91
92 a = [[5,3,8,7], [5,3,8]];
93 a.sort;
94 assert(a == [[5,3,8], [5,3,8,7]]);
95 }
96
97 // uint[]
98
99 class TypeInfo_Ak : TypeInfo_Ai
100 {
101 override string toString() { return "uint[]"; }
102
103 override int compare(in void* p1, in void* p2)
104 {
105 uint[] s1 = *cast(uint[]*)p1;
106 uint[] s2 = *cast(uint[]*)p2;
107 size_t len = s1.length;
108
109 if (s2.length < len)
110 len = s2.length;
111 for (size_t u = 0; u < len; u++)
112 {
113 int result = s1[u] - s2[u];
114 if (result)
115 return result;
116 }
117 if (s1.length < s2.length)
118 return -1;
119 else if (s1.length > s2.length)
120 return 1;
121 return 0;
122 }
123
124 override TypeInfo next()
125 {
126 return typeid(uint);
127 }
128 }
129
130 // dchar[]
131
132 class TypeInfo_Aw : TypeInfo_Ak
133 {
134 override string toString() { return "dchar[]"; }
135
136 override TypeInfo next()
137 {
138 return typeid(dchar);
139 }
140 }