00001 #ifdef CH_LANG_CC
00002
00003
00004
00005
00006
00007
00008
00009 #endif
00010
00011 #ifndef _CH_COMPLEX_H_
00012 #define _CH_COMPLEX_H_
00013
00014 #ifdef CH_USE_COMPLEX
00015
00016 #include <complex>
00017 using std::complex;
00018
00019 #include "REAL.H"
00020 #include "BaseNamespaceHeader.H"
00021 using std::complex;
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 class Complex : public complex<Real>
00033 {
00034 public:
00035
00036 inline Complex()
00037 {
00038 }
00039
00040 inline Complex(const complex<Real>& a_arg):complex<Real>(a_arg)
00041 {
00042 }
00043
00044
00045 inline Complex(const Real& re, const Real& im):complex<Real>(re, im)
00046 {
00047 }
00048
00049
00050 inline Real & re();
00051
00052
00053 inline Real re() const
00054 {
00055 return real();
00056 };
00057
00058
00059 inline Real & im();
00060
00061
00062 inline Real im() const
00063 {
00064 return imag();
00065 };
00066
00067 inline Complex& operator=(const Complex& rhs)
00068 {
00069 reinterpret_cast<Real(&)[2]>(*this)[0] = reinterpret_cast<const Real(&)[2]>(rhs)[0];
00070 reinterpret_cast<Real(&)[2]>(*this)[1] = reinterpret_cast<const Real(&)[2]>(rhs)[1];
00071
00072 return *this;
00073 }
00074
00075 inline Complex& operator*=(Real s)
00076 {
00077 reinterpret_cast<Real(&)[2]>(*this)[0] *=s;
00078 reinterpret_cast<Real(&)[2]>(*this)[1] *=s;
00079 return *this;
00080 }
00081
00082 inline Complex& operator*=(const Complex& in)
00083 {
00084 Real a = reinterpret_cast<const Real(&)[2]>(in)[0];
00085 Real b = reinterpret_cast<const Real(&)[2]>(in)[1];
00086 Real c = reinterpret_cast<const Real(&)[2]>(*this)[0];
00087 Real d = reinterpret_cast<const Real(&)[2]>(*this)[1];
00088 reinterpret_cast<Real(&)[2]>(*this)[0] = a*c - b*d;
00089 reinterpret_cast<Real(&)[2]>(*this)[1] = a*b + b*c;
00090 return *this;
00091 }
00092
00093 inline Complex operator*(const Complex& in) const
00094 {
00095 Complex rtn;
00096 Real a = reinterpret_cast<const Real(&)[2]>(in)[0];
00097 Real b = reinterpret_cast<const Real(&)[2]>(in)[1];
00098 Real c = reinterpret_cast<const Real(&)[2]>(*this)[0];
00099 Real d = reinterpret_cast<const Real(&)[2]>(*this)[1];
00100 reinterpret_cast<Real(&)[2]>(rtn)[0] = a*c - b*d;
00101 reinterpret_cast<Real(&)[2]>(rtn)[1] = a*b + b*c;
00102 return rtn;
00103 }
00104 static inline Complex Zero() {return Complex(0,0);}
00105 };
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116 inline Real & Complex::re()
00117 {
00118 return (((Real*)this)[0]);
00119 }
00120
00121 inline Real & Complex::im()
00122 {
00123 return (((Real*)this)[1]);
00124 }
00125
00126
00127
00128
00129
00130 #include "BaseNamespaceFooter.H"
00131 #endif //CH_USE_COMPLEX
00132 #endif //_CH_COMPLEX_H_