3 * Interface to abstract class function (new function concept).
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 */
10 * GiNaC Copyright (C) 1999 Johannes Gutenberg University Mainz, Germany
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.
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.
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
27 #ifndef __GINAC_FUNCTION_H__
28 #define __GINAC_FUNCTION_H__
32 #include <ginac/exprseq.h>
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); \
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); \
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); \
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); \
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); \
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); \
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); \
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); \
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); \
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); \
98 // end of generated lines
100 #define REGISTER_FUNCTION(NAME,E,EF,D,S) \
101 unsigned function_index_##NAME=function::register_new(#NAME,E,EF,D,S);
103 #define BEGIN_TYPECHECK \
104 bool automatic_typecheck=true;
106 #define TYPECHECK(VAR,TYPE) \
107 if (!is_ex_exactly_of_type(VAR,TYPE)) { \
108 automatic_typecheck=false; \
111 #define TYPECHECK_INTEGER(VAR) \
112 if (!(VAR).info(info_flags::integer)) { \
113 automatic_typecheck=false; \
116 #define END_TYPECHECK(RV) \
118 if (!automatic_typecheck) { \
122 typedef ex (* eval_funcp)();
123 typedef ex (* evalf_funcp)();
124 typedef ex (* diff_funcp)();
125 typedef ex (* series_funcp)();
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 &);
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 &);
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);
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);
172 // end of generated lines
174 struct registered_function_info {
184 /** The class function is used to implement builtin functions like sin, cos...
185 and user defined functions */
186 class function : public exprseq
188 friend void ginsh_get_ginac_functions(void);
192 // default constructor, destructor, copy constructor assignment operator and helpers
196 function(function const & other);
197 function const & operator=(function const & other);
199 void copy(function const & other);
200 void destroy(bool call_parent);
202 // other constructors
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);
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
222 // functions overriding virtual functions from bases classes
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;
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;
242 // new virtual functions which can be overridden by derived classes
245 // non-virtual functions in this class
247 ex pdiff(unsigned diff_param) const; // partial differentiation
248 static vector<registered_function_info> & registered_functions(void);
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);
272 // end of generated lines
273 unsigned getserial(void) const {return serial;}
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)
288 extern const function some_function;
289 extern type_info const & typeid_function;
291 #endif // ndef __GINAC_FUNCTION_H__