]> www.ginac.de Git - ginac.git/blobdiff - ginac/function.pl
ncmul::eval(): don't write beyond the end of the vector.
[ginac.git] / ginac / function.pl
index dba4b3e0ba155fb4c9920882b8f615ad53a3db68..07e82e19d2578c73e6c10e3e9cf76caa6a60e797 100644 (file)
@@ -2,7 +2,7 @@
 
 #  function.pl options: \$maxargs=${maxargs}
 # 
-#  GiNaC Copyright (C) 1999-2009 Johannes Gutenberg University Mainz, Germany
+#  GiNaC Copyright (C) 1999-2010 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
@@ -292,7 +292,7 @@ $interface=<<END_OF_INTERFACE;
  *  Please do not modify it directly, edit the perl script instead!
  *  function.pl options: \$maxargs=${maxargs}
  *
- *  GiNaC Copyright (C) 1999-2009 Johannes Gutenberg University Mainz, Germany
+ *  GiNaC Copyright (C) 1999-2010 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
@@ -536,6 +536,7 @@ public:
        static unsigned register_new(function_options const & opt);
        static unsigned current_serial;
        static unsigned find_function(const std::string &name, unsigned nparams);
+       static std::vector<function_options> get_registered_functions() { return registered_functions(); };
        unsigned get_serial() const {return serial;}
        std::string get_name() const;
 
@@ -574,7 +575,7 @@ $implementation=<<END_OF_IMPLEMENTATION;
  *  Please do not modify it directly, edit the perl script instead!
  *  function.pl options: \$maxargs=${maxargs}
  *
- *  GiNaC Copyright (C) 1999-2008 Johannes Gutenberg University Mainz, Germany
+ *  GiNaC Copyright (C) 1999-2010 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
@@ -591,12 +592,6 @@ $implementation=<<END_OF_IMPLEMENTATION;
  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
-#include <iostream>
-#include <string>
-#include <stdexcept>
-#include <list>
-#include <limits>
-
 #include "function.h"
 #include "operators.h"
 #include "fderivative.h"
@@ -609,8 +604,15 @@ $implementation=<<END_OF_IMPLEMENTATION;
 #include "inifcns.h"
 #include "tostring.h"
 #include "utils.h"
+#include "hash_seed.h"
 #include "remember.h"
 
+#include <iostream>
+#include <limits>
+#include <list>
+#include <stdexcept>
+#include <string>
+
 namespace GiNaC {
 
 //////////
@@ -1062,8 +1064,7 @@ ex function::eval_ncmul(const exvector & v) const
 
 unsigned function::calchash() const
 {
-       const void* this_tinfo = (const void*)typeid(*this).name();
-       unsigned v = golden_ratio_hash(golden_ratio_hash((p_int)this_tinfo) ^ serial);
+       unsigned v = golden_ratio_hash(make_hash_seed(typeid(*this)) ^ serial);
        for (size_t i=0; i<nops(); i++) {
                v = rotate_left(v);
                v ^= this->op(i).gethash();
@@ -1121,7 +1122,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) {
@@ -1311,8 +1312,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)