]> git.llucax.com Git - software/druntime.git/blob - src/compiler/dmd/typeinfo/ti_Aint.d
9eecc171b5dfe915e160e917a79469ab4e4af07a
[software/druntime.git] / src / compiler / dmd / typeinfo / ti_Aint.d
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 }