2 * This module contains utilities for TypeInfo implementation.
4 * Copyright: Copyright Kenji Hara 2014-.
5 * License: <a href="http://www.boost.org/LICENSE_1_0.txt">Boost License 1.0</a>.
8 module rt.util.typeinfo;
11 if (is(T == float) || is(T == double) || is(T == real))
15 bool equals(T f1, T f2)
20 int compare(T d1, T d2)
22 if (d1 != d1 || d2 != d2) // if either are NaN
32 return (d1 == d2) ? 0 : ((d1 < d2) ? -1 : 1);
35 size_t hashOf(T value) @trusted
37 if (value == 0) // +0.0 and -0.0
40 static if (is(T == float)) // special case?
41 return *cast(uint*)&value;
45 return rt.util.hash.hashOf((&value)[0 .. 1], 0);
50 if (is(T == cfloat) || is(T == cdouble) || is(T == creal))
54 bool equals(T f1, T f2)
59 int compare(T f1, T f2)
65 else if (f1.re > f2.re)
67 else if (f1.im < f2.im)
69 else if (f1.im > f2.im)
76 size_t hashOf(T value) @trusted
81 return rt.util.hash.hashOf((&value)[0 .. 1], 0);
86 if (is(T == float) || is(T == double) || is(T == real) ||
87 is(T == cfloat) || is(T == cdouble) || is(T == creal))
91 bool equals(T[] s1, T[] s2)
93 size_t len = s1.length;
96 for (size_t u = 0; u < len; u++)
98 if (!Floating!T.equals(s1[u], s2[u]))
104 int compare(T[] s1, T[] s2)
106 size_t len = s1.length;
109 for (size_t u = 0; u < len; u++)
111 if (int c = Floating!T.compare(s1[u], s2[u]))
114 if (s1.length < s2.length)
116 else if (s1.length > s2.length)
121 size_t hashOf(T[] value)
125 h += Floating!T.hashOf(e);
132 alias TypeTuple(T...) = T;
138 static struct SX(F) { F f; }
142 foreach (F; TypeTuple!(float, double, real))
143 (){ // workaround #2396
151 assert(ti.getHash(&f1) == ti.getHash(&f2));
153 F[] a1 = [f1, f1, f1];
154 F[] a2 = [f2, f2, f2];
158 assert(ti.getHash(&a1) == ti.getHash(&a2));
160 F[][] aa1 = [a1, a1, a1];
161 F[][] aa2 = [a2, a2, a2];
165 assert(ti.getHash(&aa1) == ti.getHash(&aa2));
172 assert(ti.getHash(&s1) == ti.getHash(&s2));
174 S[] da1 = [S(f1), S(f1), S(f1)],
175 da2 = [S(f2), S(f2), S(f2)];
179 assert(ti.getHash(&da1) == ti.getHash(&da2));
184 assert(sa1[] !is sa2[]);
186 assert(ti.getHash(&sa1) == ti.getHash(&sa2));
190 foreach (F; TypeTuple!(ifloat, idouble, ireal))
191 (){ // workaround #2396
199 assert(ti.getHash(&f1) == ti.getHash(&f2));
201 F[] a1 = [f1, f1, f1];
202 F[] a2 = [f2, f2, f2];
206 assert(ti.getHash(&a1) == ti.getHash(&a2));
208 F[][] aa1 = [a1, a1, a1];
209 F[][] aa2 = [a2, a2, a2];
213 assert(ti.getHash(&aa1) == ti.getHash(&aa2));
220 assert(ti.getHash(&s1) == ti.getHash(&s2));
222 S[] da1 = [S(f1), S(f1), S(f1)],
223 da2 = [S(f2), S(f2), S(f2)];
227 assert(ti.getHash(&da1) == ti.getHash(&da2));
232 assert(sa1[] !is sa2[]);
234 assert(ti.getHash(&sa1) == ti.getHash(&sa2));
238 foreach (F; TypeTuple!(cfloat, cdouble, creal))
239 (){ // workaround #2396
241 F[4] f = [+0.0 + 0.0i,
246 foreach (i, f1; f) foreach (j, f2; f) if (i != j)
248 assert(f1 == 0 + 0i);
253 assert(ti.getHash(&f1) == ti.getHash(&f2));
255 F[] a1 = [f1, f1, f1];
256 F[] a2 = [f2, f2, f2];
260 assert(ti.getHash(&a1) == ti.getHash(&a2));
262 F[][] aa1 = [a1, a1, a1];
263 F[][] aa2 = [a2, a2, a2];
267 assert(ti.getHash(&aa1) == ti.getHash(&aa2));
274 assert(ti.getHash(&s1) == ti.getHash(&s2));
276 S[] da1 = [S(f1), S(f1), S(f1)],
277 da2 = [S(f2), S(f2), S(f2)];
281 assert(ti.getHash(&da1) == ti.getHash(&da2));
286 assert(sa1[] !is sa2[]);
288 assert(ti.getHash(&sa1) == ti.getHash(&sa2));