1
2 // double
3
4 module rt.compiler.gdc.typeinfo.ti_double;
5 private import rt.compiler.util.hash;
6
7 class TypeInfo_d : TypeInfo
8 {
9 override char[] toString() { return "double"; }
10
11 override hash_t getHash(in void* p)
12 {
13 return rt_hash_str(p,double.sizeof);
14 }
15
16 static equals_t _equals(double f1, double f2)
17 {
18 return f1 == f2 ||
19 (f1 !<>= f1 && f2 !<>= f2);
20 }
21
22 static int _compare(double d1, double d2)
23 {
24 if (d1 !<>= d2) // if either are NaN
25 {
26 if (d1 !<>= d1)
27 { if (d2 !<>= d2)
28 return 0;
29 return -1;
30 }
31 return 1;
32 }
33 return (d1 == d2) ? 0 : ((d1 < d2) ? -1 : 1);
34 }
35
36 override equals_t equals(in void* p1, in void* p2)
37 {
38 return _equals(*cast(double *)p1, *cast(double *)p2);
39 }
40
41 override int compare(in void* p1, in void* p2)
42 {
43 return _compare(*cast(double *)p1, *cast(double *)p2);
44 }
45
46 override size_t talign()
47 {
48 return double.alignof;
49 }
50
51 override size_t tsize()
52 {
53 return double.sizeof;
54 }
55
56 override void swap(void *p1, void *p2)
57 {
58 double t;
59
60 t = *cast(double *)p1;
61 *cast(double *)p1 = *cast(double *)p2;
62 *cast(double *)p2 = t;
63 }
64
65 override void[] init()
66 { static double r;
67
68 return (cast(double *)&r)[0 .. 1];
69 }
70 }