]> www.ginac.de Git - ginac.git/blobdiff - ginac/basic.cpp
Univariate Hensel lifting now uses upoly.
[ginac.git] / ginac / basic.cpp
index e8c893ba26dd59a963e00fd1056daf34f4f47bf8..04f87df12a94d974f12da2443f4c9e6ef37522b6 100644 (file)
@@ -22,9 +22,7 @@
 
 #include <iostream>
 #include <stdexcept>
-#ifdef DO_GINAC_ASSERT
-#  include <typeinfo>
-#endif
+#include <typeinfo>
 
 #include "basic.h"
 #include "ex.h"
@@ -57,7 +55,7 @@ GINAC_IMPLEMENT_REGISTERED_CLASS_OPT(basic, void,
 /** basic copy constructor: implicitly assumes that the other class is of
  *  the exact same type (as it's used by duplicate()), so it can copy the
  *  tinfo_key and the hash value. */
-basic::basic(const basic & other) : tinfo_key(other.tinfo_key), flags(other.flags & ~status_flags::dynallocated), hashvalue(other.hashvalue)
+basic::basic(const basic & other) : flags(other.flags & ~status_flags::dynallocated), hashvalue(other.hashvalue)
 {
 }
 
@@ -65,7 +63,7 @@ basic::basic(const basic & other) : tinfo_key(other.tinfo_key), flags(other.flag
 const basic & basic::operator=(const basic & other)
 {
        unsigned fl = other.flags & ~status_flags::dynallocated;
-       if (tinfo_key != other.tinfo_key) {
+       if (typeid(*this) != typeid(other)) {
                // The other object is of a derived class, so clear the flags as they
                // might no longer apply (especially hash_calculated). Oh, and don't
                // copy the tinfo_key: it is already set correctly for this object.
@@ -94,18 +92,8 @@ const basic & basic::operator=(const basic & other)
 //////////
 
 /** Construct object from archive_node. */
-basic::basic(const archive_node &n, lst &sym_lst) : flags(0)
-{
-       // Reconstruct tinfo_key from class name
-       std::string class_name;
-       if (n.find_string("class", class_name))
-               tinfo_key = find_tinfo_key(class_name);
-       else
-               throw (std::runtime_error("archive node contains no class name"));
-}
-
-/** Unarchive the object. */
-DEFAULT_UNARCHIVE(basic)
+void basic::read_archive(const archive_node& n, lst& syms)
+{ }
 
 /** Archive the object. */
 void basic::archive(archive_node &n) const
@@ -569,7 +557,7 @@ bool basic::match(const ex & pattern, exmap& repl_lst) const
        } else {
 
                // Expression must be of the same type as the pattern
-               if (tinfo() != ex_to<basic>(pattern).tinfo())
+               if (typeid(*this) != typeid(ex_to<basic>(pattern)))
                        return false;
 
                // Number of subexpressions must match
@@ -776,9 +764,12 @@ unsigned basic::return_type() const
        return return_types::commutative;
 }
 
-tinfo_t basic::return_type_tinfo() const
+return_type_t basic::return_type_tinfo() const
 {
-       return tinfo_key;
+       return_type_t rt;
+       rt.tinfo = &typeid(*this);
+       rt.rl = 0;
+       return rt;
 }
 
 /** Compute the hash value of an object and if it makes sense to store it in
@@ -789,7 +780,8 @@ tinfo_t basic::return_type_tinfo() const
  *  would all end up with the same hashvalue. */
 unsigned basic::calchash() const
 {
-       unsigned v = golden_ratio_hash((p_int)tinfo());
+       const void* this_tinfo = (const void*)typeid(*this).name();
+       unsigned v = golden_ratio_hash((p_int)this_tinfo);
        for (size_t i=0; i<nops(); i++) {
                v = rotate_left(v);
                v ^= this->op(i).gethash();
@@ -846,10 +838,9 @@ int basic::compare(const basic & other) const
        compare_statistics.compare_same_hashvalue++;
 #endif
 
-       const tinfo_t typeid_this = tinfo();
-       const tinfo_t typeid_other = other.tinfo();
-       if (typeid_this==typeid_other) {
-               GINAC_ASSERT(typeid(*this)==typeid(other));
+       const std::type_info& typeid_this = typeid(*this);
+       const std::type_info& typeid_other = typeid(other);
+       if (typeid_this == typeid_other) {
 //             int cmpval = compare_same_type(other);
 //             if (cmpval!=0) {
 //                     std::cout << "hash collision, same type: " 
@@ -871,7 +862,7 @@ int basic::compare(const basic & other) const
 //             std::cout << " and ";
 //             other.print(print_tree(std::cout));
 //             std::cout << std::endl;
-               return (typeid_this<typeid_other ? -1 : 1);
+               return (typeid_this.before(typeid_other) ? -1 : 1);
        }
 }
 
@@ -891,11 +882,9 @@ bool basic::is_equal(const basic & other) const
 #ifdef GINAC_COMPARE_STATISTICS
        compare_statistics.is_equal_same_hashvalue++;
 #endif
-       if (this->tinfo()!=other.tinfo())
+       if (typeid(*this) != typeid(other))
                return false;
        
-       GINAC_ASSERT(typeid(*this)==typeid(other));
-       
 #ifdef GINAC_COMPARE_STATISTICS
        compare_statistics.is_equal_same_type++;
 #endif