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 */
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
34 // default constructor, destructor, copy constructor assignment operator and helpers
39 function::function() : serial(0)
41 debugmsg("function default constructor",LOGLEVEL_CONSTRUCT);
42 tinfo_key = TINFO_function;
47 debugmsg("function destructor",LOGLEVEL_DESTRUCT);
51 function::function(function const & other)
53 debugmsg("function copy constructor",LOGLEVEL_CONSTRUCT);
57 function const & function::operator=(function const & other)
59 debugmsg("function operator=",LOGLEVEL_ASSIGNMENT);
69 void function::copy(function const & other)
75 void function::destroy(bool call_parent)
77 if (call_parent) exprseq::destroy(call_parent);
86 function::function(unsigned ser) : serial(ser)
88 debugmsg("function constructor from unsigned",LOGLEVEL_CONSTRUCT);
89 tinfo_key = TINFO_function;
92 // the following lines have been generated for max. 10 parameters
93 function::function(unsigned ser, ex const & param1)
94 : exprseq(param1), serial(ser)
96 debugmsg("function constructor from unsigned,1*ex",LOGLEVEL_CONSTRUCT);
97 tinfo_key = TINFO_function;
99 function::function(unsigned ser, ex const & param1, ex const & param2)
100 : exprseq(param1, param2), serial(ser)
102 debugmsg("function constructor from unsigned,2*ex",LOGLEVEL_CONSTRUCT);
103 tinfo_key = TINFO_function;
105 function::function(unsigned ser, ex const & param1, ex const & param2, ex const & param3)
106 : exprseq(param1, param2, param3), serial(ser)
108 debugmsg("function constructor from unsigned,3*ex",LOGLEVEL_CONSTRUCT);
109 tinfo_key = TINFO_function;
111 function::function(unsigned ser, ex const & param1, ex const & param2, ex const & param3, ex const & param4)
112 : exprseq(param1, param2, param3, param4), serial(ser)
114 debugmsg("function constructor from unsigned,4*ex",LOGLEVEL_CONSTRUCT);
115 tinfo_key = TINFO_function;
117 function::function(unsigned ser, ex const & param1, ex const & param2, ex const & param3, ex const & param4, ex const & param5)
118 : exprseq(param1, param2, param3, param4, param5), serial(ser)
120 debugmsg("function constructor from unsigned,5*ex",LOGLEVEL_CONSTRUCT);
121 tinfo_key = TINFO_function;
123 function::function(unsigned ser, ex const & param1, ex const & param2, ex const & param3, ex const & param4, ex const & param5, ex const & param6)
124 : exprseq(param1, param2, param3, param4, param5, param6), serial(ser)
126 debugmsg("function constructor from unsigned,6*ex",LOGLEVEL_CONSTRUCT);
127 tinfo_key = TINFO_function;
129 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)
130 : exprseq(param1, param2, param3, param4, param5, param6, param7), serial(ser)
132 debugmsg("function constructor from unsigned,7*ex",LOGLEVEL_CONSTRUCT);
133 tinfo_key = TINFO_function;
135 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)
136 : exprseq(param1, param2, param3, param4, param5, param6, param7, param8), serial(ser)
138 debugmsg("function constructor from unsigned,8*ex",LOGLEVEL_CONSTRUCT);
139 tinfo_key = TINFO_function;
141 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)
142 : exprseq(param1, param2, param3, param4, param5, param6, param7, param8, param9), serial(ser)
144 debugmsg("function constructor from unsigned,9*ex",LOGLEVEL_CONSTRUCT);
145 tinfo_key = TINFO_function;
147 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)
148 : exprseq(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10), serial(ser)
150 debugmsg("function constructor from unsigned,10*ex",LOGLEVEL_CONSTRUCT);
151 tinfo_key = TINFO_function;
154 // end of generated lines
156 function::function(unsigned ser, exprseq const & es) : exprseq(es), serial(ser)
158 debugmsg("function constructor from unsigned,exprseq",LOGLEVEL_CONSTRUCT);
159 tinfo_key = TINFO_function;
162 function::function(unsigned ser, exvector const & v, bool discardable)
163 : exprseq(v,discardable), serial(ser)
165 debugmsg("function constructor from string,exvector,bool",LOGLEVEL_CONSTRUCT);
166 tinfo_key = TINFO_function;
169 function::function(unsigned ser, exvector * vp)
170 : exprseq(vp), serial(ser)
172 debugmsg("function constructor from unsigned,exvector *",LOGLEVEL_CONSTRUCT);
173 tinfo_key = TINFO_function;
177 // functions overriding virtual functions from bases classes
182 basic * function::duplicate() const
184 debugmsg("function duplicate",LOGLEVEL_DUPLICATE);
185 return new function(*this);
188 void function::printraw(ostream & os) const
190 debugmsg("function printraw",LOGLEVEL_PRINT);
192 ASSERT(serial<registered_functions().size());
194 os << "function(name=" << registered_functions()[serial].name;
195 for (exvector::const_iterator it=seq.begin(); it!=seq.end(); ++it) {
202 void function::print(ostream & os, unsigned upper_precedence) const
204 debugmsg("function print",LOGLEVEL_PRINT);
206 ASSERT(serial<registered_functions().size());
208 os << registered_functions()[serial].name;
209 printseq(os,'(',',',')',exprseq::precedence,function::precedence);
212 void function::printtree(ostream & os, unsigned indent) const
214 debugmsg("function printtree",LOGLEVEL_PRINT);
216 ASSERT(serial<registered_functions().size());
218 os << string(indent,' ') << "function "
219 << registered_functions()[serial].name
220 << ", hash=" << hashvalue << " (0x" << hex << hashvalue << dec << ")"
221 << ", flags=" << flags
222 << ", nops=" << nops() << endl;
223 for (int i=0; i<nops(); ++i) {
224 seq[i].printtree(os,indent+delta_indent);
226 os << string(indent+delta_indent,' ') << "=====" << endl;
229 void function::printcsrc(ostream & os, unsigned type, unsigned upper_precedence) const
231 debugmsg("function print csrc",LOGLEVEL_PRINT);
233 ASSERT(serial<registered_functions().size());
235 // Print function name in lowercase
237 lname=registered_functions()[serial].name;
238 for (unsigned i=0; i<lname.size(); i++)
239 lname[i] = tolower(lname[i]);
242 // Print arguments, separated by commas
243 exvector::const_iterator it = seq.begin();
244 exvector::const_iterator itend = seq.end();
245 while (it != itend) {
246 it->bp->printcsrc(os, type, 0);
254 ex function::expand(unsigned options) const
256 return this->setflag(status_flags::expanded);
259 ex function::eval(int level) const
261 ASSERT(serial<registered_functions().size());
263 exvector eseq=evalchildren(level);
265 if (registered_functions()[serial].e==0) {
266 return function(serial,eseq).hold();
268 switch (registered_functions()[serial].nparams) {
269 // the following lines have been generated for max. 10 parameters
271 return ((eval_funcp_1)(registered_functions()[serial].e))(eseq[1-1]);
274 return ((eval_funcp_2)(registered_functions()[serial].e))(eseq[1-1], eseq[2-1]);
277 return ((eval_funcp_3)(registered_functions()[serial].e))(eseq[1-1], eseq[2-1], eseq[3-1]);
280 return ((eval_funcp_4)(registered_functions()[serial].e))(eseq[1-1], eseq[2-1], eseq[3-1], eseq[4-1]);
283 return ((eval_funcp_5)(registered_functions()[serial].e))(eseq[1-1], eseq[2-1], eseq[3-1], eseq[4-1], eseq[5-1]);
286 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]);
289 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]);
292 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]);
295 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]);
298 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]);
301 // end of generated lines
303 throw(std::logic_error("function::eval(): invalid nparams"));
306 ex function::evalf(int level) const
308 ASSERT(serial<registered_functions().size());
310 exvector eseq=evalfchildren(level);
312 if (registered_functions()[serial].ef==0) {
313 return function(serial,eseq).hold();
315 switch (registered_functions()[serial].nparams) {
316 // the following lines have been generated for max. 10 parameters
318 return ((evalf_funcp_1)(registered_functions()[serial].ef))(eseq[1-1]);
321 return ((evalf_funcp_2)(registered_functions()[serial].ef))(eseq[1-1], eseq[2-1]);
324 return ((evalf_funcp_3)(registered_functions()[serial].ef))(eseq[1-1], eseq[2-1], eseq[3-1]);
327 return ((evalf_funcp_4)(registered_functions()[serial].ef))(eseq[1-1], eseq[2-1], eseq[3-1], eseq[4-1]);
330 return ((evalf_funcp_5)(registered_functions()[serial].ef))(eseq[1-1], eseq[2-1], eseq[3-1], eseq[4-1], eseq[5-1]);
333 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]);
336 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]);
339 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]);
342 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]);
345 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]);
348 // end of generated lines
350 throw(std::logic_error("function::evalf(): invalid nparams"));
353 ex function::thisexprseq(exvector const & v) const
355 return function(serial,v);
358 ex function::thisexprseq(exvector * vp) const
360 return function(serial,vp);
363 /** Implementation of ex::series for functions.
365 ex function::series(symbol const & s, ex const & point, int order) const
367 ASSERT(serial<registered_functions().size());
369 if (registered_functions()[serial].s==0) {
370 return basic::series(s, point, order);
372 switch (registered_functions()[serial].nparams) {
373 // the following lines have been generated for max. 10 parameters
375 return ((series_funcp_1)(registered_functions()[serial].s))(seq[1-1],s,point,order);
378 return ((series_funcp_2)(registered_functions()[serial].s))(seq[1-1], seq[2-1],s,point,order);
381 return ((series_funcp_3)(registered_functions()[serial].s))(seq[1-1], seq[2-1], seq[3-1],s,point,order);
384 return ((series_funcp_4)(registered_functions()[serial].s))(seq[1-1], seq[2-1], seq[3-1], seq[4-1],s,point,order);
387 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);
390 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);
393 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);
396 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);
399 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);
402 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);
405 // end of generated lines
407 throw(std::logic_error("function::series(): invalid nparams"));
412 int function::compare_same_type(basic const & other) const
414 ASSERT(is_of_type(other, function));
415 function const & o=static_cast<function &>(const_cast<basic &>(other));
417 if (serial!=o.serial) {
418 return serial < o.serial ? -1 : 1;
420 return exprseq::compare_same_type(o);
423 bool function::is_equal_same_type(basic const & other) const
425 ASSERT(is_of_type(other, function));
426 function const & o=static_cast<function &>(const_cast<basic &>(other));
428 if (serial!=o.serial) return false;
429 return exprseq::is_equal_same_type(o);
432 unsigned function::return_type(void) const
435 return return_types::commutative;
437 return (*seq.begin()).return_type();
440 unsigned function::return_type_tinfo(void) const
445 return (*seq.begin()).return_type_tinfo();
449 // new virtual functions which can be overridden by derived classes
455 // non-virtual functions in this class
460 ex function::pdiff(unsigned diff_param) const // partial differentiation
462 ASSERT(serial<registered_functions().size());
464 if (registered_functions()[serial].d==0) {
465 throw(std::logic_error(string("function::pdiff(") + registered_functions()[serial].name + "): no diff function defined"));
467 switch (registered_functions()[serial].nparams) {
468 // the following lines have been generated for max. 10 parameters
470 return ((diff_funcp_1)(registered_functions()[serial].d))(seq[1-1],diff_param);
473 return ((diff_funcp_2)(registered_functions()[serial].d))(seq[1-1], seq[2-1],diff_param);
476 return ((diff_funcp_3)(registered_functions()[serial].d))(seq[1-1], seq[2-1], seq[3-1],diff_param);
479 return ((diff_funcp_4)(registered_functions()[serial].d))(seq[1-1], seq[2-1], seq[3-1], seq[4-1],diff_param);
482 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);
485 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);
488 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);
491 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);
494 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);
497 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);
500 // end of generated lines
502 throw(std::logic_error("function::pdiff(): no diff function defined"));
505 vector<registered_function_info> & function::registered_functions(void)
507 static vector<registered_function_info> * rf=new vector<registered_function_info>;
513 // the following lines have been generated for max. 10 parameters
514 unsigned function::register_new(char const * nm, eval_funcp_1 e,
515 evalf_funcp_1 ef, diff_funcp_1 d, series_funcp_1 s)
517 registered_function_info rfi={nm,1,0,eval_funcp(e),
518 evalf_funcp(ef),diff_funcp(d),series_funcp(s)};
519 registered_functions().push_back(rfi);
520 return registered_functions().size()-1;
522 unsigned function::register_new(char const * nm, eval_funcp_2 e,
523 evalf_funcp_2 ef, diff_funcp_2 d, series_funcp_2 s)
525 registered_function_info rfi={nm,2,0,eval_funcp(e),
526 evalf_funcp(ef),diff_funcp(d),series_funcp(s)};
527 registered_functions().push_back(rfi);
528 return registered_functions().size()-1;
530 unsigned function::register_new(char const * nm, eval_funcp_3 e,
531 evalf_funcp_3 ef, diff_funcp_3 d, series_funcp_3 s)
533 registered_function_info rfi={nm,3,0,eval_funcp(e),
534 evalf_funcp(ef),diff_funcp(d),series_funcp(s)};
535 registered_functions().push_back(rfi);
536 return registered_functions().size()-1;
538 unsigned function::register_new(char const * nm, eval_funcp_4 e,
539 evalf_funcp_4 ef, diff_funcp_4 d, series_funcp_4 s)
541 registered_function_info rfi={nm,4,0,eval_funcp(e),
542 evalf_funcp(ef),diff_funcp(d),series_funcp(s)};
543 registered_functions().push_back(rfi);
544 return registered_functions().size()-1;
546 unsigned function::register_new(char const * nm, eval_funcp_5 e,
547 evalf_funcp_5 ef, diff_funcp_5 d, series_funcp_5 s)
549 registered_function_info rfi={nm,5,0,eval_funcp(e),
550 evalf_funcp(ef),diff_funcp(d),series_funcp(s)};
551 registered_functions().push_back(rfi);
552 return registered_functions().size()-1;
554 unsigned function::register_new(char const * nm, eval_funcp_6 e,
555 evalf_funcp_6 ef, diff_funcp_6 d, series_funcp_6 s)
557 registered_function_info rfi={nm,6,0,eval_funcp(e),
558 evalf_funcp(ef),diff_funcp(d),series_funcp(s)};
559 registered_functions().push_back(rfi);
560 return registered_functions().size()-1;
562 unsigned function::register_new(char const * nm, eval_funcp_7 e,
563 evalf_funcp_7 ef, diff_funcp_7 d, series_funcp_7 s)
565 registered_function_info rfi={nm,7,0,eval_funcp(e),
566 evalf_funcp(ef),diff_funcp(d),series_funcp(s)};
567 registered_functions().push_back(rfi);
568 return registered_functions().size()-1;
570 unsigned function::register_new(char const * nm, eval_funcp_8 e,
571 evalf_funcp_8 ef, diff_funcp_8 d, series_funcp_8 s)
573 registered_function_info rfi={nm,8,0,eval_funcp(e),
574 evalf_funcp(ef),diff_funcp(d),series_funcp(s)};
575 registered_functions().push_back(rfi);
576 return registered_functions().size()-1;
578 unsigned function::register_new(char const * nm, eval_funcp_9 e,
579 evalf_funcp_9 ef, diff_funcp_9 d, series_funcp_9 s)
581 registered_function_info rfi={nm,9,0,eval_funcp(e),
582 evalf_funcp(ef),diff_funcp(d),series_funcp(s)};
583 registered_functions().push_back(rfi);
584 return registered_functions().size()-1;
586 unsigned function::register_new(char const * nm, eval_funcp_10 e,
587 evalf_funcp_10 ef, diff_funcp_10 d, series_funcp_10 s)
589 registered_function_info rfi={nm,10,0,eval_funcp(e),
590 evalf_funcp(ef),diff_funcp(d),series_funcp(s)};
591 registered_functions().push_back(rfi);
592 return registered_functions().size()-1;
595 // end of generated lines
598 // static member variables
607 const function some_function;
608 type_info const & typeid_function=typeid(some_function);