basic, expairseq: use standard C++ RTTI in compare(), is_equal(), match(), etc.
authorAlexei Sheplyakov <varg@theor.jinr.ru>
Wed, 15 Oct 2008 11:32:11 +0000 (15:32 +0400)
committerAlexei Sheplyakov <varg@theor.jinr.ru>
Sun, 19 Oct 2008 17:29:11 +0000 (21:29 +0400)
Custom RTTI considered harmful, part 2.

* basic.cpp: use standard C++ RTTI in compare(), is_equal(), operator=(),
  match().
* expairseq.cpp: use standard C++ RTTI in match(), make_flat(),
  construct_from_2_ex().

ginac/basic.cpp
ginac/expairseq.cpp

index e8c893ba26dd59a963e00fd1056daf34f4f47bf8..1f9ccbac19af540f8b3a94702ed24f405e6e58ed 100644 (file)
@@ -22,9 +22,7 @@
 
 #include <iostream>
 #include <stdexcept>
 
 #include <iostream>
 #include <stdexcept>
-#ifdef DO_GINAC_ASSERT
-#  include <typeinfo>
-#endif
+#include <typeinfo>
 
 #include "basic.h"
 #include "ex.h"
 
 #include "basic.h"
 #include "ex.h"
@@ -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;
 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.
                // 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.
@@ -569,7 +567,7 @@ bool basic::match(const ex & pattern, exmap& repl_lst) const
        } else {
 
                // Expression must be of the same type as the pattern
        } 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
                        return false;
 
                // Number of subexpressions must match
@@ -846,10 +844,9 @@ int basic::compare(const basic & other) const
        compare_statistics.compare_same_hashvalue++;
 #endif
 
        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: " 
 //             int cmpval = compare_same_type(other);
 //             if (cmpval!=0) {
 //                     std::cout << "hash collision, same type: " 
@@ -871,7 +868,7 @@ int basic::compare(const basic & other) const
 //             std::cout << " and ";
 //             other.print(print_tree(std::cout));
 //             std::cout << std::endl;
 //             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 +888,9 @@ bool basic::is_equal(const basic & other) const
 #ifdef GINAC_COMPARE_STATISTICS
        compare_statistics.is_equal_same_hashvalue++;
 #endif
 #ifdef GINAC_COMPARE_STATISTICS
        compare_statistics.is_equal_same_hashvalue++;
 #endif
-       if (this->tinfo()!=other.tinfo())
+       if (typeid(*this) != typeid(other))
                return false;
        
                return false;
        
-       GINAC_ASSERT(typeid(*this)==typeid(other));
-       
 #ifdef GINAC_COMPARE_STATISTICS
        compare_statistics.is_equal_same_type++;
 #endif
 #ifdef GINAC_COMPARE_STATISTICS
        compare_statistics.is_equal_same_type++;
 #endif
index 67aa4f8ef681bf3453eb83fecc0181076edba70e..120672f74498f3d44915ee77d71e91e48af6f1a6 100644 (file)
@@ -396,7 +396,7 @@ bool expairseq::match(const ex & pattern, exmap & repl_lst) const
        // This differs from basic::match() because we want "a+b+c+d" to
        // match "d+*+b" with "*" being "a+c", and we want to honor commutativity
 
        // This differs from basic::match() because we want "a+b+c+d" to
        // match "d+*+b" with "*" being "a+c", and we want to honor commutativity
 
