]> www.ginac.de Git - ginac.git/blobdiff - ginac/indexed.cpp
* New funny timing added: compute an antipode in Yukawa theory.
[ginac.git] / ginac / indexed.cpp
index 4eeb2db13600980050b2d7f7c91159e9e0044511..9456f38cf829ba0eec4b2b6ecce89ce754333818 100644 (file)
@@ -3,7 +3,7 @@
  *  Implementation of GiNaC's index carrying objects. */
 
 /*
- *  GiNaC Copyright (C) 1999-2000 Johannes Gutenberg University Mainz, Germany
+ *  GiNaC Copyright (C) 1999-2001 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
@@ -27,9 +27,7 @@
 #include "idx.h"
 #include "debugmsg.h"
 
-#ifndef NO_GINAC_NAMESPACE
 namespace GiNaC {
-#endif // ndef NO_GINAC_NAMESPACE
 
 GINAC_IMPLEMENT_REGISTERED_CLASS(indexed, exprseq)
 
@@ -41,44 +39,22 @@ GINAC_IMPLEMENT_REGISTERED_CLASS(indexed, exprseq)
 
 indexed::indexed()
 {
-    debugmsg("indexed default constructor",LOGLEVEL_CONSTRUCT);
-    tinfo_key=TINFO_indexed;
-}
-
-indexed::~indexed()
-{
-    debugmsg("indexed destructor",LOGLEVEL_DESTRUCT);
-    destroy(0);
-}
-
-indexed::indexed(indexed const & other)
-{
-    debugmsg("indexed copy constructor",LOGLEVEL_CONSTRUCT);
-    copy (other);
-}
-
-indexed const & indexed::operator=(indexed const & other)
-{
-    debugmsg("indexed operator=",LOGLEVEL_ASSIGNMENT);
-    if (this != &other) {
-        destroy(1);
-        copy(other);
-    }
-    return *this;
+       debugmsg("indexed default constructor",LOGLEVEL_CONSTRUCT);
+       tinfo_key=TINFO_indexed;
 }
 
 // protected
 
-void indexed::copy(indexed const & other)
+void indexed::copy(const indexed & other)
 {
-    inherited::copy(other);
+       inherited::copy(other);
 }
 
 void indexed::destroy(bool call_parent)
 {
-    if (call_parent) {
-        inherited::destroy(call_parent);
-    }
+       if (call_parent) {
+               inherited::destroy(call_parent);
+       }
 }
 
 //////////
@@ -87,48 +63,79 @@ void indexed::destroy(bool call_parent)
 
 // public
 
-indexed::indexed(ex const & i1) : inherited(i1)
+/** Construct indexed object with one index. The index must be of class idx
+ *  or a subclass.
+ *
+ *  @param i1 The index
+ *  @return newly constructed indexed object */
+indexed::indexed(const ex & i1) : inherited(i1)
 {
-    debugmsg("indexed constructor from ex",LOGLEVEL_CONSTRUCT);
-    tinfo_key=TINFO_indexed;
-    GINAC_ASSERT(all_of_type_idx());
+       debugmsg("indexed constructor from ex",LOGLEVEL_CONSTRUCT);
+       tinfo_key=TINFO_indexed;
+       GINAC_ASSERT(all_of_type_idx());
 }
 
-indexed::indexed(ex const & i1, ex const & i2) : inherited(i1,i2)
+/** Construct indexed object with two indices. The indices must be of class
+ *  idx or a subclass.
+ *
+ *  @param i1 First index
+ *  @param i2 Second index
+ *  @return newly constructed indexed object */
+indexed::indexed(const ex & i1, const ex & i2) : inherited(i1,i2)
 {
-    debugmsg("indexed constructor from ex,ex",LOGLEVEL_CONSTRUCT);
-    tinfo_key=TINFO_indexed;
-    GINAC_ASSERT(all_of_type_idx());
+       debugmsg("indexed constructor from ex,ex",LOGLEVEL_CONSTRUCT);
+       tinfo_key=TINFO_indexed;
+       GINAC_ASSERT(all_of_type_idx());
 }
 
