]> 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 3ac3c3cab9e23549b35696f951dd3e307d0df278..07e82e19d2578c73e6c10e3e9cf76caa6a60e797 100644 (file)
@@ -2,7 +2,7 @@
 
 #  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
@@ -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-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
@@ -309,16 +309,15 @@ $interface=<<END_OF_INTERFACE;
  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
-#ifndef __GINAC_FUNCTION_H__
-#define __GINAC_FUNCTION_H__
+#ifndef GINAC_FUNCTION_H
+#define GINAC_FUNCTION_H
 
-#include <string>
-#include <vector>
+#include "exprseq.h"
 
 // CINT needs <algorithm> to work properly with <vector>
 #include <algorithm>
-
-#include "exprseq.h"
+#include <string>
+#include <vector>
 
 // the following lines have been generated for max. ${maxargs} parameters
 $declare_function_macro
@@ -537,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;
 
@@ -561,7 +561,7 @@ inline bool is_the_function(const ex & x)
 
 } // namespace GiNaC
 
-#endif // ndef __GINAC_FUNCTION_H__
+#endif // ndef GINAC_FUNCTION_H
 
 END_OF_INTERFACE
 
@@ -575,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
@@ -592,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"
@@ -610,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 {
 
 //////////
@@ -1063,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();
@@ -1122,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) {
@@ -1312,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)