]> www.ginac.de Git - ginac.git/blobdiff - ginac/symmetry.cpp
calchash(): work around broken RTTI.
[ginac.git] / ginac / symmetry.cpp
index 215a48a08d78ae88ea8cee7052490eb2a72f85b3..9e00a8c843633fdfece0c0ab9715343a9ddd7e02 100644 (file)
@@ -3,7 +3,7 @@
  *  Implementation of GiNaC's symmetry definitions. */
 
 /*
- *  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
  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
-#include <iostream>
-#include <stdexcept>
-#include <functional>
-#include <limits>
-
 #include "symmetry.h"
 #include "lst.h"
 #include "numeric.h" // for factorial()
 #include "operators.h"
 #include "archive.h"
 #include "utils.h"
+#include "hash_seed.h"
+
+#include <functional>
+#include <iostream>
+#include <limits>
+#include <stdexcept>
 
 namespace GiNaC {
 
@@ -56,7 +57,7 @@ GINAC_IMPLEMENT_REGISTERED_CLASS_OPT(symmetry, basic,
 // default constructor
 //////////
 
-symmetry::symmetry() : inherited(&symmetry::tinfo_static), type(none)
+symmetry::symmetry() :  type(none)
 {
        setflag(status_flags::evaluated | status_flags::expanded);
 }
@@ -65,13 +66,13 @@ symmetry::symmetry() : inherited(&symmetry::tinfo_static), type(none)
 // other constructors
 //////////
 
-symmetry::symmetry(unsigned i) : inherited(&symmetry::tinfo_static), type(none)
+symmetry::symmetry(unsigned i) :  type(none)
 {
        indices.insert(i);
        setflag(status_flags::evaluated | status_flags::expanded);
 }
 
-symmetry::symmetry(symmetry_type t, const symmetry &c1, const symmetry &c2) : inherited(&symmetry::tinfo_static), type(t)
+symmetry::symmetry(symmetry_type t, const symmetry &c1, const symmetry &c2) :  type(t)
 {
        add(c1); add(c2);
        setflag(status_flags::evaluated | status_flags::expanded);
@@ -82,8 +83,9 @@ symmetry::symmetry(symmetry_type t, const symmetry &c1, const symmetry &c2) : in
 //////////
 
 /** Construct object from archive_node. */
-symmetry::symmetry(const archive_node &n, lst &sym_lst) : inherited(n, sym_lst)
+void symmetry::read_archive(const archive_node &n, lst &sym_lst)
 {
+       inherited::read_archive(n, sym_lst);
        unsigned t;
        if (!(n.find_unsigned("type", t)))
                throw (std::runtime_error("unknown symmetry type in archive"));
@@ -110,6 +112,7 @@ symmetry::symmetry(const archive_node &n, lst &sym_lst) : inherited(n, sym_lst)
                }
        }
 }
+GINAC_BIND_UNARCHIVER(symmetry);
 
 /** Archive the object. */
 void symmetry::archive(archive_node &n) const
@@ -133,8 +136,6 @@ void symmetry::archive(archive_node &n) const
        }
 }
 
-DEFAULT_UNARCHIVE(symmetry)
-
 //////////
 // functions overriding virtual functions from base classes
 //////////
@@ -185,7 +186,7 @@ int symmetry::compare_same_type(const basic & other) const
 
 unsigned symmetry::calchash() const
 {
-       unsigned v = golden_ratio_hash((p_int)tinfo());
+       unsigned v = make_hash_seed(typeid(*this));
 
        if (type == none) {
                v = rotate_left(v);