-indexed::indexed(ex const & i1, ex const & i2, ex const & i3)
-    : inherited(i1,i2,i3)
+/** Construct indexed object with three indices. The indices must be of class
+ *  idx or a subclass.
+ *
+ *  @param i1 First index
+ *  @param i2 Second index
+ *  @param i3 Third index
+ *  @return newly constructed indexed object */
+indexed::indexed(const ex & i1, const ex & i2, const ex & i3)
+  : inherited(i1,i2,i3)
 {
-    debugmsg("indexed constructor from ex,ex,ex",LOGLEVEL_CONSTRUCT);
-    tinfo_key=TINFO_indexed;
-    GINAC_ASSERT(all_of_type_idx());
+       debugmsg("indexed constructor from ex,ex,ex",LOGLEVEL_CONSTRUCT);
+       tinfo_key=TINFO_indexed;
+       GINAC_ASSERT(all_of_type_idx());
 }
 
-indexed::indexed(ex const & i1, ex const & i2, ex const & i3, ex const & i4)
-    : inherited(i1,i2,i3,i4)
+/** Construct indexed object with four indices. The indices must be of class
+ *  idx or a subclass.
+ *
+ *  @param i1 First index
+ *  @param i2 Second index
+ *  @param i3 Third index
+ *  @param i4 Fourth index
+ *  @return newly constructed indexed object */
+indexed::indexed(const ex & i1, const ex & i2, const ex & i3, const ex & i4)
+  : inherited(i1,i2,i3,i4)
 {
-    debugmsg("indexed constructor from ex,ex,ex,ex",LOGLEVEL_CONSTRUCT);
-    tinfo_key=TINFO_indexed;
-    GINAC_ASSERT(all_of_type_idx());
+       debugmsg("indexed constructor from ex,ex,ex,ex",LOGLEVEL_CONSTRUCT);
+       tinfo_key=TINFO_indexed;
+       GINAC_ASSERT(all_of_type_idx());
 }
 
-indexed::indexed(exvector const & iv) : inherited(iv)
+/** Construct indexed object with a specified vector of indices. The indices
+ *  must be of class idx or a subclass.
+ *
+ *  @param iv Vector of indices
+ *  @return newly constructed indexed object */
+indexed::indexed(const exvector & iv) : inherited(iv)
 {
-    debugmsg("indexed constructor from exvector",LOGLEVEL_CONSTRUCT);
-    tinfo_key=TINFO_indexed;
-    GINAC_ASSERT(all_of_type_idx());
+       debugmsg("indexed constructor from exvector",LOGLEVEL_CONSTRUCT);
+       tinfo_key=TINFO_indexed;
+       GINAC_ASSERT(all_of_type_idx());
 }
 
 indexed::indexed(exvector * ivp) : inherited(ivp)
 {
-    debugmsg("indexed constructor from exvector *",LOGLEVEL_CONSTRUCT);
-    tinfo_key=TINFO_indexed;
-    GINAC_ASSERT(all_of_type_idx());
+       debugmsg("indexed constructor from exvector *",LOGLEVEL_CONSTRUCT);
+       tinfo_key=TINFO_indexed;
+       GINAC_ASSERT(all_of_type_idx());
 }
 
 //////////
@@ -138,19 +145,20 @@ indexed::indexed(exvector * ivp) : inherited(ivp)
 /** Construct object from archive_node. */
 indexed::indexed(const archive_node &n, const lst &sym_lst) : inherited(n, sym_lst)
 {
-    debugmsg("indexed constructor from archive_node", LOGLEVEL_CONSTRUCT);
+       debugmsg("indexed constructor from archive_node", LOGLEVEL_CONSTRUCT);
+       tinfo_key = TINFO_indexed;
 }
 
 /** Unarchive the object. */
 ex indexed::unarchive(const archive_node &n, const lst &sym_lst)
 {
-    return (new indexed(n, sym_lst))->setflag(status_flags::dynallocated);
+       return (new indexed(n, sym_lst))->setflag(status_flags::dynallocated);
 }
 
 /** Archive the object. */
 void indexed::archive(archive_node &n) const
 {
-    inherited::archive(n);
+       inherited::archive(n);
 }
 
 //////////
