xref: /netbsd-src/external/gpl3/gcc.old/dist/libphobos/libdruntime/rt/typeinfo/ti_Along.d (revision 627f7eb200a4419d89b531d55fccd2ee3ffdcde0)
1 /**
2  * TypeInfo support code.
3  *
4  * Copyright: Copyright Digital Mars 2004 - 2009.
5  * License:   $(WEB www.boost.org/LICENSE_1_0.txt, Boost License 1.0).
6  * Authors:   Walter Bright
7  */
8 
9 /*          Copyright Digital Mars 2004 - 2009.
10  * Distributed under the Boost Software License, Version 1.0.
11  *    (See accompanying file LICENSE or copy at
12  *          http://www.boost.org/LICENSE_1_0.txt)
13  */
14 module rt.typeinfo.ti_Along;
15 
16 private import core.stdc.string;
17 
18 // long[]
19 
20 class TypeInfo_Al : TypeInfo_Array
21 {
opEquals(Object o)22     override bool opEquals(Object o) { return TypeInfo.opEquals(o); }
23 
toString()24     override string toString() const { return "long[]"; }
25 
getHash(scope const void * p)26     override size_t getHash(scope const void* p) @trusted const
27     {
28         // Hash as if unsigned.
29         const s = *cast(const ulong[]*)p;
30         return hashOf(s);
31     }
32 
equals(in void * p1,in void * p2)33     override bool equals(in void* p1, in void* p2) const
34     {
35         long[] s1 = *cast(long[]*)p1;
36         long[] s2 = *cast(long[]*)p2;
37 
38         return s1.length == s2.length &&
39                memcmp(cast(void *)s1, cast(void *)s2, s1.length * long.sizeof) == 0;
40     }
41 
compare(in void * p1,in void * p2)42     override int compare(in void* p1, in void* p2) const
43     {
44         long[] s1 = *cast(long[]*)p1;
45         long[] s2 = *cast(long[]*)p2;
46         size_t len = s1.length;
47 
48         if (s2.length < len)
49             len = s2.length;
50         for (size_t u = 0; u < len; u++)
51         {
52             if (s1[u] < s2[u])
53                 return -1;
54             else if (s1[u] > s2[u])
55                 return 1;
56         }
57         if (s1.length < s2.length)
58             return -1;
59         else if (s1.length > s2.length)
60             return 1;
61         return 0;
62     }
63 
inout(TypeInfo)64     override @property inout(TypeInfo) next() inout
65     {
66         return cast(inout)typeid(long);
67     }
68 }
69 
70 
71 // ulong[]
72 
73 class TypeInfo_Am : TypeInfo_Al
74 {
toString()75     override string toString() const { return "ulong[]"; }
76 
compare(in void * p1,in void * p2)77     override int compare(in void* p1, in void* p2) const
78     {
79         ulong[] s1 = *cast(ulong[]*)p1;
80         ulong[] s2 = *cast(ulong[]*)p2;
81         size_t len = s1.length;
82 
83         if (s2.length < len)
84             len = s2.length;
85         for (size_t u = 0; u < len; u++)
86         {
87             if (s1[u] < s2[u])
88                 return -1;
89             else if (s1[u] > s2[u])
90                 return 1;
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 
inout(TypeInfo)99     override @property inout(TypeInfo) next() inout
100     {
101         return cast(inout)typeid(ulong);
102     }
103 }
104