4666e1776bfbb4cad2bc307dd130469f2542e6b1
[ginac.git] / ginac / function.h
1 /** @file function.h
2  *
3  *  Interface to abstract class function (new function concept).
4  *
5  *  This file was generated automatically by function.pl.
6  *  Please do not modify it directly, edit the perl script instead!
7  *  function.pl options: $maxargs=10 */
8
9 /*
10  *  GiNaC Copyright (C) 1999 Johannes Gutenberg University Mainz, Germany
11  *
12  *  This program is free software; you can redistribute it and/or modify
13  *  it under the terms of the GNU General Public License as published by
14  *  the Free Software Foundation; either version 2 of the License, or
15  *  (at your option) any later version.
16  *
17  *  This program is distributed in the hope that it will be useful,
18  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
19  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20  *  GNU General Public License for more details.
21  *
22  *  You should have received a copy of the GNU General Public License
23  *  along with this program; if not, write to the Free Software
24  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
25  */
26
27 #ifndef __GINAC_FUNCTION_H__
28 #define __GINAC_FUNCTION_H__
29
30 #include <string>
31 #include <vector>
32 #include <ginac/exprseq.h>
33
34 class function;
35
36 // the following lines have been generated for max. 10 parameters
37 #define DECLARE_FUNCTION_1P(NAME) \
38 extern unsigned function_index_##NAME; \
39 inline function NAME(ex const & p1) { \
40     return function(function_index_##NAME, p1); \
41 }
42
43 #define DECLARE_FUNCTION_2P(NAME) \
44 extern unsigned function_index_##NAME; \
45 inline function NAME(ex const & p1, ex const & p2) { \
46     return function(function_index_##NAME, p1, p2); \
47 }
48
49 #define DECLARE_FUNCTION_3P(NAME) \
50 extern unsigned function_index_##NAME; \
51 inline function NAME(ex const & p1, ex const & p2, ex const & p3) { \
52     return function(function_index_##NAME, p1, p2, p3); \
53 }
54
55 #define DECLARE_FUNCTION_4P(NAME) \
56 extern unsigned function_index_##NAME; \
57 inline function NAME(ex const & p1, ex const & p2, ex const & p3, ex const & p4) { \
58     return function(function_index_##NAME, p1, p2, p3, p4); \
59 }
60
61 #define DECLARE_FUNCTION_5P(NAME) \
62 extern unsigned function_index_##NAME; \
63 inline function NAME(ex const & p1, ex const & p2, ex const & p3, ex const & p4, ex const & p5) { \
64     return function(function_index_##NAME, p1, p2, p3, p4, p5); \
65 }
66
67 #define DECLARE_FUNCTION_6P(NAME) \
68 extern unsigned function_index_##NAME; \
69 inline function NAME(ex const & p1, ex const & p2, ex const & p3, ex const & p4, ex const & p5, ex const & p6) { \
70     return function(function_index_##NAME, p1, p2, p3, p4, p5, p6); \
71 }
72
73 #define DECLARE_FUNCTION_7P(NAME) \
74 extern unsigned function_index_##NAME; \
75 inline function NAME(ex const & p1, ex const & p2, ex const & p3, ex const & p4, ex const & p5, ex const & p6, ex const & p7) { \
76     return function(function_index_##NAME, p1, p2, p3, p4, p5, p6, p7); \
77 }
78
79 #define DECLARE_FUNCTION_8P(NAME) \
80 extern unsigned function_index_##NAME; \
81 inline function NAME(ex const & p1, ex const & p2, ex const & p3, ex const & p4, ex const & p5, ex const & p6, ex const & p7, ex const & p8) { \
82     return function(function_index_##NAME, p1, p2, p3, p4, p5, p6, p7, p8); \
83 }
84
85 #define DECLARE_FUNCTION_9P(NAME) \
86 extern unsigned function_index_##NAME; \
87 inline function NAME(ex const & p1, ex const & p2, ex const & p3, ex const & p4, ex const & p5, ex const & p6, ex const & p7, ex const & p8, ex const & p9) { \
88     return function(function_index_##NAME, p1, p2, p3, p4, p5, p6, p7, p8, p9); \
89 }
90
91 #define DECLARE_FUNCTION_10P(NAME) \
92 extern unsigned function_index_##NAME; \
93 inline function NAME(ex const & p1, ex const & p2, ex const & p3, ex const & p4, ex const & p5, ex const & p6, ex const & p7, ex const & p8, ex const & p9, ex const & p10) { \
94     return function(function_index_##NAME, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10); \
95 }
96
97
98 // end of generated lines
99
100 #define REGISTER_FUNCTION(NAME,E,EF,D,S) \
101 unsigned function_index_##NAME=function::register_new(#NAME,E,EF,D,S);
102
103 #define BEGIN_TYPECHECK \
104 bool automatic_typecheck=true;
105
106 #define TYPECHECK(VAR,TYPE) \
107 if (!is_ex_exactly_of_type(VAR,TYPE)) { \
108     automatic_typecheck=false; \
109 } else
110
111 #define TYPECHECK_INTEGER(VAR) \
112 if (!(VAR).info(info_flags::integer)) { \
113     automatic_typecheck=false; \
114 } else
115
116 #define END_TYPECHECK(RV) \
117 {} \
118 if (!automatic_typecheck) { \
119     return RV.hold(); \
120 }
121
122 typedef ex (* eval_funcp)();
123 typedef ex (* evalf_funcp)();
124 typedef ex (* diff_funcp)();
125 typedef ex (* series_funcp)();
126
127 // the following lines have been generated for max. 10 parameters
128 typedef ex (* eval_funcp_1)(ex const &);
129 typedef ex (* eval_funcp_2)(ex const &, ex const &);
130 typedef ex (* eval_funcp_3)(ex const &, ex const &, ex const &);
131 typedef ex (* eval_funcp_4)(ex const &, ex const &, ex const &, ex const &);
132 typedef ex (* eval_funcp_5)(ex const &, ex const &, ex const &, ex const &, ex const &);
133 typedef ex (* eval_funcp_6)(ex const &, ex const &, ex const &, ex const &, ex const &, ex const &);
134 typedef ex (* eval_funcp_7)(ex const &, ex const &, ex const &, ex const &, ex const &, ex const &, ex const &);
135 typedef ex (* eval_funcp_8)(ex const &, ex const &, ex const &, ex const &, ex const &, ex const &, ex const &, ex const &);
136 typedef ex (* eval_funcp_9)(ex const &, ex const &, ex const &, ex const &, ex const &, ex const &, ex const &, ex const &, ex const &);
137 typedef ex (* eval_funcp_10)(ex const &, ex const &, ex const &, ex const &, ex const &, ex const &, ex const &, ex const &, ex const &, ex const &);
138
139 typedef ex (* evalf_funcp_1)(ex const &);
140 typedef ex (* evalf_funcp_2)(ex const &, ex const &);
141 typedef ex (* evalf_funcp_3)(ex const &, ex const &, ex const &);
142 typedef ex (* evalf_funcp_4)(ex const &, ex const &, ex const &, ex const &);
143 typedef ex (* evalf_funcp_5)(ex const &, ex const &, ex const &, ex const &, ex const &);
144 typedef ex (* evalf_funcp_6)(ex const &, ex const &, ex const &, ex const &, ex const &, ex const &);
145 typedef ex (* evalf_funcp_7)(ex const &, ex const &, ex const &, ex const &, ex const &, ex const &, ex const &);
146 typedef ex (* evalf_funcp_8)(ex const &, ex const &, ex const &, ex const &, ex const &, ex const &, ex const &, ex const &);
147 typedef ex (* evalf_funcp_9)(ex const &, ex const &, ex const &, ex const &, ex const &, ex const &, ex const &, ex const &, ex const &);
148 typedef ex (* evalf_funcp_10)(ex const &, ex const &, ex const &, ex const &, ex const &, ex const &, ex const &, ex const &, ex const &, ex const &);
149
150 typedef ex (* diff_funcp_1)(ex const &, unsigned);
151 typedef ex (* diff_funcp_2)(ex const &, ex const &, unsigned);
152 typedef ex (* diff_funcp_3)(ex const &, ex const &, ex const &, unsigned);
153 typedef ex (* diff_funcp_4)(ex const &, ex const &, ex const &, ex const &, unsigned);
154 typedef ex (* diff_funcp_5)(ex const &, ex const &, ex const &, ex const &, ex const &, unsigned);
155 typedef ex (* diff_funcp_6)(ex const &, ex const &, ex const &, ex const &, ex const &, ex const &, unsigned);
156 typedef ex (* diff_funcp_7)(ex const &, ex const &, ex const &, ex const &, ex const &, ex const &, ex const &, unsigned);
157 typedef ex (* diff_funcp_8)(ex const &, ex const &, ex const &, ex const &, ex const &, ex const &, ex const &, ex const &, unsigned);
158 typedef ex (* diff_funcp_9)(ex const &, ex const &, ex const &, ex const &, ex const &, ex const &, ex const &, ex const &, ex const &, unsigned);
159 typedef ex (* diff_funcp_10)(ex const &, ex const &, ex const &, ex const &, ex const &, ex const &, ex const &, ex const &, ex const &, ex const &, unsigned);
160
161 typedef ex (* series_funcp_1)(ex const &, symbol const &, ex const &, int);
162 typedef ex (* series_funcp_2)(ex const &, ex const &, symbol const &, ex const &, int);
163 typedef ex (* series_funcp_3)(ex const &, ex const &, ex const &, symbol const &, ex const &, int);
164 typedef ex (* series_funcp_4)(ex const &, ex const &, ex const &, ex const &, symbol const &, ex const &, int);
165 typedef ex (* series_funcp_5)(ex const &, ex const &, ex const &, ex const &, ex const &, symbol const &, ex const &, int);
166 typedef ex (* series_funcp_6)(ex const &, ex const &, ex const &, ex const &, ex const &, ex const &, symbol const &, ex const &, int);
167 typedef ex (* series_funcp_7)(ex const &, ex const &, ex const &, ex const &, ex const &, ex const &, ex const &, symbol const &, ex const &, int);
168 typedef ex (* series_funcp_8)(ex const &, ex const &, ex const &, ex const &, ex const &, ex const &, ex const &, ex const &, symbol const &, ex const &, int);
169 typedef ex (* series_funcp_9)(ex const &, ex const &, ex const &, ex const &, ex const &, ex const &, ex const &, ex const &, ex const &, symbol const &, ex const &, int);
170 typedef ex (* series_funcp_10)(ex const &, ex const &, ex const &, ex const &, ex const &, ex const &, ex const &, ex const &, ex const &, ex const &, symbol const &, ex const &, int);
171
172 // end of generated lines
173
174 struct registered_function_info {
175     char const * name;
176     unsigned nparams;
177     unsigned options;
178     eval_funcp e;
179     evalf_funcp ef;
180     diff_funcp d;
181     series_funcp s;
182 };
183
184 /** The class function is used to implement builtin functions like sin, cos...
185     and user defined functions */
186 class function : public exprseq
187 {
188     friend void ginsh_get_ginac_functions(void);
189
190 // member functions
191
192     // default constructor, destructor, copy constructor assignment operator and helpers
193 public:
194     function();
195     ~function();
196     function(function const & other);
197     function const & operator=(function const & other);
198 protected:
199     void copy(function const & other);
200     void destroy(bool call_parent);
201
202     // other constructors
203 public:
204     function(unsigned ser);
205     // the following lines have been generated for max. 10 parameters
206     function(unsigned ser, ex const & param1);
207     function(unsigned ser, ex const & param1, ex const & param2);
208     function(unsigned ser, ex const & param1, ex const & param2, ex const & param3);
209     function(unsigned ser, ex const & param1, ex const & param2, ex const & param3, ex const & param4);
210     function(unsigned ser, ex const & param1, ex const & param2, ex const & param3, ex const & param4, ex const & param5);
211     function(unsigned ser, ex const & param1, ex const & param2, ex const & param3, ex const & param4, ex const & param5, ex const & param6);
212     function(unsigned ser, ex const & param1, ex const & param2, ex const & param3, ex const & param4, ex const & param5, ex const & param6, ex const & param7);
213     function(unsigned ser, ex const & param1, ex const & param2, ex const & param3, ex const & param4, ex const & param5, ex const & param6, ex const & param7, ex const & param8);
214     function(unsigned ser, ex const & param1, ex const & param2, ex const & param3, ex const & param4, ex const & param5, ex const & param6, ex const & param7, ex const & param8, ex const & param9);
215     function(unsigned ser, ex const & param1, ex const & param2, ex const & param3, ex const & param4, ex const & param5, ex const & param6, ex const & param7, ex const & param8, ex const & param9, ex const & param10);
216
217     // end of generated lines
218     function(unsigned ser, exprseq const & es);
219     function(unsigned ser, exvector const & v, bool discardable=0);
220     function(unsigned ser, exvector * vp); // vp will be deleted
221
222     // functions overriding virtual functions from bases classes
223 public:
224     basic * duplicate() const;
225     void printraw(ostream & os) const; 
226     void print(ostream & os, unsigned upper_precedence=0) const;
227     void printtree(ostream & os, unsigned indent) const;
228     void printcsrc(ostream & os, unsigned type, unsigned upper_precedence=0) const;
229     ex expand(unsigned options=0) const;
230     ex eval(int level=0) const;
231     ex evalf(int level=0) const;
232     ex diff(symbol const & s) const;
233     ex series(symbol const & s, ex const & point, int order) const;
234     ex thisexprseq(exvector const & v) const;
235     ex thisexprseq(exvector * vp) const;
236 protected:
237     int compare_same_type(basic const & other) const;
238     bool is_equal_same_type(basic const & other) const;
239     unsigned return_type(void) const;
240     unsigned return_type_tinfo(void) const;
241     
242     // new virtual functions which can be overridden by derived classes
243     // none
244     
245     // non-virtual functions in this class
246 protected:
247     ex pdiff(unsigned diff_param) const; // partial differentiation
248     static vector<registered_function_info> & registered_functions(void);
249 public:
250     // the following lines have been generated for max. 10 parameters
251     static unsigned register_new(char const * nm, eval_funcp_1 e,
252                                  evalf_funcp_1 ef=0, diff_funcp_1 d=0, series_funcp_1 s=0);
253     static unsigned register_new(char const * nm, eval_funcp_2 e,
254                                  evalf_funcp_2 ef=0, diff_funcp_2 d=0, series_funcp_2 s=0);
255     static unsigned register_new(char const * nm, eval_funcp_3 e,
256                                  evalf_funcp_3 ef=0, diff_funcp_3 d=0, series_funcp_3 s=0);
257     static unsigned register_new(char const * nm, eval_funcp_4 e,
258                                  evalf_funcp_4 ef=0, diff_funcp_4 d=0, series_funcp_4 s=0);
259     static unsigned register_new(char const * nm, eval_funcp_5 e,
260                                  evalf_funcp_5 ef=0, diff_funcp_5 d=0, series_funcp_5 s=0);
261     static unsigned register_new(char const * nm, eval_funcp_6 e,
262                                  evalf_funcp_6 ef=0, diff_funcp_6 d=0, series_funcp_6 s=0);
263     static unsigned register_new(char const * nm, eval_funcp_7 e,
264                                  evalf_funcp_7 ef=0, diff_funcp_7 d=0, series_funcp_7 s=0);
265     static unsigned register_new(char const * nm, eval_funcp_8 e,
266                                  evalf_funcp_8 ef=0, diff_funcp_8 d=0, series_funcp_8 s=0);
267     static unsigned register_new(char const * nm, eval_funcp_9 e,
268                                  evalf_funcp_9 ef=0, diff_funcp_9 d=0, series_funcp_9 s=0);
269     static unsigned register_new(char const * nm, eval_funcp_10 e,
270                                  evalf_funcp_10 ef=0, diff_funcp_10 d=0, series_funcp_10 s=0);
271
272     // end of generated lines
273     unsigned getserial(void) const {return serial;}
274     
275 // member variables
276
277 protected:
278     unsigned serial;
279 };
280
281 // utility macros
282
283 #define is_ex_the_function(OBJ, FUNCNAME) \
284     (is_ex_exactly_of_type(OBJ, function) && static_cast<function *>(OBJ.bp)->getserial() == function_index_##FUNCNAME)
285
286 // global constants
287
288 extern const function some_function;
289 extern type_info const & typeid_function;
290
291 #endif // ndef __GINAC_FUNCTION_H__