]> git.llucax.com Git - software/druntime.git/blob - src/compiler/dmd/typeinfo/ti_Ashort.d
12c9f56aa10ffc3969bab9c645bc1b500cef80e8
[software/druntime.git] / src / compiler / dmd / typeinfo / ti_Ashort.d
1
2 module rt.typeinfo.ti_Ashort;
3
4 private import stdc.string;
5
6 // short[]
7
8 class TypeInfo_As : TypeInfo
9 {
10     override string toString() { return "short[]"; }
11
12     override hash_t getHash(in void* p)
13     {   short[] s = *cast(short[]*)p;
14         size_t len = s.length;
15         short *str = s.ptr;
16         hash_t hash = 0;
17
18         while (1)
19         {
20             switch (len)
21             {
22                 case 0:
23                     return hash;
24
25                 case 1:
26                     hash *= 9;
27                     hash += *cast(ushort *)str;
28                     return hash;
29
30                 default:
31                     hash *= 9;
32                     hash += *cast(uint *)str;
33                     str += 2;
34                     len -= 2;
35                     break;
36             }
37         }
38
39         return hash;
40     }
41
42     override equals_t equals(in void* p1, in void* p2)
43     {
44         short[] s1 = *cast(short[]*)p1;
45         short[] s2 = *cast(short[]*)p2;
46
47         return s1.length == s2.length &&
48                memcmp(cast(void *)s1, cast(void *)s2, s1.length * short.sizeof) == 0;
49     }
50
51     override int compare(in void* p1, in void* p2)
52     {
53         short[] s1 = *cast(short[]*)p1;
54         short[] s2 = *cast(short[]*)p2;
55         size_t len = s1.length;
56
57         if (s2.length < len)
58             len = s2.length;
59         for (size_t u = 0; u < len; u++)
60         {
61             int result = s1[u] - s2[u];
62             if (result)
63                 return result;
64         }
65         if (s1.length < s2.length)
66             return -1;
67         else if (s1.length > s2.length)
68             return 1;
69         return 0;
70     }
71
72     override size_t tsize()
73     {
74         return (short[]).sizeof;
75     }
76
77     override uint flags()
78     {
79         return 1;
80     }
81
82     override TypeInfo next()
83     {
84         return typeid(short);
85     }
86 }
87
88
89 // ushort[]
90
91 class TypeInfo_At : TypeInfo_As
92 {
93     override string toString() { return "ushort[]"; }
94
95     override int compare(in void* p1, in void* p2)
96     {
97         ushort[] s1 = *cast(ushort[]*)p1;
98         ushort[] s2 = *cast(ushort[]*)p2;
99         size_t len = s1.length;
100
101         if (s2.length < len)
102             len = s2.length;
103         for (size_t u = 0; u < len; u++)
104         {
105             int result = s1[u] - s2[u];
106             if (result)
107                 return result;
108         }
109         if (s1.length < s2.length)
110             return -1;
111         else if (s1.length > s2.length)
112             return 1;
113         return 0;
114     }
115
116     override TypeInfo next()
117     {
118         return typeid(ushort);
119     }
120 }
121
122 // wchar[]
123
124 class TypeInfo_Au : TypeInfo_At
125 {
126     override string toString() { return "wchar[]"; }
127
128     override TypeInfo next()
129     {
130         return typeid(wchar);
131     }
132 }