Documentation of CSL
libcomplexop_hdata.h
Go to the documentation of this file.
1 // This file is part of MARTY.
2 //
3 // MARTY is free software: you can redistribute it and/or modify
4 // it under the terms of the GNU General Public License as published by
5 // the Free Software Foundation, either version 3 of the License, or
6 // (at your option) any later version.
7 //
8 // MARTY is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 // GNU General Public License for more details.
12 //
13 // You should have received a copy of the GNU General Public License
14 // along with MARTY. If not, see <https://www.gnu.org/licenses/>.
15 
23 #pragma once
24 
25 #include <iostream>
26 
27 namespace csl {
28 
29 void print_libcomplexop_hdata(std::ostream &out) {
30  out << "#ifndef LIBCOMPLEXOP_H_INCLUDED\n";
31  out << "#define LIBCOMPLEXOP_H_INCLUDED\n";
32  out << "\n";
33  out << "#include <complex>\n";
34  out << "#include <iostream>\n";
35  out << "\n";
36  out << "\n";
37  out << "#ifdef QUAD\n";
38  out << "\n";
39  out << "///////////////////////////////////////////////////\n";
40  out << "// quadruple - double / float operators\n";
41  out << "///////////////////////////////////////////////////\n";
42  out << "\n";
43  out << "#include <quadmath.h>\n";
44  out << "\n";
45  out << "inline std::complex<__float128> operator+(\n";
46  out << " std::complex<__float128> const&c, \n";
47  out << " double a\n";
48  out << " )\n";
49  out << "{\n";
50  out << " return c + std::complex<__float128>(a);\n";
51  out << "}\n";
52  out << "inline std::complex<__float128> operator+(\n";
53  out << " double a,\n";
54  out << " std::complex<__float128> const&c\n";
55  out << " )\n";
56  out << "{\n";
57  out << " return c + std::complex<__float128>(a);\n";
58  out << "}\n";
59  out << "\n";
60  out << "inline std::complex<__float128> operator*(\n";
61  out << " std::complex<__float128> const&c, \n";
62  out << " double a\n";
63  out << " )\n";
64  out << "{\n";
65  out << " return c * std::complex<__float128>(a);\n";
66  out << "}\n";
67  out << "inline std::complex<__float128> operator*(\n";
68  out << " double a,\n";
69  out << " std::complex<__float128> const&c\n";
70  out << " )\n";
71  out << "{\n";
72  out << " return c * std::complex<__float128>(a);\n";
73  out << "}\n";
74  out << "\n";
75  out << "inline std::complex<__float128> operator-(\n";
76  out << " std::complex<__float128> const&c, \n";
77  out << " double a\n";
78  out << " )\n";
79  out << "{\n";
80  out << " return c - std::complex<__float128>(a);\n";
81  out << "}\n";
82  out << "inline std::complex<__float128> operator-(\n";
83  out << " double a,\n";
84  out << " std::complex<__float128> const&c\n";
85  out << " )\n";
86  out << "{\n";
87  out << " return std::complex<__float128>(a) - c;\n";
88  out << "}\n";
89  out << "\n";
90  out << "inline std::complex<__float128> operator/(\n";
91  out << " std::complex<__float128> const&c, \n";
92  out << " double a\n";
93  out << " )\n";
94  out << "{\n";
95  out << " return c / std::complex<__float128>(a);\n";
96  out << "}\n";
97  out << "inline std::complex<__float128> operator/(\n";
98  out << " double a,\n";
99  out << " std::complex<__float128> const&c\n";
100  out << " )\n";
101  out << "{\n";
102  out << " return std::complex<__float128>(a) / c;\n";
103  out << "}\n";
104  out << "\n";
105  out << "// Complex - complex operators\n";
106  out << "\n";
107  out << "inline std::complex<__float128> operator+(\n";
108  out << " std::complex<__float128> const&c, \n";
109  out << " std::complex<double> const&a\n";
110  out << " )\n";
111  out << "{\n";
112  out << " return c + std::complex<__float128>(a);\n";
113  out << "}\n";
114  out << "inline std::complex<__float128> operator+(\n";
115  out << " std::complex<double> const&a,\n";
116  out << " std::complex<__float128> const&c\n";
117  out << " )\n";
118  out << "{\n";
119  out << " return c + std::complex<__float128>(a);\n";
120  out << "}\n";
121  out << "\n";
122  out << "inline std::complex<__float128> operator*(\n";
123  out << " std::complex<__float128> const&c, \n";
124  out << " std::complex<double> const&a\n";
125  out << " )\n";
126  out << "{\n";
127  out << " return c * std::complex<__float128>(a);\n";
128  out << "}\n";
129  out << "inline std::complex<__float128> operator*(\n";
130  out << " std::complex<double> const&a,\n";
131  out << " std::complex<__float128> const&c\n";
132  out << " )\n";
133  out << "{\n";
134  out << " return c * std::complex<__float128>(a);\n";
135  out << "}\n";
136  out << "\n";
137  out << "inline std::complex<__float128> operator-(\n";
138  out << " std::complex<__float128> const&c, \n";
139  out << " std::complex<double> const&a\n";
140  out << " )\n";
141  out << "{\n";
142  out << " return c - std::complex<__float128>(a);\n";
143  out << "}\n";
144  out << "inline std::complex<__float128> operator-(\n";
145  out << " std::complex<double> const&a,\n";
146  out << " std::complex<__float128> const&c\n";
147  out << " )\n";
148  out << "{\n";
149  out << " return std::complex<__float128>(a) - c;\n";
150  out << "}\n";
151  out << "\n";
152  out << "inline std::complex<__float128> operator/(\n";
153  out << " std::complex<__float128> const&c, \n";
154  out << " std::complex<double> const&a\n";
155  out << " )\n";
156  out << "{\n";
157  out << " return c / std::complex<__float128>(a);\n";
158  out << "}\n";
159  out << "inline std::complex<__float128> operator/(\n";
160  out << " std::complex<double> const&a,\n";
161  out << " std::complex<__float128> const&c\n";
162  out << " )\n";
163  out << "{\n";
164  out << " return std::complex<__float128>(a) / c;\n";
165  out << "}\n";
166  out << "\n";
167  out << "///////////////////////////////////////////////////\n";
168  out << "// quadruple / int operators\n";
169  out << "///////////////////////////////////////////////////\n";
170  out << "\n";
171  out << "inline std::complex<__float128> operator+(\n";
172  out << " std::complex<__float128> const&c, \n";
173  out << " int a\n";
174  out << " )\n";
175  out << "{\n";
176  out << " return c + std::complex<__float128>(a);\n";
177  out << "}\n";
178  out << "inline std::complex<__float128> operator+(\n";
179  out << " int a,\n";
180  out << " std::complex<__float128> const&c\n";
181  out << " )\n";
182  out << "{\n";
183  out << " return c + std::complex<__float128>(a);\n";
184  out << "}\n";
185  out << "\n";
186  out << "inline std::complex<__float128> operator*(\n";
187  out << " std::complex<__float128> const&c, \n";
188  out << " int a\n";
189  out << " )\n";
190  out << "{\n";
191  out << " return c * std::complex<__float128>(a);\n";
192  out << "}\n";
193  out << "inline std::complex<__float128> operator*(\n";
194  out << " int a,\n";
195  out << " std::complex<__float128> const&c\n";
196  out << " )\n";
197  out << "{\n";
198  out << " return c * std::complex<__float128>(a);\n";
199  out << "}\n";
200  out << "\n";
201  out << "inline std::complex<__float128> operator-(\n";
202  out << " std::complex<__float128> const&c, \n";
203  out << " int a\n";
204  out << " )\n";
205  out << "{\n";
206  out << " return c - std::complex<__float128>(a);\n";
207  out << "}\n";
208  out << "inline std::complex<__float128> operator-(\n";
209  out << " int a,\n";
210  out << " std::complex<__float128> const&c\n";
211  out << " )\n";
212  out << "{\n";
213  out << " return std::complex<__float128>(a) - c;\n";
214  out << "}\n";
215  out << "\n";
216  out << "inline std::complex<__float128> operator/(\n";
217  out << " std::complex<__float128> const&c, \n";
218  out << " int a\n";
219  out << " )\n";
220  out << "{\n";
221  out << " return c / std::complex<__float128>(a);\n";
222  out << "}\n";
223  out << "inline std::complex<__float128> operator/(\n";
224  out << " int a,\n";
225  out << " std::complex<__float128> const&c\n";
226  out << " )\n";
227  out << "{\n";
228  out << " return std::complex<__float128>(a) / c;\n";
229  out << "}\n";
230  out << "\n";
231  out << "// Complex - complex operators\n";
232  out << "\n";
233  out << "inline std::complex<__float128> operator+(\n";
234  out << " std::complex<__float128> const&c, \n";
235  out << " std::complex<int> const&a\n";
236  out << " )\n";
237  out << "{\n";
238  out << " return c + std::complex<__float128>(a);\n";
239  out << "}\n";
240  out << "inline std::complex<__float128> operator+(\n";
241  out << " std::complex<int> const&a,\n";
242  out << " std::complex<__float128> const&c\n";
243  out << " )\n";
244  out << "{\n";
245  out << " return c + std::complex<__float128>(a);\n";
246  out << "}\n";
247  out << "\n";
248  out << "inline std::complex<__float128> operator*(\n";
249  out << " std::complex<__float128> const&c, \n";
250  out << " std::complex<int> const&a\n";
251  out << " )\n";
252  out << "{\n";
253  out << " return c * std::complex<__float128>(a);\n";
254  out << "}\n";
255  out << "inline std::complex<__float128> operator*(\n";
256  out << " std::complex<int> const&a,\n";
257  out << " std::complex<__float128> const&c\n";
258  out << " )\n";
259  out << "{\n";
260  out << " return c * std::complex<__float128>(a);\n";
261  out << "}\n";
262  out << "\n";
263  out << "inline std::complex<__float128> operator-(\n";
264  out << " std::complex<__float128> const&c, \n";
265  out << " std::complex<int> const&a\n";
266  out << " )\n";
267  out << "{\n";
268  out << " return c - std::complex<__float128>(a);\n";
269  out << "}\n";
270  out << "inline std::complex<__float128> operator-(\n";
271  out << " std::complex<int> const&a,\n";
272  out << " std::complex<__float128> const&c\n";
273  out << " )\n";
274  out << "{\n";
275  out << " return std::complex<__float128>(a) - c;\n";
276  out << "}\n";
277  out << "\n";
278  out << "inline std::complex<__float128> operator/(\n";
279  out << " std::complex<__float128> const&c, \n";
280  out << " std::complex<int> const&a\n";
281  out << " )\n";
282  out << "{\n";
283  out << " return c / std::complex<__float128>(a);\n";
284  out << "}\n";
285  out << "inline std::complex<__float128> operator/(\n";
286  out << " std::complex<int> const&a,\n";
287  out << " std::complex<__float128> const&c\n";
288  out << " )\n";
289  out << "{\n";
290  out << " return std::complex<__float128>(a) / c;\n";
291  out << "}\n";
292  out << "\n";
293  out << "inline std::ostream &operator<<(\n";
294  out << " std::ostream &out,\n";
295  out << " __float128 x\n";
296  out << " )\n";
297  out << "{\n";
298  out << " out << (double)x;\n";
299  out << " return out;\n";
300  out << "}\n";
301  out << "\n";
302  out << "inline std::ostream &operator<<(\n";
303  out << " std::ostream &out,\n";
304  out << " __complex128 z\n";
305  out << " )\n";
306  out << "{\n";
307  out << " out << \"(\" << crealq(z) << \" + i*\" << cimagq(z) << \")\";\n";
308  out << " return out;\n";
309  out << "}\n";
310  out << "\n";
311  out << "#endif\n";
312  out << "\n";
313  out << "///////////////////////////////////////////////////\n";
314  out << "// double / int operators\n";
315  out << "///////////////////////////////////////////////////\n";
316  out << "\n";
317  out << "inline std::complex<double> operator+(\n";
318  out << " std::complex<double> const&c, \n";
319  out << " int a\n";
320  out << " )\n";
321  out << "{\n";
322  out << " return c + std::complex<double>(a);\n";
323  out << "}\n";
324  out << "inline std::complex<double> operator+(\n";
325  out << " int a,\n";
326  out << " std::complex<double> const&c\n";
327  out << " )\n";
328  out << "{\n";
329  out << " return c + std::complex<double>(a);\n";
330  out << "}\n";
331  out << "\n";
332  out << "inline std::complex<double> operator*(\n";
333  out << " std::complex<double> const&c, \n";
334  out << " int a\n";
335  out << " )\n";
336  out << "{\n";
337  out << " return c * std::complex<double>(a);\n";
338  out << "}\n";
339  out << "inline std::complex<double> operator*(\n";
340  out << " int a,\n";
341  out << " std::complex<double> const&c\n";
342  out << " )\n";
343  out << "{\n";
344  out << " return c * std::complex<double>(a);\n";
345  out << "}\n";
346  out << "\n";
347  out << "inline std::complex<double> operator-(\n";
348  out << " std::complex<double> const&c, \n";
349  out << " int a\n";
350  out << " )\n";
351  out << "{\n";
352  out << " return c - std::complex<double>(a);\n";
353  out << "}\n";
354  out << "inline std::complex<double> operator-(\n";
355  out << " int a,\n";
356  out << " std::complex<double> const&c\n";
357  out << " )\n";
358  out << "{\n";
359  out << " return std::complex<double>(a) - c;\n";
360  out << "}\n";
361  out << "\n";
362  out << "inline std::complex<double> operator/(\n";
363  out << " std::complex<double> const&c, \n";
364  out << " int a\n";
365  out << " )\n";
366  out << "{\n";
367  out << " return c / std::complex<double>(a);\n";
368  out << "}\n";
369  out << "inline std::complex<double> operator/(\n";
370  out << " int a,\n";
371  out << " std::complex<double> const&c\n";
372  out << " )\n";
373  out << "{\n";
374  out << " return std::complex<double>(a) / c;\n";
375  out << "}\n";
376  out << "\n";
377  out << "// Complex - complex operators\n";
378  out << "\n";
379  out << "inline std::complex<double> operator+(\n";
380  out << " std::complex<double> const&c, \n";
381  out << " std::complex<int> const&a\n";
382  out << " )\n";
383  out << "{\n";
384  out << " return c + std::complex<double>(a.real(), a.imag());\n";
385  out << "}\n";
386  out << "inline std::complex<double> operator+(\n";
387  out << " std::complex<int> const&a,\n";
388  out << " std::complex<double> const&c\n";
389  out << " )\n";
390  out << "{\n";
391  out << " return c + std::complex<double>(a.real(), a.imag());\n";
392  out << "}\n";
393  out << "\n";
394  out << "inline std::complex<double> operator*(\n";
395  out << " std::complex<double> const&c, \n";
396  out << " std::complex<int> const&a\n";
397  out << " )\n";
398  out << "{\n";
399  out << " return c * std::complex<double>(a.real(), a.imag());\n";
400  out << "}\n";
401  out << "inline std::complex<double> operator*(\n";
402  out << " std::complex<int> const&a,\n";
403  out << " std::complex<double> const&c\n";
404  out << " )\n";
405  out << "{\n";
406  out << " return c * std::complex<double>(a.real(), a.imag());\n";
407  out << "}\n";
408  out << "\n";
409  out << "inline std::complex<double> operator-(\n";
410  out << " std::complex<double> const&c, \n";
411  out << " std::complex<int> const&a\n";
412  out << " )\n";
413  out << "{\n";
414  out << " return c - std::complex<double>(a.real(), a.imag());\n";
415  out << "}\n";
416  out << "inline std::complex<double> operator-(\n";
417  out << " std::complex<int> const&a,\n";
418  out << " std::complex<double> const&c\n";
419  out << " )\n";
420  out << "{\n";
421  out << " return std::complex<double>(a.real(), a.imag()) - c;\n";
422  out << "}\n";
423  out << "\n";
424  out << "inline std::complex<double> operator/(\n";
425  out << " std::complex<double> const&c, \n";
426  out << " std::complex<int> const&a\n";
427  out << " )\n";
428  out << "{\n";
429  out << " return c / std::complex<double>(a.real(), a.imag());\n";
430  out << "}\n";
431  out << "inline std::complex<double> operator/(\n";
432  out << " std::complex<int> const&a,\n";
433  out << " std::complex<double> const&c\n";
434  out << " )\n";
435  out << "{\n";
436  out << " return std::complex<double>(a.real(), a.imag()) / c;\n";
437  out << "}\n";
438  out << "\n";
439  out << "#endif\n";
440 }
441 
442 } // End of namespace csl
Namespace for csl library.
Definition: abreviation.h:34