-       if (this->tinfo() == ex_to<basic>(pattern).tinfo()) {
+       if (typeid(*this) == typeid(ex_to<basic>(pattern))) {
 
                // Check whether global wildcard (one that matches the "rest of the
                // expression", like "*" above) is present
 
                // Check whether global wildcard (one that matches the "rest of the
                // expression", like "*" above) is present
@@ -793,8 +793,8 @@ void expairseq::construct_from_2_ex_via_exvector(const ex &lh, const ex &rh)
 
 void expairseq::construct_from_2_ex(const ex &lh, const ex &rh)
 {
 
 void expairseq::construct_from_2_ex(const ex &lh, const ex &rh)
 {
-       if (ex_to<basic>(lh).tinfo()==this->tinfo()) {
-               if (ex_to<basic>(rh).tinfo()==this->tinfo()) {
+       if (typeid(ex_to<basic>(lh)) == typeid(*this)) {
+               if (typeid(ex_to<basic>(rh)) == typeid(*this)) {
 #if EXPAIRSEQ_USE_HASHTAB
                        unsigned totalsize = ex_to<expairseq>(lh).seq.size() +
                                             ex_to<expairseq>(rh).seq.size();
 #if EXPAIRSEQ_USE_HASHTAB
                        unsigned totalsize = ex_to<expairseq>(lh).seq.size() +
                                             ex_to<expairseq>(rh).seq.size();
@@ -828,7 +828,7 @@ void expairseq::construct_from_2_ex(const ex &lh, const ex &rh)
 #endif // EXPAIRSEQ_USE_HASHTAB
                        return;
                }
 #endif // EXPAIRSEQ_USE_HASHTAB
                        return;
                }
-       } else if (ex_to<basic>(rh).tinfo()==this->tinfo()) {
+       } else if (typeid(ex_to<basic>(rh)) == typeid(*this)) {
 #if EXPAIRSEQ_USE_HASHTAB
                unsigned totalsize=ex_to<expairseq>(rh).seq.size()+1;
                if (calc_hashtabsize(totalsize)!=0) {
 #if EXPAIRSEQ_USE_HASHTAB
                unsigned totalsize=ex_to<expairseq>(rh).seq.size()+1;
                if (calc_hashtabsize(totalsize)!=0) {
@@ -1051,7 +1051,7 @@ void expairseq::make_flat(const exvector &v)
        
        cit = v.begin();
        while (cit!=v.end()) {
        
        cit = v.begin();
        while (cit!=v.end()) {
-               if (ex_to<basic>(*cit).tinfo()==this->tinfo()) {
+               if (typeid(ex_to<basic>(*cit)) == typeid(*this)) {
                        ++nexpairseqs;
                        noperands += ex_to<expairseq>(*cit).seq.size();
                }
                        ++nexpairseqs;
                        noperands += ex_to<expairseq>(*cit).seq.size();
                }
@@ -1068,7 +1068,7 @@ void expairseq::make_flat(const exvector &v)
        make_flat_inserter mf(v, do_idx_rename);
        cit = v.begin();
        while (cit!=v.end()) {
        make_flat_inserter mf(v, do_idx_rename);
        cit = v.begin();
        while (cit!=v.end()) {
-               if (ex_to<basic>(*cit).tinfo()==this->tinfo()) {
+               if (typeid(ex_to<basic>(*cit)) == typeid(*this)) {
                        ex newfactor = mf.handle_factor(*cit, _ex1);
                        const expairseq &subseqref = ex_to<expairseq>(newfactor);
                        combine_overall_coeff(subseqref.overall_coeff);
                        ex newfactor = mf.handle_factor(*cit, _ex1);
                        const expairseq &subseqref = ex_to<expairseq>(newfactor);
                        combine_overall_coeff(subseqref.overall_coeff);
@@ -1103,7 +1103,7 @@ void expairseq::make_flat(const epvector &v, bool do_index_renaming)
        
        cit = v.begin();
        while (cit!=v.end()) {
        
        cit = v.begin();
        while (cit!=v.end()) {
-               if (ex_to<basic>(cit->rest).tinfo()==this->tinfo()) {
+               if (typeid(ex_to<basic>(cit->rest)) == typeid(*this)) {
                        ++nexpairseqs;
                        noperands += ex_to<expairseq>(cit->rest).seq.size();
                }
                        ++nexpairseqs;
                        noperands += ex_to<expairseq>(cit->rest).seq.size();
                }
@@ -1121,7 +1121,7 @@ void expairseq::make_flat(const epvector &v, bool do_index_renaming)
        // copy elements and split off numerical part
        cit = v.begin();
        while (cit!=v.end()) {
        // copy elements and split off numerical part
        cit = v.begin();
        while (cit!=v.end()) {
-               if (ex_to<basic>(cit->rest).tinfo()==this->tinfo() &&
+               if ((typeid(ex_to<basic>(cit->rest)) == typeid(*this)) &&
                    this->can_make_flat(*cit)) {
                        ex newrest = mf.handle_factor(cit->rest, cit->coeff);
                        const expairseq &subseqref = ex_to<expairseq>(newrest);
                    this->can_make_flat(*cit)) {
                        ex newrest = mf.handle_factor(cit->rest, cit->coeff);
                        const expairseq &subseqref = ex_to<expairseq>(newrest);