3 * Implementation of class function.
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 */
15 // default constructor, destructor, copy constructor assignment operator and helpers
20 function::function() : serial(0)
22 debugmsg("function default constructor",LOGLEVEL_CONSTRUCT);
23 tinfo_key = TINFO_FUNCTION;
28 debugmsg("function destructor",LOGLEVEL_DESTRUCT);
32 function::function(function const & other)
34 debugmsg("function copy constructor",LOGLEVEL_CONSTRUCT);
38 function const & function::operator=(function const & other)
40 debugmsg("function operator=",LOGLEVEL_ASSIGNMENT);
50 void function::copy(function const & other)
56 void function::destroy(bool call_parent)
58 if (call_parent) exprseq::destroy(call_parent);
67 function::function(unsigned ser) : serial(ser)
69 debugmsg("function constructor from unsigned",LOGLEVEL_CONSTRUCT);
70 tinfo_key = TINFO_FUNCTION;
73 // the following lines have been generated for max. 10 parameters
74 function::function(unsigned ser, ex const & param1)
75 : exprseq(param1), serial(ser)
77 debugmsg("function constructor from unsigned,1*ex",LOGLEVEL_CONSTRUCT);
78 tinfo_key = TINFO_FUNCTION;
80 function::function(unsigned ser, ex const & param1, ex const & param2)
81 : exprseq(param1, param2), serial(ser)
83 debugmsg("function constructor from unsigned,2*ex",LOGLEVEL_CONSTRUCT);
84 tinfo_key = TINFO_FUNCTION;
86 function::function(unsigned ser, ex const & param1, ex const & param2, ex const & param3)
87 : exprseq(param1, param2, param3), serial(ser)
89 debugmsg("function constructor from unsigned,3*ex",LOGLEVEL_CONSTRUCT);
90 tinfo_key = TINFO_FUNCTION;
92 function::function(unsigned ser, ex const & param1, ex const & param2, ex const & param3, ex const & param4)
93 : exprseq(param1, param2, param3, param4), serial(ser)
95 debugmsg("function constructor from unsigned,4*ex",LOGLEVEL_CONSTRUCT);
96 tinfo_key = TINFO_FUNCTION;
98 function::function(unsigned ser, ex const & param1, ex const & param2, ex const & param3, ex const & param4, ex const & param5)
99 : exprseq(param1, param2, param3, param4, param5), serial(ser)
101 debugmsg("function constructor from unsigned,5*ex",LOGLEVEL_CONSTRUCT);
102 tinfo_key = TINFO_FUNCTION;
104 function::function(unsigned ser, ex const & param1, ex const & param2, ex const & param3, ex const & param4, ex const & param5, ex const & param6)
105 : exprseq(param1, param2, param3, param4, param5, param6), serial(ser)
107 debugmsg("function constructor from unsigned,6*ex",LOGLEVEL_CONSTRUCT);
108 tinfo_key = TINFO_FUNCTION;
110 function::function(unsigned ser, ex const & param1, ex const & param2, ex const & param3, ex const & param4, ex const & param5, ex const & param6, ex const & param7)
111 : exprseq(param1, param2, param3, param4, param5, param6, param7), serial(ser)
113 debugmsg("function constructor from unsigned,7*ex",LOGLEVEL_CONSTRUCT);
114 tinfo_key = TINFO_FUNCTION;
116 function::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)
117 : exprseq(param1, param2, param3, param4, param5, param6, param7, param8), serial(ser)
119 debugmsg("function constructor from unsigned,8*ex",LOGLEVEL_CONSTRUCT);
120 tinfo_key = TINFO_FUNCTION;
122 function::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)
123 : exprseq(param1, param2, param3, param4, param5, param6, param7, param8, param9), serial(ser)
125 debugmsg("function constructor from unsigned,9*ex",LOGLEVEL_CONSTRUCT);
126 tinfo_key = TINFO_FUNCTION;
128 function::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)
129 : exprseq(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10), serial(ser)
131 debugmsg("function constructor from unsigned,10*ex",LOGLEVEL_CONSTRUCT);
132 tinfo_key = TINFO_FUNCTION;
135 // end of generated lines
137 function::function(unsigned ser, exprseq const & es) : exprseq(es), serial(ser)
139 debugmsg("function constructor from unsigned,exprseq",LOGLEVEL_CONSTRUCT);
140 tinfo_key = TINFO_FUNCTION;
143 function::function(unsigned ser, exvector const & v, bool discardable)
144 : exprseq(v,discardable), serial(ser)
146 debugmsg("function constructor from string,exvector,bool",LOGLEVEL_CONSTRUCT);
147 tinfo_key = TINFO_FUNCTION;
150 function::function(unsigned ser, exvector * vp)
151 : exprseq(vp), serial(ser)
153 debugmsg("function constructor from unsigned,exvector *",LOGLEVEL_CONSTRUCT);
154 tinfo_key = TINFO_FUNCTION;
158 // functions overriding virtual functions from bases classes
163 basic * function::duplicate() const
165 debugmsg("function duplicate",LOGLEVEL_DUPLICATE);
166 return new function(*this);
169 void function::printraw(ostream & os) const
171 debugmsg("function printraw",LOGLEVEL_PRINT);
173 ASSERT(serial<registered_functions().size());
175 os << "function(name=" << registered_functions()[serial].name;
176 for (exvector::const_iterator it=seq.begin(); it!=seq.end(); ++it) {
183 void function::print(ostream & os, unsigned upper_precedence) const
185 debugmsg("function print",LOGLEVEL_PRINT);
187 ASSERT(serial<registered_functions().size());
189 os << registered_functions()[serial].name;
190 printseq(os,'(',',',')',exprseq::precedence,function::precedence);
193 void function::printtree(ostream & os, unsigned indent) const
195 debugmsg("function printtree",LOGLEVEL_PRINT);
197 ASSERT(serial<registered_functions().size());
199 os << string(indent,' ') << "function "
200 << registered_functions()[serial].name
201 << ", hash=" << hashvalue << " (0x" << hex << hashvalue << dec << ")"
202 << ", flags=" << flags
203 << ", nops=" << nops() << endl;
204 for (int i=0; i<nops(); ++i) {
205 seq[i].printtree(os,indent+delta_indent);
207 os << string(indent+delta_indent,' ') << "=====" << endl;
210 void function::printcsrc(ostream & os, unsigned type, unsigned upper_precedence) const
212 debugmsg("function print csrc",LOGLEVEL_PRINT);
214 ASSERT(serial<registered_functions().size());
216 // Print function name in lowercase
218 lname=registered_functions()[serial].name;
219 for (unsigned i=0; i<lname.size(); i++)
220 lname[i] = tolower(lname[i]);
223 // Print arguments, separated by commas
224 exvector::const_iterator it = seq.begin();
225 exvector::const_iterator itend = seq.end();
226 while (it != itend) {
227 it->bp->printcsrc(os, type, 0);
235 ex function::expand(unsigned options) const
237 return this->setflag(status_flags::expanded);
240 ex function::eval(int level) const
242 ASSERT(serial<registered_functions().size());
244 exvector eseq=evalchildren(level);
246 if (registered_functions()[serial].e==0) {
247 return function(serial,eseq).hold();
249 switch (registered_functions()[serial].nparams) {
250 // the following lines have been generated for max. 10 parameters
252 return ((eval_funcp_1)(registered_functions()[serial].e))(eseq[1-1]);
255 return ((eval_funcp_2)(registered_functions()[serial].e))(eseq[1-1], eseq[2-1]);
258 return ((eval_funcp_3)(registered_functions()[serial].e))(eseq[1-1], eseq[2-1], eseq[3-1]);
261 return ((eval_funcp_4)(registered_functions()[serial].e))(eseq[1-1], eseq[2-1], eseq[3-1], eseq[4-1]);
264 return ((eval_funcp_5)(registered_functions()[serial].e))(eseq[1-1], eseq[2-1], eseq[3-1], eseq[4-1], eseq[5-1]);
267 return ((eval_funcp_6)(registered_functions()[serial].e))(eseq[1-1], eseq[2-1], eseq[3-1], eseq[4-1], eseq[5-1], eseq[6-1]);
270 return ((eval_funcp_7)(registered_functions()[serial].e))(eseq[1-1], eseq[2-1], eseq[3-1], eseq[4-1], eseq[5-1], eseq[6-1], eseq[7-1]);
273 return ((eval_funcp_8)(registered_functions()[serial].e))(eseq[1-1], eseq[2-1], eseq[3-1], eseq[4-1], eseq[5-1], eseq[6-1], eseq[7-1], eseq[8-1]);
276 return ((eval_funcp_9)(registered_functions()[serial].e))(eseq[1-1], eseq[2-1], eseq[3-1], eseq[4-1], eseq[5-1], eseq[6-1], eseq[7-1], eseq[8-1], eseq[9-1]);
279 return ((eval_funcp_10)(registered_functions()[serial].e))(eseq[1-1], eseq[2-1], eseq[3-1], eseq[4-1], eseq[5-1], eseq[6-1], eseq[7-1], eseq[8-1], eseq[9-1], eseq[10-1]);
282 // end of generated lines
284 throw(std::logic_error("function::eval(): invalid nparams"));
287 ex function::evalf(int level) const
289 ASSERT(serial<registered_functions().size());
291 exvector eseq=evalfchildren(level);
293 if (registered_functions()[serial].ef==0) {
294 return function(serial,eseq).hold();
296 switch (registered_functions()[serial].nparams) {
297 // the following lines have been generated for max. 10 parameters
299 return ((evalf_funcp_1)(registered_functions()[serial].ef))(eseq[1-1]);
302 return ((evalf_funcp_2)(registered_functions()[serial].ef))(eseq[1-1], eseq[2-1]);
305 return ((evalf_funcp_3)(registered_functions()[serial].ef))(eseq[1-1], eseq[2-1], eseq[3-1]);
308 return ((evalf_funcp_4)(registered_functions()[serial].ef))(eseq[1-1], eseq[2-1], eseq[3-1], eseq[4-1]);
311 return ((evalf_funcp_5)(registered_functions()[serial].ef))(eseq[1-1], eseq[2-1], eseq[3-1], eseq[4-1], eseq[5-1]);
314 return ((evalf_funcp_6)(registered_functions()[serial].ef))(eseq[1-1], eseq[2-1], eseq[3-1], eseq[4-1], eseq[5-1], eseq[6-1]);
317 return ((evalf_funcp_7)(registered_functions()[serial].ef))(eseq[1-1], eseq[2-1], eseq[3-1], eseq[4-1], eseq[5-1], eseq[6-1], eseq[7-1]);
320 return ((evalf_funcp_8)(registered_functions()[serial].ef))(eseq[1-1], eseq[2-1], eseq[3-1], eseq[4-1], eseq[5-1], eseq[6-1], eseq[7-1], eseq[8-1]);
323 return ((evalf_funcp_9)(registered_functions()[serial].ef))(eseq[1-1], eseq[2-1], eseq[3-1], eseq[4-1], eseq[5-1], eseq[6-1], eseq[7-1], eseq[8-1], eseq[9-1]);
326 return ((evalf_funcp_10)(registered_functions()[serial].ef))(eseq[1-1], eseq[2-1], eseq[3-1], eseq[4-1], eseq[5-1], eseq[6-1], eseq[7-1], eseq[8-1], eseq[9-1], eseq[10-1]);
329 // end of generated lines
331 throw(std::logic_error("function::evalf(): invalid nparams"));
334 ex function::thisexprseq(exvector const & v) const
336 return function(serial,v);
339 ex function::thisexprseq(exvector * vp) const
341 return function(serial,vp);
344 /** Implementation of ex::series for functions.
346 ex function::series(symbol const & s, ex const & point, int order) const
348 ASSERT(serial<registered_functions().size());
350 if (registered_functions()[serial].s==0) {
351 return basic::series(s, point, order);
353 switch (registered_functions()[serial].nparams) {
354 // the following lines have been generated for max. 10 parameters
356 return ((series_funcp_1)(registered_functions()[serial].s))(seq[1-1],s,point,order);
359 return ((series_funcp_2)(registered_functions()[serial].s))(seq[1-1], seq[2-1],s,point,order);
362 return ((series_funcp_3)(registered_functions()[serial].s))(seq[1-1], seq[2-1], seq[3-1],s,point,order);
365 return ((series_funcp_4)(registered_functions()[serial].s))(seq[1-1], seq[2-1], seq[3-1], seq[4-1],s,point,order);
368 return ((series_funcp_5)(registered_functions()[serial].s))(seq[1-1], seq[2-1], seq[3-1], seq[4-1], seq[5-1],s,point,order);
371 return ((series_funcp_6)(registered_functions()[serial].s))(seq[1-1], seq[2-1], seq[3-1], seq[4-1], seq[5-1], seq[6-1],s,point,order);
374 return ((series_funcp_7)(registered_functions()[serial].s))(seq[1-1], seq[2-1], seq[3-1], seq[4-1], seq[5-1], seq[6-1], seq[7-1],s,point,order);
377 return ((series_funcp_8)(registered_functions()[serial].s))(seq[1-1], seq[2-1], seq[3-1], seq[4-1], seq[5-1], seq[6-1], seq[7-1], seq[8-1],s,point,order);
380 return ((series_funcp_9)(registered_functions()[serial].s))(seq[1-1], seq[2-1], seq[3-1], seq[4-1], seq[5-1], seq[6-1], seq[7-1], seq[8-1], seq[9-1],s,point,order);
383 return ((series_funcp_10)(registered_functions()[serial].s))(seq[1-1], seq[2-1], seq[3-1], seq[4-1], seq[5-1], seq[6-1], seq[7-1], seq[8-1], seq[9-1], seq[10-1],s,point,order);
386 // end of generated lines
388 throw(std::logic_error("function::series(): invalid nparams"));
393 int function::compare_same_type(basic const & other) const
395 ASSERT(is_of_type(other, function));
396 function const & o=static_cast<function &>(const_cast<basic &>(other));
398 if (serial!=o.serial) {
399 return serial < o.serial ? -1 : 1;
401 return exprseq::compare_same_type(o);
404 bool function::is_equal_same_type(basic const & other) const
406 ASSERT(is_of_type(other, function));
407 function const & o=static_cast<function &>(const_cast<basic &>(other));
409 if (serial!=o.serial) return false;
410 return exprseq::is_equal_same_type(o);
413 unsigned function::return_type(void) const
416 return return_types::commutative;
418 return (*seq.begin()).return_type();
421 unsigned function::return_type_tinfo(void) const
426 return (*seq.begin()).return_type_tinfo();
430 // new virtual functions which can be overridden by derived classes
436 // non-virtual functions in this class
441 ex function::pdiff(unsigned diff_param) const // partial differentiation
443 ASSERT(serial<registered_functions().size());
445 if (registered_functions()[serial].d==0) {
446 throw(std::logic_error(string("function::pdiff(") + registered_functions()[serial].name + "): no diff function defined"));
448 switch (registered_functions()[serial].nparams) {
449 // the following lines have been generated for max. 10 parameters
451 return ((diff_funcp_1)(registered_functions()[serial].d))(seq[1-1],diff_param);
454 return ((diff_funcp_2)(registered_functions()[serial].d))(seq[1-1], seq[2-1],diff_param);
457 return ((diff_funcp_3)(registered_functions()[serial].d))(seq[1-1], seq[2-1], seq[3-1],diff_param);
460 return ((diff_funcp_4)(registered_functions()[serial].d))(seq[1-1], seq[2-1], seq[3-1], seq[4-1],diff_param);
463 return ((diff_funcp_5)(registered_functions()[serial].d))(seq[1-1], seq[2-1], seq[3-1], seq[4-1], seq[5-1],diff_param);
466 return ((diff_funcp_6)(registered_functions()[serial].d))(seq[1-1], seq[2-1], seq[3-1], seq[4-1], seq[5-1], seq[6-1],diff_param);
469 return ((diff_funcp_7)(registered_functions()[serial].d))(seq[1-1], seq[2-1], seq[3-1], seq[4-1], seq[5-1], seq[6-1], seq[7-1],diff_param);
472 return ((diff_funcp_8)(registered_functions()[serial].d))(seq[1-1], seq[2-1], seq[3-1], seq[4-1], seq[5-1], seq[6-1], seq[7-1], seq[8-1],diff_param);
475 return ((diff_funcp_9)(registered_functions()[serial].d))(seq[1-1], seq[2-1], seq[3-1], seq[4-1], seq[5-1], seq[6-1], seq[7-1], seq[8-1], seq[9-1],diff_param);
478 return ((diff_funcp_10)(registered_functions()[serial].d))(seq[1-1], seq[2-1], seq[3-1], seq[4-1], seq[5-1], seq[6-1], seq[7-1], seq[8-1], seq[9-1], seq[10-1],diff_param);
481 // end of generated lines
483 throw(std::logic_error("function::pdiff(): no diff function defined"));
486 vector<registered_function_info> & function::registered_functions(void)
488 static vector<registered_function_info> * rf=new vector<registered_function_info>;
494 // the following lines have been generated for max. 10 parameters
495 unsigned function::register_new(char const * nm, eval_funcp_1 e,
496 evalf_funcp_1 ef, diff_funcp_1 d, series_funcp_1 s)
498 registered_function_info rfi={nm,1,0,eval_funcp(e),
499 evalf_funcp(ef),diff_funcp(d),series_funcp(s)};
500 registered_functions().push_back(rfi);
501 return registered_functions().size()-1;
503 unsigned function::register_new(char const * nm, eval_funcp_2 e,
504 evalf_funcp_2 ef, diff_funcp_2 d, series_funcp_2 s)
506 registered_function_info rfi={nm,2,0,eval_funcp(e),
507 evalf_funcp(ef),diff_funcp(d),series_funcp(s)};
508 registered_functions().push_back(rfi);
509 return registered_functions().size()-1;
511 unsigned function::register_new(char const * nm, eval_funcp_3 e,
512 evalf_funcp_3 ef, diff_funcp_3 d, series_funcp_3 s)
514 registered_function_info rfi={nm,3,0,eval_funcp(e),
515 evalf_funcp(ef),diff_funcp(d),series_funcp(s)};
516 registered_functions().push_back(rfi);
517 return registered_functions().size()-1;
519 unsigned function::register_new(char const * nm, eval_funcp_4 e,
520 evalf_funcp_4 ef, diff_funcp_4 d, series_funcp_4 s)
522 registered_function_info rfi={nm,4,0,eval_funcp(e),
523 evalf_funcp(ef),diff_funcp(d),series_funcp(s)};
524 registered_functions().push_back(rfi);
525 return registered_functions().size()-1;
527 unsigned function::register_new(char const * nm, eval_funcp_5 e,
528 evalf_funcp_5 ef, diff_funcp_5 d, series_funcp_5 s)
530 registered_function_info rfi={nm,5,0,eval_funcp(e),
531 evalf_funcp(ef),diff_funcp(d),series_funcp(s)};
532 registered_functions().push_back(rfi);
533 return registered_functions().size()-1;
535 unsigned function::register_new(char const * nm, eval_funcp_6 e,
536 evalf_funcp_6 ef, diff_funcp_6 d, series_funcp_6 s)
538 registered_function_info rfi={nm,6,0,eval_funcp(e),
539 evalf_funcp(ef),diff_funcp(d),series_funcp(s)};
540 registered_functions().push_back(rfi);
541 return registered_functions().size()-1;
543 unsigned function::register_new(char const * nm, eval_funcp_7 e,
544 evalf_funcp_7 ef, diff_funcp_7 d, series_funcp_7 s)
546 registered_function_info rfi={nm,7,0,eval_funcp(e),
547 evalf_funcp(ef),diff_funcp(d),series_funcp(s)};
548 registered_functions().push_back(rfi);
549 return registered_functions().size()-1;
551 unsigned function::register_new(char const * nm, eval_funcp_8 e,
552 evalf_funcp_8 ef, diff_funcp_8 d, series_funcp_8 s)
554 registered_function_info rfi={nm,8,0,eval_funcp(e),
555 evalf_funcp(ef),diff_funcp(d),series_funcp(s)};
556 registered_functions().push_back(rfi);
557 return registered_functions().size()-1;
559 unsigned function::register_new(char const * nm, eval_funcp_9 e,
560 evalf_funcp_9 ef, diff_funcp_9 d, series_funcp_9 s)
562 registered_function_info rfi={nm,9,0,eval_funcp(e),
563 evalf_funcp(ef),diff_funcp(d),series_funcp(s)};
564 registered_functions().push_back(rfi);
565 return registered_functions().size()-1;
567 unsigned function::register_new(char const * nm, eval_funcp_10 e,
568 evalf_funcp_10 ef, diff_funcp_10 d, series_funcp_10 s)
570 registered_function_info rfi={nm,10,0,eval_funcp(e),
571 evalf_funcp(ef),diff_funcp(d),series_funcp(s)};
572 registered_functions().push_back(rfi);
573 return registered_functions().size()-1;
576 // end of generated lines
579 // static member variables
588 const function some_function;
589 type_info const & typeid_function=typeid(some_function);