#include <iostream>
#include <stdexcept>
-#ifdef DO_GINAC_ASSERT
-# include <typeinfo>
-#endif
+#include <typeinfo>
#include "basic.h"
#include "ex.h"
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.
} 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
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: "
// 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);
}
}
#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
// 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
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();
#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) {
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();
}
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);
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();
}
// 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);