X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginac%2Fidx.cpp;h=73af6aac1333e588b6b05bcc5b7e9bdf3c19c37c;hp=21424a88a28c750a1d5c699ca6f20061b4fca05c;hb=7e68cf1c0515b0397a49a13f2f08decae7509af1;hpb=695f6ae955ec530cded8f21efd5569df39447f76 diff --git a/ginac/idx.cpp b/ginac/idx.cpp index 21424a88..73af6aac 100644 --- a/ginac/idx.cpp +++ b/ginac/idx.cpp @@ -3,7 +3,7 @@ * Implementation of GiNaC's indices. */ /* - * GiNaC Copyright (C) 1999-2005 Johannes Gutenberg University Mainz, Germany + * GiNaC Copyright (C) 1999-2006 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 @@ -17,7 +17,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include @@ -53,23 +53,23 @@ GINAC_IMPLEMENT_REGISTERED_CLASS_OPT(spinidx, varidx, // default constructor ////////// -idx::idx() : inherited(TINFO_idx) {} +idx::idx() : inherited(&idx::tinfo_static) {} varidx::varidx() : covariant(false) { - tinfo_key = TINFO_varidx; + tinfo_key = &varidx::tinfo_static; } spinidx::spinidx() : dotted(false) { - tinfo_key = TINFO_spinidx; + tinfo_key = &spinidx::tinfo_static; } ////////// // other constructors ////////// -idx::idx(const ex & v, const ex & d) : inherited(TINFO_idx), value(v), dim(d) +idx::idx(const ex & v, const ex & d) : inherited(&idx::tinfo_static), value(v), dim(d) { if (is_dim_numeric()) if (!dim.info(info_flags::posint)) @@ -78,12 +78,12 @@ idx::idx(const ex & v, const ex & d) : inherited(TINFO_idx), value(v), dim(d) varidx::varidx(const ex & v, const ex & d, bool cov) : inherited(v, d), covariant(cov) { - tinfo_key = TINFO_varidx; + tinfo_key = &varidx::tinfo_static; } spinidx::spinidx(const ex & v, const ex & d, bool cov, bool dot) : inherited(v, d, cov), dotted(dot) { - tinfo_key = TINFO_spinidx; + tinfo_key = &spinidx::tinfo_static; } ////////// @@ -338,7 +338,7 @@ unsigned idx::calchash() const // hash keys. That is, the hash values must not depend on the index // dimensions or other attributes (variance etc.). // The compare_same_type() methods will take care of the rest. - unsigned v = golden_ratio_hash(tinfo()); + unsigned v = golden_ratio_hash((p_int)tinfo()); v = rotate_left(v); v ^= value.gethash(); @@ -365,7 +365,7 @@ ex idx::subs(const exmap & m, unsigned options) const if (it != m.end()) { // Substitution index->index - if (is_a(it->second)) + if (is_a(it->second) || (options & subs_options::really_subs_idx)) return it->second; // Otherwise substitute value @@ -415,7 +415,7 @@ bool idx::is_dummy_pair_same_type(const basic & other) const if (dim.is_equal(o.dim)) return true; - return (dim < o.dim || dim > o.dim || (is_exactly_a(dim) && is_a(o.dim)) || (is_a(dim) && is_exactly_a(o.dim))); + return is_exactly_a(dim) || is_exactly_a(o.dim); } bool varidx::is_dummy_pair_same_type(const basic & other) const @@ -548,9 +548,9 @@ void find_free_and_dummy(exvector::const_iterator it, exvector::const_iterator i ex minimal_dim(const ex & dim1, const ex & dim2) { - if (dim1.is_equal(dim2) || dim1 < dim2 || (is_exactly_a(dim1) && is_a(dim2))) + if (dim1.is_equal(dim2) || dim1 < dim2 || (is_exactly_a(dim1) && !is_a(dim2))) return dim1; - else if (dim1 > dim2 || (is_a(dim1) && is_exactly_a(dim2))) + else if (dim1 > dim2 || (!is_a(dim1) && is_exactly_a(dim2))) return dim2; else { std::ostringstream s;