X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginac%2Ffunction.pl;h=d4a03cec8289f94e09177eebb056ef5ef903cdc2;hp=3e447354d814d87c1a04e71f2f71e99c4e6106e3;hb=ab1aedf73a5d062bf50ed1e740f38a4503d7fead;hpb=26c31eb89fe38c4d232f90b62c8acbeaaa0454f4 diff --git a/ginac/function.pl b/ginac/function.pl index 3e447354..d4a03cec 100644 --- a/ginac/function.pl +++ b/ginac/function.pl @@ -2,7 +2,7 @@ # function.pl options: \$maxargs=${maxargs} # -# GiNaC Copyright (C) 1999-2008 Johannes Gutenberg University Mainz, Germany +# GiNaC Copyright (C) 1999-2011 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 @@ -138,7 +138,6 @@ $constructors_implementation=generate( function::function(unsigned ser, ${SEQ1}) : exprseq(${SEQ2}), serial(ser) { - tinfo_key = &function::tinfo_static; } END_OF_CONSTRUCTORS_IMPLEMENTATION @@ -293,7 +292,7 @@ $interface=< -#include +#include "exprseq.h" // CINT needs to work properly with #include - -#include "exprseq.h" +#include +#include // the following lines have been generated for max. ${maxargs} parameters $declare_function_macro @@ -410,7 +408,7 @@ $print_func_interface return *this; } - function_options & set_return_type(unsigned rt, tinfo_t rtt=NULL); + function_options & set_return_type(unsigned rt, const return_type_t* rtt = 0); function_options & do_not_evalf_params(); function_options & remember(unsigned size, unsigned assoc_size=0, unsigned strategy=remember_strategies::delete_never); @@ -445,7 +443,7 @@ protected: bool use_return_type; unsigned return_type; - tinfo_t return_type_tinfo; + return_type_t return_type_tinfo; bool use_remember; unsigned remember_size; @@ -515,12 +513,14 @@ public: ex conjugate() const; ex real_part() const; ex imag_part() const; + void archive(archive_node& n) const; + void read_archive(const archive_node& n, lst& syms); protected: ex derivative(const symbol & s) const; bool is_equal_same_type(const basic & other) const; bool match_same_type(const basic & other) const; unsigned return_type() const; - tinfo_t return_type_tinfo() const; + return_type_t return_type_tinfo() const; // new virtual functions which can be overridden by derived classes // none @@ -544,6 +544,7 @@ public: protected: unsigned serial; }; +GINAC_DECLARE_UNARCHIVER(function); // utility functions/macros @@ -559,7 +560,7 @@ inline bool is_the_function(const ex & x) } // namespace GiNaC -#endif // ndef __GINAC_FUNCTION_H__ +#endif // ndef GINAC_FUNCTION_H END_OF_INTERFACE @@ -573,7 +574,7 @@ $implementation=< -#include -#include -#include -#include - #include "function.h" #include "operators.h" #include "fderivative.h" @@ -608,8 +603,15 @@ $implementation=< +#include +#include +#include +#include + namespace GiNaC { ////////// @@ -739,11 +741,14 @@ function_options& function_options::series_func(series_funcp_exvector s) return *this; } -function_options & function_options::set_return_type(unsigned rt, tinfo_t rtt) +function_options & function_options::set_return_type(unsigned rt, const return_type_t* rtt) { use_return_type = true; return_type = rt; - return_type_tinfo = rtt; + if (rtt != 0) + return_type_tinfo = *rtt; + else + return_type_tinfo = make_return_type_t(); return *this; } @@ -811,7 +816,6 @@ GINAC_IMPLEMENT_REGISTERED_CLASS(function, exprseq) function::function() : serial(0) { - tinfo_key = &function::tinfo_static; } ////////// @@ -822,7 +826,6 @@ function::function() : serial(0) function::function(unsigned ser) : serial(ser) { - tinfo_key = &function::tinfo_static; } // the following lines have been generated for max. ${maxargs} parameters @@ -831,7 +834,6 @@ $constructors_implementation function::function(unsigned ser, const exprseq & es) : exprseq(es), serial(ser) { - tinfo_key = &function::tinfo_static; // Force re-evaluation even if the exprseq was already evaluated // (the exprseq copy constructor copies the flags) @@ -841,13 +843,14 @@ function::function(unsigned ser, const exprseq & es) : exprseq(es), serial(ser) function::function(unsigned ser, const exvector & v, bool discardable) : exprseq(v,discardable), serial(ser) { - tinfo_key = &function::tinfo_static; + if ( ser >= registered_functions().size() ) { + throw std::runtime_error("function does not exist"); + } } function::function(unsigned ser, std::auto_ptr vp) : exprseq(vp), serial(ser) { - tinfo_key = &function::tinfo_static; } ////////// @@ -855,8 +858,9 @@ function::function(unsigned ser, std::auto_ptr vp) ////////// /** Construct object from archive_node. */ -function::function(const archive_node &n, lst &sym_lst) : inherited(n, sym_lst) +void function::read_archive(const archive_node& n, lst& sym_lst) { + inherited::read_archive(n, sym_lst); // Find serial number by function name std::string s; if (n.find_string("name", s)) { @@ -874,12 +878,6 @@ function::function(const archive_node &n, lst &sym_lst) : inherited(n, sym_lst) throw (std::runtime_error("unnamed function in archive")); } -/** Unarchive the object. */ -ex function::unarchive(const archive_node &n, lst &sym_lst) -{ - return (new function(n, sym_lst))->setflag(status_flags::dynallocated); -} - /** Archive the object. */ void function::archive(archive_node &n) const { @@ -888,6 +886,8 @@ void function::archive(archive_node &n) const n.add_string("name", registered_functions()[serial].name); } +GINAC_BIND_UNARCHIVER(function); + ////////// // functions overriding virtual functions from base classes ////////// @@ -1066,7 +1066,7 @@ ex function::eval_ncmul(const exvector & v) const unsigned function::calchash() const { - unsigned v = golden_ratio_hash(golden_ratio_hash((p_int)tinfo()) ^ serial); + unsigned v = golden_ratio_hash(make_hash_seed(typeid(*this)) ^ serial); for (size_t i=0; iop(i).gethash(); @@ -1124,7 +1124,7 @@ ex function::conjugate() const const function_options & opt = registered_functions()[serial]; if (opt.conjugate_f==0) { - return exprseq::conjugate(); + return conjugate_function(*this).hold(); } if (opt.conjugate_use_exvector_args) { @@ -1257,7 +1257,7 @@ unsigned function::return_type() const } } -tinfo_t function::return_type_tinfo() const +return_type_t function::return_type_tinfo() const { GINAC_ASSERT(serial(); else return seq.begin()->return_type_tinfo(); } @@ -1314,8 +1314,8 @@ ex function::power(const ex & power_param) const // power of function // No derivative defined? Then return abstract derivative object if (opt.power_f == NULL) - return (new power::power(*this, power_param))->setflag(status_flags::dynallocated | - status_flags::evaluated); + return (new GiNaC::power(*this, power_param))->setflag(status_flags::dynallocated | + status_flags::evaluated); current_serial = serial; if (opt.power_use_exvector_args) @@ -1330,8 +1330,8 @@ ${power_switch_statement} std::vector & function::registered_functions() { - static std::vector * rf = new std::vector; - return *rf; + static std::vector rf = std::vector(); + return rf; } bool function::lookup_remember_table(ex & result) const @@ -1391,7 +1391,9 @@ unsigned function::find_function(const std::string &name, unsigned nparams) /** Return the print name of the function. */ std::string function::get_name() const { - GINAC_ASSERT(serial= registered_functions().size() ) { + throw std::runtime_error("unknown function"); + } return registered_functions()[serial].name; }