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
9 * GiNaC Copyright (C) 1999 Johannes Gutenberg University Mainz, Germany
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, write to the Free Software
23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
33 // default constructor, destructor, copy constructor assignment operator and helpers
38 function::function() : serial(0)
40 debugmsg("function default constructor",LOGLEVEL_CONSTRUCT);
41 tinfo_key = TINFO_function;
46 debugmsg("function destructor",LOGLEVEL_DESTRUCT);
50 function::function(function const & other)
52 debugmsg("function copy constructor",LOGLEVEL_CONSTRUCT);
56 function const & function::operator=(function const & other)
58 debugmsg("function operator=",LOGLEVEL_ASSIGNMENT);
68 void function::copy(function const & other)
74 void function::destroy(bool call_parent)
76 if (call_parent) exprseq::destroy(call_parent);
85 function::function(unsigned ser) : serial(ser)
87 debugmsg("function constructor from unsigned",LOGLEVEL_CONSTRUCT);
88 tinfo_key = TINFO_function;
91 // the following lines have been generated for max. 10 parameters
92 function::function(unsigned ser, ex const & param1)
93 : exprseq(param1), serial(ser)
95 debugmsg("function constructor from unsigned,1*ex",LOGLEVEL_CONSTRUCT);
96 tinfo_key = TINFO_function;
98 function::function(unsigned ser, ex const & param1, ex const & param2)
99 : exprseq(param1, param2), serial(ser)
101 debugmsg("function constructor from unsigned,2*ex",LOGLEVEL_CONSTRUCT);
102 tinfo_key = TINFO_function;
104 function::function(unsigned ser, ex const & param1, ex const & param2, ex const & param3)
105 : exprseq(param1, param2, param3), serial(ser)
107 debugmsg("function constructor from unsigned,3*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)
111 : exprseq(param1, param2, param3, param4), serial(ser)
113 debugmsg("function constructor from unsigned,4*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)
117 : exprseq(param1, param2, param3, param4, param5), serial(ser)
119 debugmsg("function constructor from unsigned,5*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)
123 : exprseq(param1, param2, param3, param4, param5, param6), serial(ser)
125 debugmsg("function constructor from unsigned,6*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)
129 : exprseq(param1, param2, param3, param4, param5, param6, param7), serial(ser)
131 debugmsg("function constructor from unsigned,7*ex",LOGLEVEL_CONSTRUCT);
132 tinfo_key = TINFO_function;
134 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)
135 : exprseq(param1, param2, param3, param4, param5, param6, param7, param8), serial(ser)
137 debugmsg("function constructor from unsigned,8*ex",LOGLEVEL_CONSTRUCT);
138 tinfo_key = TINFO_function;
140 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)
141 : exprseq(param1, param2, param3, param4, param5, param6, param7, param8, param9), serial(ser)
143 debugmsg("function constructor from unsigned,9*ex",LOGLEVEL_CONSTRUCT);
144 tinfo_key = TINFO_function;
146 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)
147 : exprseq(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10), serial(ser)
149 debugmsg("function constructor from unsigned,10*ex",LOGLEVEL_CONSTRUCT);
150 tinfo_key = TINFO_function;
153 // end of generated lines
155 function::function(unsigned ser, exprseq const & es) : exprseq(es), serial(ser)
157 debugmsg("function constructor from unsigned,exprseq",LOGLEVEL_CONSTRUCT);
158 tinfo_key = TINFO_function;
161 function::function(unsigned ser, exvector const & v, bool discardable)
162 : exprseq(v,discardable), serial(ser)
164 debugmsg("function constructor from string,exvector,bool",LOGLEVEL_CONSTRUCT);
165 tinfo_key = TINFO_function;
168 function::function(unsigned ser, exvector * vp)
169 : exprseq(vp), serial(ser)
171 debugmsg("function constructor from unsigned,exvector *",LOGLEVEL_CONSTRUCT);
172 tinfo_key = TINFO_function;
176 // functions overriding virtual functions from bases classes
181 basic * function::duplicate() const
183 debugmsg("function duplicate",LOGLEVEL_DUPLICATE);
184 return new function(*this);
187 void function::printraw(ostream & os) const
189 debugmsg("function printraw",LOGLEVEL_PRINT);
191 ASSERT(serial<registered_functions().size());
193 os << "function(name=" << registered_functions()[serial].name;
194 for (exvector::const_iterator it=seq.begin(); it!=seq.end(); ++it) {
201 void function::print(ostream & os, unsigned upper_precedence) const
203 debugmsg("function print",LOGLEVEL_PRINT);
205 ASSERT(serial<registered_functions().size());
207 os << registered_functions()[serial].name;
208 printseq(os,'(',',',')',exprseq::precedence,function::precedence);
211 void function::printtree(ostream & os, unsigned indent) const
213 debugmsg("function printtree",LOGLEVEL_PRINT);
215 ASSERT(serial<registered_functions().size());
217 os << string(indent,' ') << "function "
218 << registered_functions()[serial].name
219 << ", hash=" << hashvalue << " (0x" << hex << hashvalue << dec << ")"
220 << ", flags=" << flags
221 << ", nops=" << nops() << endl;
222 for (int i=0; i<nops(); ++i) {
223 seq[i].printtree(os,indent+delta_indent);
225 os << string(indent+delta_indent,' ') << "=====" << endl;
228 void function::printcsrc(ostream & os, unsigned type, unsigned upper_precedence) const
230 debugmsg("function print csrc",LOGLEVEL_PRINT);
232 ASSERT(serial<registered_functions().size());
234 // Print function name in lowercase
236 lname=registered_functions()[serial].name;
237 for (unsigned i=0; i<lname.size(); i++)
238 lname[i] = tolower(lname[i]);
241 // Print arguments, separated by commas
242 exvector::const_iterator it = seq.begin();
243 exvector::const_iterator itend = seq.end();
244 while (it != itend) {
245 it->bp->printcsrc(os, type, 0);
253 ex function::expand(unsigned options) const
255 return this->setflag(status_flags::expanded);
258 ex function::eval(int level) const
260 ASSERT(serial<registered_functions().size());
262 exvector eseq=evalchildren(level);
264 if (registered_functions()[serial].e==0) {
265 return function(serial,eseq).hold();
267 switch (registered_functions()[serial].nparams) {
268 // the following lines have been generated for max. 10 parameters
270 return ((eval_funcp_1)(registered_functions()[serial].e))(eseq[1-1]);
273 return ((eval_funcp_2)(registered_functions()[serial].e))(eseq[1-1], eseq[2-1]);
276 return ((eval_funcp_3)(registered_functions()[serial].e))(eseq[1-1], eseq[2-1], eseq[3-1]);
279 return ((eval_funcp_4)(registered_functions()[serial].e))(eseq[1-1], eseq[2-1], eseq[3-1], eseq[4-1]);
282 return ((eval_funcp_5)(registered_functions()[serial].e))(eseq[1-1], eseq[2-1], eseq[3-1], eseq[4-1], eseq[5-1]);
285 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]);
288 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]);
291 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]);
294 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]);
297 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]);
300 // end of generated lines
302 throw(std::logic_error("function::eval(): invalid nparams"));
305 ex function::evalf(int level) const
307 ASSERT(serial<registered_functions().size());
309 exvector eseq=evalfchildren(level);
311 if (registered_functions()[serial].ef==0) {
312 return function(serial,eseq).hold();
314 switch (registered_functions()[serial].nparams) {
315 // the following lines have been generated for max. 10 parameters
317 return ((evalf_funcp_1)(registered_functions()[serial].ef))(eseq[1-1]);
320 return ((evalf_funcp_2)(registered_functions()[serial].ef))(eseq[1-1], eseq[2-1]);
323 return ((evalf_funcp_3)(registered_functions()[serial].ef))(eseq[1-1], eseq[2-1], eseq[3-1]);
326 return ((evalf_funcp_4)(registered_functions()[serial].ef))(eseq[1-1], eseq[2-1], eseq[3-1], eseq[4-1]);
329 return ((evalf_funcp_5)(registered_functions()[serial].ef))(eseq[1-1], eseq[2-1], eseq[3-1], eseq[4-1], eseq[5-1]);
332 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]);
335 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]);
338 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]);
341 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]);
344 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]);
347 // end of generated lines
349 throw(std::logic_error("function::evalf(): invalid nparams"));
352 ex function::thisexprseq(exvector const & v) const
354 return function(serial,v);
357 ex function::thisexprseq(exvector * vp) const
359 return function(serial,vp);
362 /** Implementation of ex::series for functions.
364 ex function::series(symbol const & s, ex const & point, int order) const
366 ASSERT(serial<registered_functions().size());
368 if (registered_functions()[serial].s==0) {
369 return basic::series(s, point, order);
371 switch (registered_functions()[serial].nparams) {
372 // the following lines have been generated for max. 10 parameters
374 return ((series_funcp_1)(registered_functions()[serial].s))(seq[1-1],s,point,order);
377 return ((series_funcp_2)(registered_functions()[serial].s))(seq[1-1], seq[2-1],s,point,order);
380 return ((series_funcp_3)(registered_functions()[serial].s))(seq[1-1], seq[2-1], seq[3-1],s,point,order);
383 return ((series_funcp_4)(registered_functions()[serial].s))(seq[1-1], seq[2-1], seq[3-1], seq[4-1],s,point,order);
386 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);
389 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);
392 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);
395 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);
398 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);
401 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);
404 // end of generated lines
406 throw(std::logic_error("function::series(): invalid nparams"));
411 int function::compare_same_type(basic const & other) const
413 ASSERT(is_of_type(other, function));
414 function const & o=static_cast<function &>(const_cast<basic &>(other));
416 if (serial!=o.serial) {
417 return serial < o.serial ? -1 : 1;
419 return exprseq::compare_same_type(o);
422 bool function::is_equal_same_type(basic const & other) const
424 ASSERT(is_of_type(other, function));
425 function const & o=static_cast<function &>(const_cast<basic &>(other));
427 if (serial!=o.serial) return false;
428 return exprseq::is_equal_same_type(o);
431 unsigned function::return_type(void) const
434 return return_types::commutative;
436 return (*seq.begin()).return_type();
439 unsigned function::return_type_tinfo(void) const
444 return (*seq.begin()).return_type_tinfo();
448 // new virtual functions which can be overridden by derived classes
454 // non-virtual functions in this class
459 ex function::pdiff(unsigned diff_param) const // partial differentiation
461 ASSERT(serial<registered_functions().size());
463 if (registered_functions()[serial].d==0) {
464 throw(std::logic_error(string("function::pdiff(") + registered_functions()[serial].name + "): no diff function defined"));
466 switch (registered_functions()[serial].nparams) {
467 // the following lines have been generated for max. 10 parameters
469 return ((diff_funcp_1)(registered_functions()[serial].d))(seq[1-1],diff_param);
472 return ((diff_funcp_2)(registered_functions()[serial].d))(seq[1-1], seq[2-1],diff_param);
475 return ((diff_funcp_3)(registered_functions()[serial].d))(seq[1-1], seq[2-1], seq[3-1],diff_param);
478 return ((diff_funcp_4)(registered_functions()[serial].d))(seq[1-1], seq[2-1], seq[3-1], seq[4-1],diff_param);
481 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);
484 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);
487 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);
490 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);
493 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);
496 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);
499 // end of generated lines
501 throw(std::logic_error("function::pdiff(): no diff function defined"));
504 vector<registered_function_info> & function::registered_functions(void)
506 static vector<registered_function_info> * rf=new vector<registered_function_info>;
512 // the following lines have been generated for max. 10 parameters
513 unsigned function::register_new(char const * nm, eval_funcp_1 e,
514 evalf_funcp_1 ef, diff_funcp_1 d, series_funcp_1 s)
516 registered_function_info rfi={nm,1,0,eval_funcp(e),
517 evalf_funcp(ef),diff_funcp(d),series_funcp(s)};
518 registered_functions().push_back(rfi);
519 return registered_functions().size()-1;
521 unsigned function::register_new(char const * nm, eval_funcp_2 e,
522 evalf_funcp_2 ef, diff_funcp_2 d, series_funcp_2 s)
524 registered_function_info rfi={nm,2,0,eval_funcp(e),
525 evalf_funcp(ef),diff_funcp(d),series_funcp(s)};
526 registered_functions().push_back(rfi);
527 return registered_functions().size()-1;
529 unsigned function::register_new(char const * nm, eval_funcp_3 e,
530 evalf_funcp_3 ef, diff_funcp_3 d, series_funcp_3 s)
532 registered_function_info rfi={nm,3,0,eval_funcp(e),
533 evalf_funcp(ef),diff_funcp(d),series_funcp(s)};
534 registered_functions().push_back(rfi);
535 return registered_functions().size()-1;
537 unsigned function::register_new(char const * nm, eval_funcp_4 e,
538 evalf_funcp_4 ef, diff_funcp_4 d, series_funcp_4 s)
540 registered_function_info rfi={nm,4,0,eval_funcp(e),
541 evalf_funcp(ef),diff_funcp(d),series_funcp(s)};
542 registered_functions().push_back(rfi);
543 return registered_functions().size()-1;
545 unsigned function::register_new(char const * nm, eval_funcp_5 e,
546 evalf_funcp_5 ef, diff_funcp_5 d, series_funcp_5 s)
548 registered_function_info rfi={nm,5,0,eval_funcp(e),
549 evalf_funcp(ef),diff_funcp(d),series_funcp(s)};
550 registered_functions().push_back(rfi);
551 return registered_functions().size()-1;
553 unsigned function::register_new(char const * nm, eval_funcp_6 e,
554 evalf_funcp_6 ef, diff_funcp_6 d, series_funcp_6 s)
556 registered_function_info rfi={nm,6,0,eval_funcp(e),
557 evalf_funcp(ef),diff_funcp(d),series_funcp(s)};
558 registered_functions().push_back(rfi);
559 return registered_functions().size()-1;
561 unsigned function::register_new(char const * nm, eval_funcp_7 e,
562 evalf_funcp_7 ef, diff_funcp_7 d, series_funcp_7 s)
564 registered_function_info rfi={nm,7,0,eval_funcp(e),
565 evalf_funcp(ef),diff_funcp(d),series_funcp(s)};
566 registered_functions().push_back(rfi);
567 return registered_functions().size()-1;
569 unsigned function::register_new(char const * nm, eval_funcp_8 e,
570 evalf_funcp_8 ef, diff_funcp_8 d, series_funcp_8 s)
572 registered_function_info rfi={nm,8,0,eval_funcp(e),
573 evalf_funcp(ef),diff_funcp(d),series_funcp(s)};
574 registered_functions().push_back(rfi);
575 return registered_functions().size()-1;
577 unsigned function::register_new(char const * nm, eval_funcp_9 e,
578 evalf_funcp_9 ef, diff_funcp_9 d, series_funcp_9 s)
580 registered_function_info rfi={nm,9,0,eval_funcp(e),
581 evalf_funcp(ef),diff_funcp(d),series_funcp(s)};
582 registered_functions().push_back(rfi);
583 return registered_functions().size()-1;
585 unsigned function::register_new(char const * nm, eval_funcp_10 e,
586 evalf_funcp_10 ef, diff_funcp_10 d, series_funcp_10 s)
588 registered_function_info rfi={nm,10,0,eval_funcp(e),
589 evalf_funcp(ef),diff_funcp(d),series_funcp(s)};
590 registered_functions().push_back(rfi);
591 return registered_functions().size()-1;
594 // end of generated lines
597 // static member variables
606 const function some_function;
607 type_info const & typeid_function=typeid(some_function);