@@ -159,97 +167,82 @@ void indexed::archive(archive_node &n) const
 
 // public
 
-basic * indexed::duplicate() const
-{
-    debugmsg("indexed duplicate",LOGLEVEL_DUPLICATE);
-    return new indexed(*this);
-}
-
-void indexed::printraw(ostream & os) const
+void indexed::printraw(std::ostream & os) const
 {
-    debugmsg("indexed printraw",LOGLEVEL_PRINT);
-    os << "indexed(indices=";
-    printrawindices(os);
-    os << ",hash=" << hashvalue << ",flags=" << flags << ")";
+       debugmsg("indexed printraw",LOGLEVEL_PRINT);
+       os << "indexed(indices=";
+       printrawindices(os);
+       os << ",hash=" << hashvalue << ",flags=" << flags << ")";
 }
 
-void indexed::printtree(ostream & os, unsigned indent) const
+void indexed::printtree(std::ostream & os, unsigned indent) const
 {
-    debugmsg("indexed printtree",LOGLEVEL_PRINT);
-    os << string(indent,' ') << "indexed: " << seq.size() << " indices";
-    os << ",hash=" << hashvalue << ",flags=" << flags << endl;
-    printtreeindices(os,indent);
+       debugmsg("indexed printtree",LOGLEVEL_PRINT);
+       os << std::string(indent,' ') << "indexed: " << seq.size() << " indices";
+       os << ",hash=" << hashvalue << ",flags=" << flags << std::endl;
+       printtreeindices(os,indent);
 }
 
-void indexed::print(ostream & os, unsigned upper_precedence) const
+void indexed::print(std::ostream & os, unsigned upper_precedence) const
 {
-    debugmsg("indexed print",LOGLEVEL_PRINT);
-    os << "UNNAMEDINDEX";
-    printindices(os);
+       debugmsg("indexed print",LOGLEVEL_PRINT);
+       os << "UNNAMEDINDEX";
+       printindices(os);
 }
 
