]> www.ginac.de Git - ginac.git/blobdiff - ginac/function.pl
calchash(): work around broken RTTI.
[ginac.git] / ginac / function.pl
index 6c70d2dd52137b26a6cb7b361e786dcc063379e8..e1533be27aba0d57cd126b8ae27cb02f719479ec 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-2009 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-2009 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
@@ -514,6 +513,8 @@ 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;
@@ -543,6 +544,7 @@ public:
 protected:
        unsigned serial;
 };
+GINAC_DECLARE_UNARCHIVER(function);
 
 // utility functions/macros
 
@@ -558,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
 
@@ -572,7 +574,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-2009 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
@@ -589,12 +591,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"
@@ -607,8 +603,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 {
 
 //////////
@@ -852,8 +855,9 @@ function::function(unsigned ser, std::auto_ptr<exvector> 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)) {
@@ -871,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
 {
@@ -885,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
 //////////
@@ -1063,8 +1063,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();