File indexing completed on 2025-12-16 10:31:56
0001 #ifndef ATOOLS_Math_Term_H
0002 #define ATOOLS_Math_Term_H
0003
0004 #include <string>
0005
0006 namespace ATOOLS {
0007
0008 class Term {
0009 private:
0010
0011 char m_type;
0012
0013 std::string m_tag;
0014 size_t m_id;
0015
0016 public:
0017
0018 inline Term(const char type): m_type(type) {}
0019
0020 virtual ~Term();
0021
0022 template <class TType> static Term *New(const TType &val);
0023
0024 static Term *NewTerm(const std::string &tag);
0025
0026 virtual void Delete() = 0;
0027
0028 inline char Type() const { return m_type; }
0029
0030 template <class TType> const TType &Get() const;
0031 template <class TType> void Set(const TType &val);
0032
0033 void SetTerm(const std::string &val);
0034
0035 void Print(std::ostream &ostr) const;
0036
0037 Term *operator-() const;
0038 Term *operator!() const;
0039
0040 Term *operator+(const Term &ref) const;
0041 Term *operator-(const Term &ref) const;
0042 Term *operator*(const Term &ref) const;
0043 Term *operator/(const Term &ref) const;
0044
0045 Term *operator==(const Term &ref) const;
0046 Term *operator!=(const Term &ref) const;
0047
0048 Term *operator<(const Term &ref) const;
0049 Term *operator>(const Term &ref) const;
0050 Term *operator<=(const Term &ref) const;
0051 Term *operator>=(const Term &ref) const;
0052
0053 Term *operator%(const Term &ref) const;
0054 Term *operator<<(const Term &ref) const;
0055 Term *operator>>(const Term &ref) const;
0056 Term *operator&&(const Term &ref) const;
0057 Term *operator||(const Term &ref) const;
0058 Term *operator&(const Term &ref) const;
0059 Term *operator^(const Term &ref) const;
0060 Term *operator|(const Term &ref) const;
0061
0062 Term *Real() const;
0063 Term *Imag() const;
0064 Term *Conj() const;
0065 Term *Comp(const Term &i) const;
0066
0067 Term *Perp() const;
0068 Term *Plus() const;
0069 Term *Minus() const;
0070
0071 Term *PPlus() const;
0072 Term *PMinus() const;
0073 Term *Abs2() const;
0074 Term *Mass() const;
0075 Term *PSpat() const;
0076 Term *PPerp() const;
0077 Term *PPerp2() const;
0078 Term *MPerp() const;
0079 Term *MPerp2() const;
0080 Term *Theta() const;
0081 Term *Eta() const;
0082 Term *Y() const;
0083 Term *Phi() const;
0084
0085 Term *PPerp(const Term &ref) const;
0086 Term *Theta(const Term &ref) const;
0087 Term *DEta(const Term &ref) const;
0088 Term *DY(const Term &ref) const;
0089 Term *DPhi(const Term &ref) const;
0090 Term *DR(const Term &ref) const;
0091
0092 inline void SetTag(const std::string &tag) { m_tag=tag; }
0093 inline void SetId(const size_t &id) { m_id=id; }
0094
0095 inline const std::string &Tag() const { return m_tag; }
0096 inline const size_t &Id() const { return m_id; }
0097
0098 };
0099
0100 std::ostream &operator<<(std::ostream &ostr,const Term &t);
0101
0102 Term *TVec4D(const Term &t0,const Term &t1,
0103 const Term &t2,const Term &t3);
0104
0105 Term *TExp(const Term &t);
0106 Term *TLog(const Term &t);
0107 Term *TLog10(const Term &t);
0108 Term *TAbs(const Term &t);
0109 Term *TSgn(const Term &t);
0110 Term *TTheta(const Term &t1);
0111 Term *TSqr(const Term &t);
0112 Term *TSqrt(const Term &t);
0113 Term *TSin(const Term &t);
0114 Term *TCos(const Term &t);
0115 Term *TTan(const Term &t);
0116 Term *TSinh(const Term &t);
0117 Term *TCosh(const Term &t);
0118 Term *TTanh(const Term &t);
0119 Term *TASin(const Term &t);
0120 Term *TACos(const Term &t);
0121 Term *TATan(const Term &t);
0122
0123 Term *TPow(const Term &t1,const Term &t2);
0124 Term *TMin(const Term &t1,const Term &t2);
0125 Term *TMax(const Term &t1,const Term &t2);
0126
0127 }
0128
0129 #endif