-void indexed::printcsrc(ostream & os, unsigned type,
+void indexed::printcsrc(std::ostream & os, unsigned type,
                         unsigned upper_precedence) const
 {
-    debugmsg("indexed print csrc",LOGLEVEL_PRINT);
-    print(os,upper_precedence);
+       debugmsg("indexed print csrc",LOGLEVEL_PRINT);
+       print(os,upper_precedence);
 }
 
 bool indexed::info(unsigned inf) const
 {
-    if (inf==info_flags::indexed) return true;
-    if (inf==info_flags::has_indices) return seq.size()!=0;
-    return inherited::info(inf);
+       if (inf==info_flags::indexed) return true;
+       if (inf==info_flags::has_indices) return seq.size()!=0;
+       return inherited::info(inf);
 }
 
-exvector indexed::get_indices(void) const
+// protected
+
+/** Implementation of ex::diff() for an indexed object. It always returns 0.
+ *  @see ex::diff */
+ex indexed::derivative(const symbol & s) const
 {
-    return seq;
-
-    /*
-    idxvector filtered_indices;
-    filtered_indices.reserve(indices.size());
-    for (idxvector::const_iterator cit=indices.begin(); cit!=indices.end(); ++cit) {
-        if ((*cit).get_type()==t) {
-            filtered_indices.push_back(*cit);
-        }
-    }
-    return filtered_indices;
-    */
+       return _ex0();
 }
 
-// protected
-
-int indexed::compare_same_type(basic const & other) const
+int indexed::compare_same_type(const basic & other) const
 {
-    GINAC_ASSERT(is_of_type(other,indexed));
-    return inherited::compare_same_type(other);
+       GINAC_ASSERT(is_of_type(other,indexed));
+       return inherited::compare_same_type(other);
 }
 
-bool indexed::is_equal_same_type(basic const & other) const
+bool indexed::is_equal_same_type(const basic & other) const
 {
-    GINAC_ASSERT(is_of_type(other,indexed));
-    return inherited::is_equal_same_type(other);
+       GINAC_ASSERT(is_of_type(other,indexed));
+       return inherited::is_equal_same_type(other);
 }
 
 unsigned indexed::return_type(void) const
 {
-    return return_types::noncommutative;
+       return return_types::noncommutative;
 }
    
 unsigned indexed::return_type_tinfo(void) const
 {
-    return tinfo_key;
+       return tinfo_key;
 }
 
-ex indexed::thisexprseq(exvector const & v) const
+ex indexed::thisexprseq(const exvector & v) const
 {
-    return indexed(v);
+       return indexed(v);
 }
 
 ex indexed::thisexprseq(exvector * vp) const
 {
-    return indexed(vp);
+       return indexed(vp);
 }
 
 //////////
@@ -264,68 +257,55 @@ ex indexed::thisexprseq(exvector * vp) const
 
 // protected
 
-void indexed::printrawindices(ostream & os) const
-{
-    if (seq.size()!=0) {
-        for (exvector::const_iterator cit=seq.begin(); cit!=seq.end(); ++cit) {
-            (*cit).printraw(os);
-            os << ",";
-        }
-    }
-}
-
-void indexed::printtreeindices(ostream & os, unsigned indent) const
-{
-    if (seq.size()!=0) {
-        for (exvector::const_iterator cit=seq.begin(); cit!=seq.end(); ++cit) {
-            os << string(indent+delta_indent,' ');
-            (*cit).printraw(os);
-            os << endl;
-        }
-    }
-}
-
-void indexed::printindices(ostream & os) const
-{
-    if (seq.size()!=0) {
-        if (seq.size()>1) {
-            os << "{";
-        }
-        exvector::const_iterator last=seq.end()-1;
-        exvector::const_iterator cit=seq.begin();
-        for (; cit!=last; ++cit) {
-            (*cit).print(os);
-            os << ",";
-        }
-        (*cit).print(os);
-        if (seq.size()>1) {
-            os << "}";
-        }
-    }
-}
-
+void indexed::printrawindices(std::ostream & os) const
+{
+       if (seq.size()!=0) {
+               for (exvector::const_iterator cit=seq.begin(); cit!=seq.end(); ++cit) {
+                       (*cit).printraw(os);
+                       os << ",";
+               }
+       }
+}
+
+void indexed::printtreeindices(std::ostream & os, unsigned indent) const
+{
+       if (seq.size()!=0) {
+               for (exvector::const_iterator cit=seq.begin(); cit!=seq.end(); ++cit) {
+                       os << std::string(indent+delta_indent,' ');
+                       (*cit).printraw(os);
+                       os << std::endl;
+               }
+       }
+}
+
+void indexed::printindices(std::ostream & os) const
+{
+       if (seq.size()!=0) {
+               if (seq.size()>1) {
+                       os << "{";
+               }
+               exvector::const_iterator last=seq.end()-1;
+               exvector::const_iterator cit=seq.begin();
+               for (; cit!=last; ++cit) {
+                       (*cit).print(os);
+                       os << ",";
+               }
+               (*cit).print(os);
+               if (seq.size()>1) {
+                       os << "}";
+               }
+       }
+}
+
+/** Check whether all indices are of class idx or a subclass. This function
+ *  is used internally to make sure that all constructed indexed objects
+ *  really carry indices and not some other classes. */
 bool indexed::all_of_type_idx(void) const
 {
-    // used only inside of ASSERTs
-    for (exvector::const_iterator cit=seq.begin(); cit!=seq.end(); ++cit) {
-        if (!is_ex_of_type(*cit,idx)) return false;
-    }
-    return true;
+       for (exvector::const_iterator cit=seq.begin(); cit!=seq.end(); ++cit) {
+               if (!is_ex_of_type(*cit,idx)) return false;
+       }
+       return true;
 }
 
-//////////
-// static member variables
-//////////
-
-// none
-
-//////////
-// global constants
-//////////
-
-const indexed some_indexed;
-type_info const & typeid_indexed=typeid(some_indexed);
-
-#ifndef NO_GINAC_NAMESPACE
 } // namespace GiNaC
-#endif // ndef NO_GINAC_NAMESPACE