X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginac%2Findexed.cpp;h=edbc730037e9f10036e8fbadea2462af57bb85f0;hp=412aad52d9184206e34523beb75d494aa96fd6da;hb=8dc09f48182574d792a2ed7c37b66831d9267a6c;hpb=b4be7b0f30fbb6178cf4ee83e1b3952e084bd8ca diff --git a/ginac/indexed.cpp b/ginac/indexed.cpp index 412aad52..edbc7300 100644 --- a/ginac/indexed.cpp +++ b/ginac/indexed.cpp @@ -39,7 +39,10 @@ namespace GiNaC { -GINAC_IMPLEMENT_REGISTERED_CLASS(indexed, exprseq) +GINAC_IMPLEMENT_REGISTERED_CLASS_OPT(indexed, exprseq, + print_func(&indexed::do_print). + print_func(&indexed::do_print_latex). + print_func(&indexed::do_print_tree)) ////////// // default constructor @@ -126,7 +129,7 @@ indexed::indexed(const symmetry & symm, const exvector & v, bool discardable) : tinfo_key = TINFO_indexed; } -indexed::indexed(const symmetry & symm, exvector * vp) : inherited(vp), symtree(symm) +indexed::indexed(const symmetry & symm, std::auto_ptr vp) : inherited(vp), symtree(symm) { tinfo_key = TINFO_indexed; } @@ -168,38 +171,80 @@ DEFAULT_UNARCHIVE(indexed) // functions overriding virtual functions from base classes ////////// -void indexed::print(const print_context & c, unsigned level) const +void indexed::printindices(const print_context & c, unsigned level) const { - GINAC_ASSERT(seq.size() > 0); - - if (is_a(c)) { + if (seq.size() > 1) { - c.s << std::string(level, ' ') << class_name() - << std::hex << ", hash=0x" << hashvalue << ", flags=0x" << flags << std::dec - << ", " << seq.size()-1 << " indices" - << ", symmetry=" << symtree << std::endl; - unsigned delta_indent = static_cast(c).delta_indent; - seq[0].print(c, level + delta_indent); - printindices(c, level + delta_indent); + exvector::const_iterator it=seq.begin() + 1, itend = seq.end(); - } else { + if (is_a(c)) { - bool is_tex = is_a(c); - const ex & base = seq[0]; + // TeX output: group by variance + bool first = true; + bool covariant = true; - if (precedence() <= level) - c.s << (is_tex ? "{(" : "("); - if (is_tex) - c.s << "{"; - base.print(c, precedence()); - if (is_tex) + while (it != itend) { + bool cur_covariant = (is_a(*it) ? ex_to(*it).is_covariant() : true); + if (first || cur_covariant != covariant) { // Variance changed + // The empty {} prevents indices from ending up on top of each other + if (!first) + c.s << "}{}"; + covariant = cur_covariant; + if (covariant) + c.s << "_{"; + else + c.s << "^{"; + } + it->print(c, level); + c.s << " "; + first = false; + it++; + } c.s << "}"; - printindices(c, level); - if (precedence() <= level) - c.s << (is_tex ? ")}" : ")"); + + } else { + + // Ordinary output + while (it != itend) { + it->print(c, level); + it++; + } + } } } +void indexed::print_indexed(const print_context & c, const char *openbrace, const char *closebrace, unsigned level) const +{ + if (precedence() <= level) + c.s << openbrace << '('; + c.s << openbrace; + seq[0].print(c, precedence()); + c.s << closebrace; + printindices(c, level); + if (precedence() <= level) + c.s << ')' << closebrace; +} + +void indexed::do_print(const print_context & c, unsigned level) const +{ + print_indexed(c, "", "", level); +} + +void indexed::do_print_latex(const print_latex & c, unsigned level) const +{ + print_indexed(c, "{", "}", level); +} + +void indexed::do_print_tree(const print_tree & c, unsigned level) const +{ + c.s << std::string(level, ' ') << class_name() << " @" << this + << std::hex << ", hash=0x" << hashvalue << ", flags=0x" << flags << std::dec + << ", " << seq.size()-1 << " indices" + << ", symmetry=" << symtree << std::endl; + seq[0].print(c, level + c.delta_indent); + printindices(c, level + c.delta_indent); +} + bool indexed::info(unsigned inf) const { if (inf == info_flags::indexed) return true; @@ -271,7 +316,7 @@ ex indexed::thiscontainer(const exvector & v) const return indexed(ex_to(symtree), v); } -ex indexed::thiscontainer(exvector * vp) const +ex indexed::thiscontainer(std::auto_ptr vp) const { return indexed(ex_to(symtree), vp); } @@ -306,48 +351,6 @@ ex indexed::expand(unsigned options) const // non-virtual functions in this class ////////// -void indexed::printindices(const print_context & c, unsigned level) const -{ - if (seq.size() > 1) { - - exvector::const_iterator it=seq.begin() + 1, itend = seq.end(); - - if (is_a(c)) { - - // TeX output: group by variance - bool first = true; - bool covariant = true; - - while (it != itend) { - bool cur_covariant = (is_a(*it) ? ex_to(*it).is_covariant() : true); - if (first || cur_covariant != covariant) { // Variance changed - // The empty {} prevents indices from ending up on top of each other - if (!first) - c.s << "}{}"; - covariant = cur_covariant; - if (covariant) - c.s << "_{"; - else - c.s << "^{"; - } - it->print(c, level); - c.s << " "; - first = false; - it++; - } - c.s << "}"; - - } else { - - // Ordinary output - while (it != itend) { - it->print(c, level); - it++; - } - } - } -} - /** Check whether all indices are of class idx and validate the symmetry * tree. This function is used internally to make sure that all constructed * indexed objects really carry indices and not some other classes. */ @@ -1105,7 +1108,7 @@ ex simplify_indexed(const ex & e, exvector & free_indices, exvector & dummy_indi * the free indices in sums are consistent. * * @return simplified expression */ -ex ex::simplify_indexed() const +ex ex::simplify_indexed(unsigned options) const { exvector free_indices, dummy_indices; scalar_products sp; @@ -1119,7 +1122,7 @@ ex ex::simplify_indexed() const * * @param sp Scalar products to be replaced automatically * @return simplified expression */ -ex ex::simplify_indexed(const scalar_products & sp) const +ex ex::simplify_indexed(const scalar_products & sp, unsigned options) const { exvector free_indices, dummy_indices; return GiNaC::simplify_indexed(*this, free_indices, dummy_indices, sp);