X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?a=blobdiff_plain;f=ginac%2Ffunction.pl;h=3ac3c3cab9e23549b35696f951dd3e307d0df278;hb=45b1e47372090352ac5af655b32473df2abab23b;hp=435434625c95cb416ba903a6d879c28779b78d2e;hpb=690cd58cc13ad5052eb5851c573984965d0c40c1;p=ginac.git diff --git a/ginac/function.pl b/ginac/function.pl old mode 100755 new mode 100644 index 43543462..3ac3c3ca --- a/ginac/function.pl +++ b/ginac/function.pl @@ -2,7 +2,7 @@ # function.pl options: \$maxargs=${maxargs} # -# GiNaC Copyright (C) 1999-2006 Johannes Gutenberg University Mainz, Germany +# GiNaC Copyright (C) 1999-2008 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 +#include #include "function.h" #include "operators.h" @@ -737,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; } @@ -809,7 +816,6 @@ GINAC_IMPLEMENT_REGISTERED_CLASS(function, exprseq) function::function() : serial(0) { - tinfo_key = &function::tinfo_static; } ////////// @@ -820,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 @@ -829,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) @@ -839,13 +843,11 @@ 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; } function::function(unsigned ser, std::auto_ptr vp) : exprseq(vp), serial(ser) { - tinfo_key = &function::tinfo_static; } ////////// @@ -853,8 +855,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)) { @@ -872,12 +875,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 { @@ -886,6 +883,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 ////////// @@ -983,7 +982,7 @@ ex function::eval(int level) const exvector v = seq; GINAC_ASSERT(is_a(opt.symtree)); int sig = canonicalize(v.begin(), ex_to(opt.symtree)); - if (sig != INT_MAX) { + if (sig != std::numeric_limits::max()) { // Something has changed while sorting arguments, more evaluations later if (sig == 0) return _ex0; @@ -1052,9 +1051,20 @@ ${evalf_switch_statement} throw(std::logic_error("function::evalf(): invalid nparams")); } +/** + * This method is defined to be in line with behaviour of function::return_type() + */ +ex function::eval_ncmul(const exvector & v) const +{ + // If this function is called then the list of arguments is non-empty + // and the first argument is non-commutative, see function::return_type() + return seq.begin()->eval_ncmul(v); +} + unsigned function::calchash() const { - unsigned v = golden_ratio_hash(golden_ratio_hash((p_int)tinfo()) ^ serial); + const void* this_tinfo = (const void*)typeid(*this).name(); + unsigned v = golden_ratio_hash(golden_ratio_hash((p_int)this_tinfo) ^ serial); for (size_t i=0; iop(i).gethash(); @@ -1245,7 +1255,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(); } @@ -1318,8 +1328,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