1 
2 module rt.compiler.gdc.typeinfo.ti_Ashort;
3 
4 private import tango.stdc.string : memcmp;
5 private import rt.compiler.util.hash;
6 
7 // short[]
8 
9 class TypeInfo_As : TypeInfo_Array
10 {
11     override char[] toString() { return "short[]"; }
12 
13     override hash_t getHash(in void* p)
14     {   short[] s = *cast(short[]*)p;
15         size_t len = s.length;
16         short *str = s.ptr;
17         return rt_hash_str(str,len*short.sizeof,0);
18     }
19 
20     override equals_t equals(in void* p1, in void* p2)
21     {
22         short[] s1 = *cast(short[]*)p1;
23         short[] s2 = *cast(short[]*)p2;
24 
25         return s1.length == s2.length &&
26                memcmp(cast(void *)s1, cast(void *)s2, s1.length * short.sizeof) == 0;
27     }
28 
29     override int compare(in void* p1, in void* p2)
30     {
31         short[] s1 = *cast(short[]*)p1;
32         short[] s2 = *cast(short[]*)p2;
33         size_t len = s1.length;
34 
35         if (s2.length < len)
36             len = s2.length;
37         for (size_t u = 0; u < len; u++)
38         {
39             int result = s1[u] - s2[u];
40             if (result)
41                 return result;
42         }
43         if (s1.length < s2.length)
44             return -1;
45         else if (s1.length > s2.length)
46             return 1;
47         return 0;
48     }
49 
50     override size_t talign()
51     {
52         return (short[]).alignof;
53     }
54 
55     override size_t tsize()
56     {
57         return (short[]).sizeof;
58     }
59 
60     override uint flags()
61     {
62         return 1;
63     }
64 
65     override TypeInfo next()
66     {
67         return typeid(short);
68     }
69 }
70 
71 
72 // ushort[]
73 
74 class TypeInfo_At : TypeInfo_As
75 {
76     override char[] toString() { return "ushort[]"; }
77 
78     override int compare(in void* p1, in void* p2)
79     {
80         ushort[] s1 = *cast(ushort[]*)p1;
81         ushort[] s2 = *cast(ushort[]*)p2;
82         size_t len = s1.length;
83 
84         if (s2.length < len)
85             len = s2.length;
86         for (size_t u = 0; u < len; u++)
87         {
88             int result = s1[u] - s2[u];
89             if (result)
90                 return result;
91         }
92         if (s1.length < s2.length)
93             return -1;
94         else if (s1.length > s2.length)
95             return 1;
96         return 0;
97     }
98 
99     override TypeInfo next()
100     {
101         return typeid(ushort);
102     }
103 }
104 
105 // wchar[]
106 
107 class TypeInfo_Au : TypeInfo_At
108 {
109     override char[] toString() { return "wchar[]"; }
110 
111     // getHash should be overridden and call rt_hash_utf16 if one wants dependence for codepoints only
112     override TypeInfo next()
113     {
114         return typeid(wchar);
115     }
116 
117     version (X86_64) override int argTypes(out TypeInfo arg1, out TypeInfo arg2)
118     {
119         arg1 = typeid(size_t);
120         arg2 = typeid(void*);
121         return 0;
122     }
123 }