/** @file function.cpp * * Implementation of class function. * * This file was generated automatically by function.pl. * Please do not modify it directly, edit the perl script instead! * function.pl options: $maxargs=10 * * GiNaC Copyright (C) 1999 Johannes Gutenberg University Mainz, Germany * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include "function.h" #include "ex.h" ////////// // default constructor, destructor, copy constructor assignment operator and helpers ////////// // public function::function() : serial(0) { debugmsg("function default constructor",LOGLEVEL_CONSTRUCT); tinfo_key = TINFO_function; } function::~function() { debugmsg("function destructor",LOGLEVEL_DESTRUCT); destroy(0); } function::function(function const & other) { debugmsg("function copy constructor",LOGLEVEL_CONSTRUCT); copy(other); } function const & function::operator=(function const & other) { debugmsg("function operator=",LOGLEVEL_ASSIGNMENT); if (this != &other) { destroy(1); copy(other); } return *this; } // protected void function::copy(function const & other) { exprseq::copy(other); serial=other.serial; } void function::destroy(bool call_parent) { if (call_parent) exprseq::destroy(call_parent); } ////////// // other constructors ////////// // public function::function(unsigned ser) : serial(ser) { debugmsg("function constructor from unsigned",LOGLEVEL_CONSTRUCT); tinfo_key = TINFO_function; } // the following lines have been generated for max. 10 parameters function::function(unsigned ser, ex const & param1) : exprseq(param1), serial(ser) { debugmsg("function constructor from unsigned,1*ex",LOGLEVEL_CONSTRUCT); tinfo_key = TINFO_function; } function::function(unsigned ser, ex const & param1, ex const & param2) : exprseq(param1, param2), serial(ser) { debugmsg("function constructor from unsigned,2*ex",LOGLEVEL_CONSTRUCT); tinfo_key = TINFO_function; } function::function(unsigned ser, ex const & param1, ex const & param2, ex const & param3) : exprseq(param1, param2, param3), serial(ser) { debugmsg("function constructor from unsigned,3*ex",LOGLEVEL_CONSTRUCT); tinfo_key = TINFO_function; } function::function(unsigned ser, ex const & param1, ex const & param2, ex const & param3, ex const & param4) : exprseq(param1, param2, param3, param4), serial(ser) { debugmsg("function constructor from unsigned,4*ex",LOGLEVEL_CONSTRUCT); tinfo_key = TINFO_function; } function::function(unsigned ser, ex const & param1, ex const & param2, ex const & param3, ex const & param4, ex const & param5) : exprseq(param1, param2, param3, param4, param5), serial(ser) { debugmsg("function constructor from unsigned,5*ex",LOGLEVEL_CONSTRUCT); tinfo_key = TINFO_function; } function::function(unsigned ser, ex const & param1, ex const & param2, ex const & param3, ex const & param4, ex const & param5, ex const & param6) : exprseq(param1, param2, param3, param4, param5, param6), serial(ser) { debugmsg("function constructor from unsigned,6*ex",LOGLEVEL_CONSTRUCT); tinfo_key = TINFO_function; } 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) : exprseq(param1, param2, param3, param4, param5, param6, param7), serial(ser) { debugmsg("function constructor from unsigned,7*ex",LOGLEVEL_CONSTRUCT); tinfo_key = TINFO_function; } 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) : exprseq(param1, param2, param3, param4, param5, param6, param7, param8), serial(ser) { debugmsg("function constructor from unsigned,8*ex",LOGLEVEL_CONSTRUCT); tinfo_key = TINFO_function; } 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) : exprseq(param1, param2, param3, param4, param5, param6, param7, param8, param9), serial(ser) { debugmsg("function constructor from unsigned,9*ex",LOGLEVEL_CONSTRUCT); tinfo_key = TINFO_function; } 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) : exprseq(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10), serial(ser) { debugmsg("function constructor from unsigned,10*ex",LOGLEVEL_CONSTRUCT); tinfo_key = TINFO_function; } // end of generated lines function::function(unsigned ser, exprseq const & es) : exprseq(es), serial(ser) { debugmsg("function constructor from unsigned,exprseq",LOGLEVEL_CONSTRUCT); tinfo_key = TINFO_function; } function::function(unsigned ser, exvector const & v, bool discardable) : exprseq(v,discardable), serial(ser) { debugmsg("function constructor from string,exvector,bool",LOGLEVEL_CONSTRUCT); tinfo_key = TINFO_function; } function::function(unsigned ser, exvector * vp) : exprseq(vp), serial(ser) { debugmsg("function constructor from unsigned,exvector *",LOGLEVEL_CONSTRUCT); tinfo_key = TINFO_function; } ////////// // functions overriding virtual functions from bases classes ////////// // public basic * function::duplicate() const { debugmsg("function duplicate",LOGLEVEL_DUPLICATE); return new function(*this); } void function::printraw(ostream & os) const { debugmsg("function printraw",LOGLEVEL_PRINT); ASSERT(serialprint(os); } os << ")"; } void function::print(ostream & os, unsigned upper_precedence) const { debugmsg("function print",LOGLEVEL_PRINT); ASSERT(serialbp->printcsrc(os, type, 0); it++; if (it != itend) os << ","; } os << ")"; } ex function::expand(unsigned options) const { return this->setflag(status_flags::expanded); } ex function::eval(int level) const { ASSERT(serial(const_cast(other)); if (serial!=o.serial) { return serial < o.serial ? -1 : 1; } return exprseq::compare_same_type(o); } bool function::is_equal_same_type(basic const & other) const { ASSERT(is_of_type(other, function)); function const & o=static_cast(const_cast(other)); if (serial!=o.serial) return false; return exprseq::is_equal_same_type(o); } unsigned function::return_type(void) const { if (seq.size()==0) { return return_types::commutative; } return (*seq.begin()).return_type(); } unsigned function::return_type_tinfo(void) const { if (seq.size()==0) { return tinfo_key; } return (*seq.begin()).return_type_tinfo(); } ////////// // new virtual functions which can be overridden by derived classes ////////// // none ////////// // non-virtual functions in this class ////////// // protected ex function::pdiff(unsigned diff_param) const // partial differentiation { ASSERT(serial & function::registered_functions(void) { static vector * rf=new vector; return *rf; } // public // the following lines have been generated for max. 10 parameters unsigned function::register_new(char const * nm, eval_funcp_1 e, evalf_funcp_1 ef, diff_funcp_1 d, series_funcp_1 s) { registered_function_info rfi={nm,1,0,eval_funcp(e), evalf_funcp(ef),diff_funcp(d),series_funcp(s)}; registered_functions().push_back(rfi); return registered_functions().size()-1; } unsigned function::register_new(char const * nm, eval_funcp_2 e, evalf_funcp_2 ef, diff_funcp_2 d, series_funcp_2 s) { registered_function_info rfi={nm,2,0,eval_funcp(e), evalf_funcp(ef),diff_funcp(d),series_funcp(s)}; registered_functions().push_back(rfi); return registered_functions().size()-1; } unsigned function::register_new(char const * nm, eval_funcp_3 e, evalf_funcp_3 ef, diff_funcp_3 d, series_funcp_3 s) { registered_function_info rfi={nm,3,0,eval_funcp(e), evalf_funcp(ef),diff_funcp(d),series_funcp(s)}; registered_functions().push_back(rfi); return registered_functions().size()-1; } unsigned function::register_new(char const * nm, eval_funcp_4 e, evalf_funcp_4 ef, diff_funcp_4 d, series_funcp_4 s) { registered_function_info rfi={nm,4,0,eval_funcp(e), evalf_funcp(ef),diff_funcp(d),series_funcp(s)}; registered_functions().push_back(rfi); return registered_functions().size()-1; } unsigned function::register_new(char const * nm, eval_funcp_5 e, evalf_funcp_5 ef, diff_funcp_5 d, series_funcp_5 s) { registered_function_info rfi={nm,5,0,eval_funcp(e), evalf_funcp(ef),diff_funcp(d),series_funcp(s)}; registered_functions().push_back(rfi); return registered_functions().size()-1; } unsigned function::register_new(char const * nm, eval_funcp_6 e, evalf_funcp_6 ef, diff_funcp_6 d, series_funcp_6 s) { registered_function_info rfi={nm,6,0,eval_funcp(e), evalf_funcp(ef),diff_funcp(d),series_funcp(s)}; registered_functions().push_back(rfi); return registered_functions().size()-1; } unsigned function::register_new(char const * nm, eval_funcp_7 e, evalf_funcp_7 ef, diff_funcp_7 d, series_funcp_7 s) { registered_function_info rfi={nm,7,0,eval_funcp(e), evalf_funcp(ef),diff_funcp(d),series_funcp(s)}; registered_functions().push_back(rfi); return registered_functions().size()-1; } unsigned function::register_new(char const * nm, eval_funcp_8 e, evalf_funcp_8 ef, diff_funcp_8 d, series_funcp_8 s) { registered_function_info rfi={nm,8,0,eval_funcp(e), evalf_funcp(ef),diff_funcp(d),series_funcp(s)}; registered_functions().push_back(rfi); return registered_functions().size()-1; } unsigned function::register_new(char const * nm, eval_funcp_9 e, evalf_funcp_9 ef, diff_funcp_9 d, series_funcp_9 s) { registered_function_info rfi={nm,9,0,eval_funcp(e), evalf_funcp(ef),diff_funcp(d),series_funcp(s)}; registered_functions().push_back(rfi); return registered_functions().size()-1; } unsigned function::register_new(char const * nm, eval_funcp_10 e, evalf_funcp_10 ef, diff_funcp_10 d, series_funcp_10 s) { registered_function_info rfi={nm,10,0,eval_funcp(e), evalf_funcp(ef),diff_funcp(d),series_funcp(s)}; registered_functions().push_back(rfi); return registered_functions().size()-1; } // end of generated lines ////////// // static member variables ////////// // none ////////// // global constants ////////// const function some_function; type_info const & typeid_function=typeid(some_function);