comparison druntime/src/compiler/dmd/typeinfo/ti_Aint.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_Aint;
3
4 private import stdc.string;
5
6 // int[]
7
8 class TypeInfo_Ai : TypeInfo
9 {
10 override string toString() { return "int[]"; }
11
12 override hash_t getHash(in void* p)
13 { int[] s = *cast(int[]*)p;
14 auto 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;
22 str++;
23 len--;
24 }
25
26 return hash;
27 }
28
29 override equals_t equals(in void* p1, in void* p2)
30 {
31 int[] s1 = *cast(int[]*)p1;
32 int[] s2 = *cast(int[]*)p2;
33
34 return s1.length == s2.length &&
35 memcmp(cast(void *)s1, cast(void *)s2, s1.length * int.sizeof) == 0;
36 }
37
38 override int compare(in void* p1, in void* p2)
39 {
40 int[] s1 = *cast(int[]*)p1;
41 int[] s2 = *cast(int[]*)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 int result = s1[u] - s2[u];
49 if (result)
50 return result;
51 }
52 if (s1.length < s2.length)
53 return -1;
54 else if (s1.length > s2.length)
55 return 1;
56 return 0;
57 }
58
59 override size_t tsize()
60 {
61 return (int[]).sizeof;
62 }
63
64 override uint flags()
65 {
66 return 1;
67 }
68
69 override TypeInfo next()
70 {
71 return typeid(int);
72 }
73 }
74
75 unittest
76 {
77 int[][] a = [[5,3,8,7], [2,5,3,8,7]];
78 a.sort;
79 assert(a == [[2,5,3,8,7], [5,3,8,7]]);
80
81 a = [[5,3,8,7], [5,3,8]];
82 a.sort;
83 assert(a == [[5,3,8], [5,3,8,7]]);
84 }
85
86 // uint[]
87
88 class TypeInfo_Ak : TypeInfo_Ai
89 {
90 override string toString() { return "uint[]"; }
91
92 override int compare(in void* p1, in void* p2)
93 {
94 uint[] s1 = *cast(uint[]*)p1;
95 uint[] s2 = *cast(uint[]*)p2;
96 size_t len = s1.length;
97
98 if (s2.length < len)
99 len = s2.length;
100 for (size_t u = 0; u < len; u++)
101 {
102 int result = s1[u] - s2[u];
103 if (result)
104 return result;
105 }
106 if (s1.length < s2.length)
107 return -1;
108 else if (s1.length > s2.length)
109 return 1;
110 return 0;
111 }
112
113 override TypeInfo next()
114 {
115 return typeid(uint);
116 }
117 }
118
119 // dchar[]
120
121 class TypeInfo_Aw : TypeInfo_Ak
122 {
123 override string toString() { return "dchar[]"; }
124
125 override TypeInfo next()
126 {
127 return typeid(dchar);
128 }
129 }