/** @file lorentzidx.cpp
*
- * Implementation of GiNaC's lorentz indices. */
+ * Implementation of GiNaC's Lorentz indices. */
/*
- * 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
#include "lorentzidx.h"
#include "lst.h"
+#include "symbol.h"
#include "archive.h"
#include "utils.h"
#include "debugmsg.h"
-#ifndef NO_NAMESPACE_GINAC
namespace GiNaC {
-#endif // ndef NO_NAMESPACE_GINAC
GINAC_IMPLEMENT_REGISTERED_CLASS(lorentzidx, idx)
tinfo_key = TINFO_lorentzidx;
}
-lorentzidx::~lorentzidx()
-{
- debugmsg("lorentzidx destructor",LOGLEVEL_DESTRUCT);
- destroy(false);
-}
-
-lorentzidx::lorentzidx(const lorentzidx & other)
-{
- debugmsg("lorentzidx copy constructor",LOGLEVEL_CONSTRUCT);
- copy(other);
-}
-
-const lorentzidx & lorentzidx::operator=(const lorentzidx & other)
-{
- debugmsg("lorentzidx operator=",LOGLEVEL_ASSIGNMENT);
- if (this != &other) {
- destroy(true);
- copy(other);
- }
- return *this;
-}
-
// protected
void lorentzidx::copy(const lorentzidx & other)
// public
+/** Construct symbolic Lorentz index, using an automatically generated unique name.
+ *
+ * @param cov Index is covariant (contravariant otherwise)
+ * @param oonly Index only lives in orthogonal space
+ * @param dimp Dimension of parallel space
+ * @return newly constructed index */
lorentzidx::lorentzidx(bool cov, bool oonly, unsigned dimp)
: idx(cov), orthogonal_only(oonly), dim_parallel_space(dimp)
{
- debugmsg("lorentzidx constructor from bool",LOGLEVEL_CONSTRUCT);
+ debugmsg("lorentzidx constructor from bool,bool,unsigned",LOGLEVEL_CONSTRUCT);
// serial is incremented in idx::idx(bool)
if (oonly) {
name="muorth"+ToString(serial);
tinfo_key=TINFO_lorentzidx;
}
+/** Construct symbolic Lorentz index with specified name.
+ *
+ * @param n Symbolic index name
+ * @param cov Index is covariant (contravariant otherwise)
+ * @param oonly Index only lives in orthogonal space
+ * @param dimp Dimension of parallel space
+ * @return newly constructed index */
lorentzidx::lorentzidx(const std::string & n, bool cov, bool oonly, unsigned dimp)
: idx(n,cov), orthogonal_only(oonly), dim_parallel_space(dimp)
{
tinfo_key=TINFO_lorentzidx;
}
+/** Construct symbolic Lorentz index with specified name.
+ *
+ * @param n Symbolic index name
+ * @param cov Index is covariant (contravariant otherwise)
+ * @param oonly Index only lives in orthogonal space
+ * @param dimp Dimension of parallel space
+ * @return newly constructed index */
lorentzidx::lorentzidx(const char * n, bool cov, bool oonly, unsigned dimp)
: idx(n,cov), orthogonal_only(oonly), dim_parallel_space(dimp)
{
tinfo_key=TINFO_lorentzidx;
}
+/** Construct numeric Lorentz index with specified value.
+ *
+ * @param v Numeric index value
+ * @param cov Index is covariant (contravariant otherwise)
+ * @return newly constructed index */
lorentzidx::lorentzidx(unsigned v, bool cov)
: idx(v,cov), orthogonal_only(false), dim_parallel_space(0)
{
{
debugmsg("lorentzidx constructor from archive_node", LOGLEVEL_CONSTRUCT);
n.find_bool("orthogonal_only", orthogonal_only);
- if (orthogonal_only)
- n.find_unsigned("pdim", dim_parallel_space);
+ n.find_unsigned("pdim", dim_parallel_space);
}
/** Unarchive the object. */
{
inherited::archive(n);
n.add_bool("orthogonal_only", orthogonal_only);
- if (orthogonal_only)
- n.add_unsigned("pdim", dim_parallel_space);
+ n.add_unsigned("pdim", dim_parallel_space);
}
//////////
// public
-basic * lorentzidx::duplicate() const
-{
- debugmsg("lorentzidx duplicate",LOGLEVEL_DUPLICATE);
- return new lorentzidx(*this);
-}
-
void lorentzidx::printraw(std::ostream & os) const
{
debugmsg("lorentzidx printraw",LOGLEVEL_PRINT);
return inherited::info(inf);
}
-//////////
-// new virtual functions which can be overridden by derived classes
-//////////
-
-// none
+int lorentzidx::compare_same_type(const basic & other) const
+{
+ GINAC_ASSERT(is_of_type(other, lorentzidx));
+ const lorentzidx &o = static_cast<const lorentzidx &>(other);
+
+ if (orthogonal_only != o.orthogonal_only)
+ return orthogonal_only ? -1 : 1;
+ if (dim_parallel_space != o.dim_parallel_space)
+ return dim_parallel_space < o.dim_parallel_space ? -1 : 1;
+ return inherited::compare_same_type(other);
+}
//////////
// non-virtual functions in this class
// public
+/** Create anonymous contravariant copy of a symbolic Lorentz index. */
lorentzidx lorentzidx::create_anonymous_representative(void) const
{
GINAC_ASSERT(is_symbolic());
}
//////////
-// static member variables
+// global functions
//////////
-// none
-
-//////////
-// global constants
-//////////
-
-const lorentzidx some_lorentzidx;
-const type_info & typeid_lorentzidx=typeid(some_lorentzidx);
+/** Return the global symbol that represents the dimension D of spacetime. */
+ex Dim(void)
+{
+ static symbol *d = new symbol("dim");
+ return *d;
+}
-#ifndef NO_NAMESPACE_GINAC
} // namespace GiNaC
-#endif // ndef NO_NAMESPACE_GINAC