/usr/lib/gcc/x86_64-linux-gnu/5/include/d/rt/typeinfo/ti_AC.d is in libphobos-5-dev 5.5.0-12ubuntu1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 | /**
* TypeInfo support code.
*
* Copyright: Copyright Digital Mars 2004 - 2009.
* License: $(WEB www.boost.org/LICENSE_1_0.txt, Boost License 1.0).
* Authors: Walter Bright
*/
/* Copyright Digital Mars 2004 - 2009.
* Distributed under the Boost Software License, Version 1.0.
* (See accompanying file LICENSE or copy at
* http://www.boost.org/LICENSE_1_0.txt)
*/
module rt.typeinfo.ti_AC;
// Object[]
/*
NOTE: It is sometimes used for arrays of
classes or (incorrectly) interfaces.
But naked `TypeInfo_Array` is mostly used.
See @@@BUG12303@@@.
*/
class TypeInfo_AC : TypeInfo_Array
{
override string toString() const { return TypeInfo.toString(); }
override bool opEquals(Object o) { return TypeInfo.opEquals(o); }
override size_t getHash(in void* p) @trusted const
{
Object[] s = *cast(Object[]*)p;
size_t hash = 0;
foreach (Object o; s)
{
if (o)
hash += o.toHash();
}
return hash;
}
override bool equals(in void* p1, in void* p2) const
{
Object[] s1 = *cast(Object[]*)p1;
Object[] s2 = *cast(Object[]*)p2;
if (s1.length == s2.length)
{
for (size_t u = 0; u < s1.length; u++)
{
Object o1 = s1[u];
Object o2 = s2[u];
// Do not pass null's to Object.opEquals()
if (o1 is o2 ||
(!(o1 is null) && !(o2 is null) && o1.opEquals(o2)))
continue;
return false;
}
return true;
}
return false;
}
override int compare(in void* p1, in void* p2) const
{
Object[] s1 = *cast(Object[]*)p1;
Object[] s2 = *cast(Object[]*)p2;
auto c = cast(sizediff_t)(s1.length - s2.length);
if (c == 0)
{
for (size_t u = 0; u < s1.length; u++)
{
Object o1 = s1[u];
Object o2 = s2[u];
if (o1 is o2)
continue;
// Regard null references as always being "less than"
if (o1)
{
if (!o2)
return 1;
c = o1.opCmp(o2);
if (c == 0)
continue;
break;
}
else
{
return -1;
}
}
}
return c < 0 ? -1 : c > 0 ? 1 : 0;
}
override @property inout(TypeInfo) next() inout
{
return cast(inout)typeid(Object);
}
}
|