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 */
14module rt.typeinfo.ti_Along;
15
16private import core.stdc.string;
17
18// long[]
19
20class TypeInfo_Al : TypeInfo_Array
21{
22    override bool opEquals(Object o) { return TypeInfo.opEquals(o); }
23
24    override string toString() const { return "long[]"; }
25
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
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
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
64    override @property inout(TypeInfo) next() inout
65    {
66        return cast(inout)typeid(long);
67    }
68}
69
70
71// ulong[]
72
73class TypeInfo_Am : TypeInfo_Al
74{
75    override string toString() const { return "ulong[]"; }
76
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
99    override @property inout(TypeInfo) next() inout
100    {
101        return cast(inout)typeid(ulong);
102    }
103}
104