3 * Implementation of class function. */
6 * This file was generated automatically by function.pl.
7 * Please do not modify it directly, edit the perl script instead!
8 * 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
37 // default constructor, destructor, copy constructor assignment operator and helpers
42 function::function() : serial(0)
44 debugmsg("function default constructor",LOGLEVEL_CONSTRUCT);
45 tinfo_key = TINFO_function;
50 debugmsg("function destructor",LOGLEVEL_DESTRUCT);
54 function::function(function const & other)
56 debugmsg("function copy constructor",LOGLEVEL_CONSTRUCT);
60 function const & function::operator=(function const & other)
62 debugmsg("function operator=",LOGLEVEL_ASSIGNMENT);
72 void function::copy(function const & other)
78 void function::destroy(bool call_parent)
80 if (call_parent) exprseq::destroy(call_parent);
89 function::function(unsigned ser) : serial(ser)
91 debugmsg("function constructor from unsigned",LOGLEVEL_CONSTRUCT);
92 tinfo_key = TINFO_function;
95 // the following lines have been generated for max. 10 parameters
96 function::function(unsigned ser, ex const & param1)
97 : exprseq(param1), serial(ser)
99 debugmsg("function constructor from unsigned,1*ex",LOGLEVEL_CONSTRUCT);
100 tinfo_key = TINFO_function;
102 function::function(unsigned ser, ex const & param1, ex const & param2)
103 : exprseq(param1, param2), serial(ser)
105 debugmsg("function constructor from unsigned,2*ex",LOGLEVEL_CONSTRUCT);
106 tinfo_key = TINFO_function;
108 function::function(unsigned ser, ex const & param1, ex const & param2, ex const & param3)
109 : exprseq(param1, param2, param3), serial(ser)
111 debugmsg("function constructor from unsigned,3*ex",LOGLEVEL_CONSTRUCT);
112 tinfo_key = TINFO_function;
114 function::function(unsigned ser, ex const & param1, ex const & param2, ex const & param3, ex const & param4)
115 : exprseq(param1, param2, param3, param4), serial(ser)
117 debugmsg("function constructor from unsigned,4*ex",LOGLEVEL_CONSTRUCT);
118 tinfo_key = TINFO_function;
120 function::function(unsigned ser, ex const & param1, ex const & param2, ex const & param3, ex const & param4, ex const & param5)
121 : exprseq(param1, param2, param3, param4, param5), serial(ser)
123 debugmsg("function constructor from unsigned,5*ex",LOGLEVEL_CONSTRUCT);
124 tinfo_key = TINFO_function;
126 function::function(unsigned ser, ex const & param1, ex const & param2, ex const & param3, ex const & param4, ex const & param5, ex const & param6)
127 : exprseq(param1, param2, param3, param4, param5, param6), serial(ser)
129 debugmsg("function constructor from unsigned,6*ex",LOGLEVEL_CONSTRUCT);
130 tinfo_key = TINFO_function;
132 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)
133 : exprseq(param1, param2, param3, param4, param5, param6, param7), serial(ser)
135 debugmsg("function constructor from unsigned,7*ex",LOGLEVEL_CONSTRUCT);
136 tinfo_key = TINFO_function;
138 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)
139 : exprseq(param1, param2, param3, param4, param5, param6, param7, param8), serial(ser)
141 debugmsg("function constructor from unsigned,8*ex",LOGLEVEL_CONSTRUCT);
142 tinfo_key = TINFO_function;
144 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)
145 : exprseq(param1, param2, param3, param4, param5, param6, param7, param8, param9), serial(ser)
147 debugmsg("function constructor from unsigned,9*ex",LOGLEVEL_CONSTRUCT);
148 tinfo_key = TINFO_function;
150 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)
151 : exprseq(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10), serial(ser)
153 debugmsg("function constructor from unsigned,10*ex",LOGLEVEL_CONSTRUCT);
154 tinfo_key = TINFO_function;
157 // end of generated lines
159 function::function(unsigned ser, exprseq const & es) : exprseq(es), serial(ser)
161 debugmsg("function constructor from unsigned,exprseq",LOGLEVEL_CONSTRUCT);
162 tinfo_key = TINFO_function;
165 function::function(unsigned ser, exvector const & v, bool discardable)
166 : exprseq(v,discardable), serial(ser)
168 debugmsg("function constructor from string,exvector,bool",LOGLEVEL_CONSTRUCT);
169 tinfo_key = TINFO_function;
172 function::function(unsigned ser, exvector * vp)
173 : exprseq(vp), serial(ser)
175 debugmsg("function constructor from unsigned,exvector *",LOGLEVEL_CONSTRUCT);
176 tinfo_key = TINFO_function;
180 // functions overriding virtual functions from bases classes
185 basic * function::duplicate() const
187 debugmsg("function duplicate",LOGLEVEL_DUPLICATE);
188 return new function(*this);
191 void function::printraw(ostream & os) const
193 debugmsg("function printraw",LOGLEVEL_PRINT);
195 ASSERT(serial<registered_functions().size());
197 os << "function(name=" << registered_functions()[serial].name;
198 for (exvector::const_iterator it=seq.begin(); it!=seq.end(); ++it) {
205 void function::print(ostream & os, unsigned upper_precedence) const
207 debugmsg("function print",LOGLEVEL_PRINT);
209 ASSERT(serial<registered_functions().size());
211 os << registered_functions()[serial].name;
212 printseq(os,'(',',',')',exprseq::precedence,function::precedence);
215 void function::printtree(ostream & os, unsigned indent) const
217 debugmsg("function printtree",LOGLEVEL_PRINT);
219 ASSERT(serial<registered_functions().size());
221 os << string(indent,' ') << "function "
222 << registered_functions()[serial].name
223 << ", hash=" << hashvalue << " (0x" << hex << hashvalue << dec << ")"
224 << ", flags=" << flags
225 << ", nops=" << nops() << endl;
226 for (int i=0; i<nops(); ++i) {
227 seq[i].printtree(os,indent+delta_indent);
229 os << string(indent+delta_indent,' ') << "=====" << endl;
232 void function::printcsrc(ostream & os, unsigned type, unsigned upper_precedence) const
234 debugmsg("function print csrc",LOGLEVEL_PRINT);
236 ASSERT(serial<registered_functions().size());
238 // Print function name in lowercase
240 lname=registered_functions()[serial].name;
241 for (unsigned i=0; i<lname.size(); i++)
242 lname[i] = tolower(lname[i]);
245 // Print arguments, separated by commas
246 exvector::const_iterator it = seq.begin();
247 exvector::const_iterator itend = seq.end();
248 while (it != itend) {
249 it->bp->printcsrc(os, type, 0);
257 ex function::expand(unsigned options) const
259 return this->setflag(status_flags::expanded);
262 ex function::eval(int level) const
264 ASSERT(serial<registered_functions().size());
266 exvector eseq=evalchildren(level);
268 if (registered_functions()[serial].e==0) {
269 return function(serial,eseq).hold();
271 switch (registered_functions()[serial].nparams) {
272 // the following lines have been generated for max. 10 parameters
274 return ((eval_funcp_1)(registered_functions()[serial].e))(eseq[1-1]);
277 return ((eval_funcp_2)(registered_functions()[serial].e))(eseq[1-1], eseq[2-1]);
280 return ((eval_funcp_3)(registered_functions()[serial].e))(eseq[1-1], eseq[2-1], eseq[3-1]);
283 return ((eval_funcp_4)(registered_functions()[serial].e))(eseq[1-1], eseq[2-1], eseq[3-1], eseq[4-1]);
286 return ((eval_funcp_5)(registered_functions()[serial].e))(eseq[1-1], eseq[2-1], eseq[3-1], eseq[4-1], eseq[5-1]);
289 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]);
292 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]);
295 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]);
298 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]);
301 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]);
304 // end of generated lines
306 throw(std::logic_error("function::eval(): invalid nparams"));
309 ex function::evalf(int level) const
311 ASSERT(serial<registered_functions().size());
313 exvector eseq=evalfchildren(level);
315 if (registered_functions()[serial].ef==0) {
316 return function(serial,eseq).hold();
318 switch (registered_functions()[serial].nparams) {
319 // the following lines have been generated for max. 10 parameters
321 return ((evalf_funcp_1)(registered_functions()[serial].ef))(eseq[1-1]);
324 return ((evalf_funcp_2)(registered_functions()[serial].ef))(eseq[1-1], eseq[2-1]);
327 return ((evalf_funcp_3)(registered_functions()[serial].ef))(eseq[1-1], eseq[2-1], eseq[3-1]);
330 return ((evalf_funcp_4)(registered_functions()[serial].ef))(eseq[1-1], eseq[2-1], eseq[3-1], eseq[4-1]);
333 return ((evalf_funcp_5)(registered_functions()[serial].ef))(eseq[1-1], eseq[2-1], eseq[3-1], eseq[4-1], eseq[5-1]);
336 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]);
339 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]);
342 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]);
345 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]);
348 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]);
351 // end of generated lines
353 throw(std::logic_error("function::evalf(): invalid nparams"));
356 ex function::thisexprseq(exvector const & v) const
358 return function(serial,v);
361 ex function::thisexprseq(exvector * vp) const
363 return function(serial,vp);
366 /** Implementation of ex::series for functions.
368 ex function::series(symbol const & s, ex const & point, int order) const
370 ASSERT(serial<registered_functions().size());
372 if (registered_functions()[serial].s==0) {
373 return basic::series(s, point, order);
375 switch (registered_functions()[serial].nparams) {
376 // the following lines have been generated for max. 10 parameters
378 return ((series_funcp_1)(registered_functions()[serial].s))(seq[1-1],s,point,order);
381 return ((series_funcp_2)(registered_functions()[serial].s))(seq[1-1], seq[2-1],s,point,order);
384 return ((series_funcp_3)(registered_functions()[serial].s))(seq[1-1], seq[2-1], seq[3-1],s,point,order);
387 return ((series_funcp_4)(registered_functions()[serial].s))(seq[1-1], seq[2-1], seq[3-1], seq[4-1],s,point,order);
390 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);
393 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);
396 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);
399 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);
402 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);
405 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);
408 // end of generated lines
410 throw(std::logic_error("function::series(): invalid nparams"));
415 int function::compare_same_type(basic const & other) const
417 ASSERT(is_of_type(other, function));
418 function const & o=static_cast<function &>(const_cast<basic &>(other));
420 if (serial!=o.serial) {
421 return serial < o.serial ? -1 : 1;
423 return exprseq::compare_same_type(o);
426 bool function::is_equal_same_type(basic const & other) const
428 ASSERT(is_of_type(other, function));
429 function const & o=static_cast<function &>(const_cast<basic &>(other));
431 if (serial!=o.serial) return false;
432 return exprseq::is_equal_same_type(o);
435 unsigned function::return_type(void) const
438 return return_types::commutative;
440 return (*seq.begin()).return_type();
443 unsigned function::return_type_tinfo(void) const
448 return (*seq.begin()).return_type_tinfo();
452 // new virtual functions which can be overridden by derived classes
458 // non-virtual functions in this class
463 ex function::pdiff(unsigned diff_param) const // partial differentiation
465 ASSERT(serial<registered_functions().size());
467 if (registered_functions()[serial].d==0) {
468 throw(std::logic_error(string("function::pdiff(") + registered_functions()[serial].name + "): no diff function defined"));
470 switch (registered_functions()[serial].nparams) {
471 // the following lines have been generated for max. 10 parameters
473 return ((diff_funcp_1)(registered_functions()[serial].d))(seq[1-1],diff_param);
476 return ((diff_funcp_2)(registered_functions()[serial].d))(seq[1-1], seq[2-1],diff_param);
479 return ((diff_funcp_3)(registered_functions()[serial].d))(seq[1-1], seq[2-1], seq[3-1],diff_param);
482 return ((diff_funcp_4)(registered_functions()[serial].d))(seq[1-1], seq[2-1], seq[3-1], seq[4-1],diff_param);
485 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);
488 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);
491 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);
494 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);
497 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);
500 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);
503 // end of generated lines
505 throw(std::logic_error("function::pdiff(): no diff function defined"));
508 vector<registered_function_info> & function::registered_functions(void)
510 static vector<registered_function_info> * rf=new vector<registered_function_info>;
516 // the following lines have been generated for max. 10 parameters
517 unsigned function::register_new(char const * nm, eval_funcp_1 e,
518 evalf_funcp_1 ef, diff_funcp_1 d, series_funcp_1 s)
520 registered_function_info rfi={nm,1,0,eval_funcp(e),
521 evalf_funcp(ef),diff_funcp(d),series_funcp(s)};
522 registered_functions().push_back(rfi);
523 return registered_functions().size()-1;
525 unsigned function::register_new(char const * nm, eval_funcp_2 e,
526 evalf_funcp_2 ef, diff_funcp_2 d, series_funcp_2 s)
528 registered_function_info rfi={nm,2,0,eval_funcp(e),
529 evalf_funcp(ef),diff_funcp(d),series_funcp(s)};
530 registered_functions().push_back(rfi);
531 return registered_functions().size()-1;
533 unsigned function::register_new(char const * nm, eval_funcp_3 e,
534 evalf_funcp_3 ef, diff_funcp_3 d, series_funcp_3 s)
536 registered_function_info rfi={nm,3,0,eval_funcp(e),
537 evalf_funcp(ef),diff_funcp(d),series_funcp(s)};
538 registered_functions().push_back(rfi);
539 return registered_functions().size()-1;
541 unsigned function::register_new(char const * nm, eval_funcp_4 e,
542 evalf_funcp_4 ef, diff_funcp_4 d, series_funcp_4 s)
544 registered_function_info rfi={nm,4,0,eval_funcp(e),
545 evalf_funcp(ef),diff_funcp(d),series_funcp(s)};
546 registered_functions().push_back(rfi);
547 return registered_functions().size()-1;
549 unsigned function::register_new(char const * nm, eval_funcp_5 e,
550 evalf_funcp_5 ef, diff_funcp_5 d, series_funcp_5 s)
552 registered_function_info rfi={nm,5,0,eval_funcp(e),
553 evalf_funcp(ef),diff_funcp(d),series_funcp(s)};
554 registered_functions().push_back(rfi);
555 return registered_functions().size()-1;
557 unsigned function::register_new(char const * nm, eval_funcp_6 e,
558 evalf_funcp_6 ef, diff_funcp_6 d, series_funcp_6 s)
560 registered_function_info rfi={nm,6,0,eval_funcp(e),
561 evalf_funcp(ef),diff_funcp(d),series_funcp(s)};
562 registered_functions().push_back(rfi);
563 return registered_functions().size()-1;
565 unsigned function::register_new(char const * nm, eval_funcp_7 e,
566 evalf_funcp_7 ef, diff_funcp_7 d, series_funcp_7 s)
568 registered_function_info rfi={nm,7,0,eval_funcp(e),
569 evalf_funcp(ef),diff_funcp(d),series_funcp(s)};
570 registered_functions().push_back(rfi);
571 return registered_functions().size()-1;
573 unsigned function::register_new(char const * nm, eval_funcp_8 e,
574 evalf_funcp_8 ef, diff_funcp_8 d, series_funcp_8 s)
576 registered_function_info rfi={nm,8,0,eval_funcp(e),
577 evalf_funcp(ef),diff_funcp(d),series_funcp(s)};
578 registered_functions().push_back(rfi);
579 return registered_functions().size()-1;
581 unsigned function::register_new(char const * nm, eval_funcp_9 e,
582 evalf_funcp_9 ef, diff_funcp_9 d, series_funcp_9 s)
584 registered_function_info rfi={nm,9,0,eval_funcp(e),
585 evalf_funcp(ef),diff_funcp(d),series_funcp(s)};
586 registered_functions().push_back(rfi);
587 return registered_functions().size()-1;
589 unsigned function::register_new(char const * nm, eval_funcp_10 e,
590 evalf_funcp_10 ef, diff_funcp_10 d, series_funcp_10 s)
592 registered_function_info rfi={nm,10,0,eval_funcp(e),
593 evalf_funcp(ef),diff_funcp(d),series_funcp(s)};
594 registered_functions().push_back(rfi);
595 return registered_functions().size()-1;
598 // end of generated lines
601 // static member variables
610 const function some_function;
611 type_info const & typeid_function=typeid(some_function);