/usr/lib/gcc/x86_64-linux-gnu/5/include/d/rt/typeinfo/ti_Aint.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 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 | /**
* 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_Aint;
private import core.stdc.string;
private import rt.util.hash;
extern (C) void[] _adSort(void[] a, TypeInfo ti);
// int[]
class TypeInfo_Ai : TypeInfo_Array
{
override bool opEquals(Object o) { return TypeInfo.opEquals(o); }
override string toString() const { return "int[]"; }
override size_t getHash(in void* p) @trusted const
{
int[] s = *cast(int[]*)p;
return rt.util.hash.hashOf(s.ptr, s.length * int.sizeof);
}
override bool equals(in void* p1, in void* p2) const
{
int[] s1 = *cast(int[]*)p1;
int[] s2 = *cast(int[]*)p2;
return s1.length == s2.length &&
memcmp(cast(void *)s1, cast(void *)s2, s1.length * int.sizeof) == 0;
}
override int compare(in void* p1, in void* p2) const
{
int[] s1 = *cast(int[]*)p1;
int[] s2 = *cast(int[]*)p2;
size_t len = s1.length;
if (s2.length < len)
len = s2.length;
for (size_t u = 0; u < len; u++)
{
if (s1[u] < s2[u])
return -1;
else if (s1[u] > s2[u])
return 1;
}
if (s1.length < s2.length)
return -1;
else if (s1.length > s2.length)
return 1;
return 0;
}
override @property inout(TypeInfo) next() inout
{
return cast(inout)typeid(int);
}
}
unittest
{
int[][] a = [[5,3,8,7], [2,5,3,8,7]];
_adSort(*cast(void[]*)&a, typeid(a[0]));
assert(a == [[2,5,3,8,7], [5,3,8,7]]);
a = [[5,3,8,7], [5,3,8]];
_adSort(*cast(void[]*)&a, typeid(a[0]));
assert(a == [[5,3,8], [5,3,8,7]]);
}
unittest
{
// Issue 13073: original code uses int subtraction which is susceptible to
// integer overflow, causing the following case to fail.
int[] a = [int.max, int.max];
int[] b = [int.min, int.min];
assert(a > b);
assert(b < a);
}
// uint[]
class TypeInfo_Ak : TypeInfo_Ai
{
override string toString() const { return "uint[]"; }
override int compare(in void* p1, in void* p2) const
{
uint[] s1 = *cast(uint[]*)p1;
uint[] s2 = *cast(uint[]*)p2;
size_t len = s1.length;
if (s2.length < len)
len = s2.length;
for (size_t u = 0; u < len; u++)
{
if (s1[u] < s2[u])
return -1;
else if (s1[u] > s2[u])
return 1;
}
if (s1.length < s2.length)
return -1;
else if (s1.length > s2.length)
return 1;
return 0;
}
override @property inout(TypeInfo) next() inout
{
return cast(inout)typeid(uint);
}
}
unittest
{
// Original test case from issue 13073
uint x = 0x22_DF_FF_FF;
uint y = 0xA2_DF_FF_FF;
assert(!(x < y && y < x));
uint[] a = [x];
uint[] b = [y];
assert(!(a < b && b < a)); // Original failing case
uint[1] a1 = [x];
uint[1] b1 = [y];
assert(!(a1 < b1 && b1 < a1)); // Original failing case
}
// dchar[]
class TypeInfo_Aw : TypeInfo_Ak
{
override string toString() const { return "dchar[]"; }
override @property inout(TypeInfo) next() inout
{
return cast(inout)typeid(dchar);
}
}
|