Mercurial > projects > ldc
annotate lphobos/typeinfo2/ti_Areal.d @ 1351:8d501abecd24
Initial (but disabled) fix for ticket #294 , the actual part that fixes the bug is in a #if 0 block as I'm afraid it will cause regressions. I'm most likely not going to be around tonight, and maybe not tomorrow as well, so I'm pushing it in case someone wants to run some serious testing/investigate the problem noted in llvmhelpers.cpp : realignOffset .
author | Tomas Lindquist Olsen <tomas.l.olsen gmail com> |
---|---|
date | Thu, 14 May 2009 17:20:17 +0200 |
parents | b86e00b938a5 |
children |
rev | line source |
---|---|
61
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
1 /* |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
2 * Copyright (C) 2004-2006 by Digital Mars, www.digitalmars.com |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
3 * Written by Walter Bright |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
4 * |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
5 * This software is provided 'as-is', without any express or implied |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
6 * warranty. In no event will the authors be held liable for any damages |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
7 * arising from the use of this software. |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
8 * |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
9 * Permission is granted to anyone to use this software for any purpose, |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
10 * including commercial applications, and to alter it and redistribute it |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
11 * freely, in both source and binary form, subject to the following |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
12 * restrictions: |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
13 * |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
14 * o The origin of this software must not be misrepresented; you must not |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
15 * claim that you wrote the original software. If you use this software |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
16 * in a product, an acknowledgment in the product documentation would be |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
17 * appreciated but is not required. |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
18 * o Altered source versions must be plainly marked as such, and must not |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
19 * be misrepresented as being the original software. |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
20 * o This notice may not be removed or altered from any source |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
21 * distribution. |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
22 */ |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
23 |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
24 module typeinfo2.ti_Areal; |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
25 |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
26 private import typeinfo1.ti_real; |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
27 |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
28 // real[] |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
29 |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
30 class TypeInfo_Ae : TypeInfo |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
31 { |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
32 char[] toString() { return "real[]"; } |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
33 |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
34 hash_t getHash(void *p) |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
35 { real[] s = *cast(real[]*)p; |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
36 size_t len = s.length; |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
37 auto str = s.ptr; |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
38 hash_t hash = 0; |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
39 |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
40 while (len) |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
41 { |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
42 hash *= 9; |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
43 hash += (cast(uint *)str)[0]; |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
44 hash += (cast(uint *)str)[1]; |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
45 hash += (cast(ushort *)str)[4]; |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
46 str++; |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
47 len--; |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
48 } |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
49 |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
50 return hash; |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
51 } |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
52 |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
53 int equals(void *p1, void *p2) |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
54 { |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
55 real[] s1 = *cast(real[]*)p1; |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
56 real[] s2 = *cast(real[]*)p2; |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
57 size_t len = s1.length; |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
58 |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
59 if (len != s2.length) |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
60 return 0; |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
61 for (size_t u = 0; u < len; u++) |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
62 { |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
63 int c = TypeInfo_e._equals(s1[u], s2[u]); |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
64 if (c == 0) |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
65 return 0; |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
66 } |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
67 return 1; |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
68 } |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
69 |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
70 int compare(void *p1, void *p2) |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
71 { |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
72 real[] s1 = *cast(real[]*)p1; |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
73 real[] s2 = *cast(real[]*)p2; |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
74 size_t len = s1.length; |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
75 |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
76 if (s2.length < len) |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
77 len = s2.length; |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
78 for (size_t u = 0; u < len; u++) |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
79 { |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
80 int c = TypeInfo_e._compare(s1[u], s2[u]); |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
81 if (c) |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
82 return c; |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
83 } |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
84 return cast(int)s1.length - cast(int)s2.length; |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
85 } |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
86 |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
87 size_t tsize() |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
88 { |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
89 return (real[]).sizeof; |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
90 } |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
91 |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
92 uint flags() |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
93 { |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
94 return 1; |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
95 } |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
96 |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
97 TypeInfo next() |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
98 { |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
99 return typeid(real); |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
100 } |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
101 } |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
102 |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
103 // ireal[] |
62
b86e00b938a5
[svn r66] Added support for imaginary floating point types
lindquist
parents:
61
diff
changeset
|
104 |
61
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
105 class TypeInfo_Aj : TypeInfo_Ae |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
106 { |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
107 char[] toString() { return "ireal[]"; } |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
108 |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
109 TypeInfo next() |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
110 { |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
111 return typeid(ireal); |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
112 } |
0258a7171a42
[svn r65] Added typeinfo implementations for float[], double[] and real[]
lindquist
parents:
diff
changeset
|
113 } |