inlib
1.2.0
|
00001 // Copyright (C) 2010, Guy Barrand. All rights reserved. 00002 // See the file inlib.license for terms. 00003 00004 #ifndef inlib_a2 00005 #define inlib_a2 00006 00007 // Inheritance : 00008 #include "sqm" 00009 00010 namespace inlib { 00011 namespace a2 { //2 is a dimension. 00012 00013 // vec is an a2 00014 00015 template <class T> 00016 class vec : public array<T> { 00017 public: 00018 vec():array<T>(1,2){} 00019 vec(const T a_vec[2]):array<T>(1,2) { 00020 array<T>::m_vector[0] = a_vec[0]; 00021 array<T>::m_vector[1] = a_vec[1]; 00022 } 00023 vec(const T& a0,const T& a1):array<T>(1,2) { 00024 array<T>::m_vector[0] = a0; 00025 array<T>::m_vector[1] = a1; 00026 } 00027 virtual ~vec() {} 00028 public: 00029 vec(const vec& a_from):array<T>(a_from){} 00030 vec& operator=(const vec& a_from) { 00031 array<T>::operator=(a_from); 00032 return *this; 00033 } 00034 public: 00035 T v0() const { return array<T>::m_vector[0];} 00036 T v1() const { return array<T>::m_vector[1];} 00037 00038 void v0(const T& a_value) { array<T>::m_vector[0] = a_value;} 00039 void v1(const T& a_value) { array<T>::m_vector[1] = a_value;} 00040 00041 void v01(const T& a1,const T& a2) { 00042 array<T>::m_vector[0] = a1; 00043 array<T>::m_vector[1] = a2; 00044 } 00045 void v01(const T aV[2]) { 00046 array<T>::m_vector[0] = aV[0]; 00047 array<T>::m_vector[1] = aV[1]; 00048 } 00049 void v01(T& a1,T& a2) const { 00050 a1 = array<T>::m_vector[0]; 00051 a2 = array<T>::m_vector[1]; 00052 } 00053 void set_value(const T& a1,const T& a2) { 00054 array<T>::m_vector[0] = a1; 00055 array<T>::m_vector[1] = a2; 00056 } 00057 }; 00058 00059 // sqm is an a22 00060 00061 template <class T> 00062 class sqm : public inlib::sqm<T> { 00063 public: 00064 sqm(): inlib::sqm<T>(2){} 00065 virtual ~sqm() {} 00066 public: 00067 sqm(const sqm& a_from): inlib::sqm<T>(a_from){} 00068 sqm& operator=(const sqm& a_from) { 00069 inlib::sqm<T>::operator=(a_from); 00070 return *this; 00071 } 00072 public: 00073 T v00() const {return array<T>::m_vector[0 + 0 * 2];} 00074 T v01() const {return array<T>::m_vector[0 + 1 * 2];} 00075 T v10() const {return array<T>::m_vector[1 + 0 * 2];} 00076 T v11() const {return array<T>::m_vector[1 + 1 * 2];} 00077 00078 void v00(const T& a_value) {array<T>::m_vector[0+0*2] = a_value;} 00079 void v10(const T& a_value) {array<T>::m_vector[1+0*2] = a_value;} 00080 void v01(const T& a_value) {array<T>::m_vector[0+1*2] = a_value;} 00081 void v11(const T& a_value) {array<T>::m_vector[1+1*2] = a_value;} 00082 00083 virtual T determinant() const { 00084 return v00() * v11() - v10() * v01(); 00085 } 00086 00087 bool invert(sqm& a_result) const { 00088 T deter = determinant(); 00089 if(deter==array<T>::zero()) return false; 00090 a_result.v00( v11()); 00091 a_result.v11( v00()); 00092 a_result.v01(-v01()); 00093 a_result.v10(-v10()); 00094 a_result.multiply(1./deter); 00095 return true; 00096 } 00097 00098 }; 00099 00100 template <class T> 00101 inline sqm<T> commutator(const sqm<T>& a1,const sqm<T>& a2) { 00102 return a1*a2-a2*a1; 00103 } 00104 template <class T> 00105 inline sqm<T> anticommutator(const sqm<T>& a1,const sqm<T>& a2) { 00106 return a1*a2+a2*a1; 00107 } 00108 00109 template <class T> 00110 inline sqm<T> operator-(const sqm<T>& a1,const sqm<T>& a2) { 00111 sqm<T> res(a1); 00112 res.subtract(a2); 00113 return res; 00114 } 00115 00116 template <class T> 00117 inline sqm<T> operator+(const sqm<T>& a1,const sqm<T>& a2) { 00118 sqm<T> res(a1); 00119 res.add(a2); 00120 return res; 00121 } 00122 00123 template <class T> 00124 inline sqm<T> operator*(const sqm<T>& a1,const sqm<T>& a2) { 00125 sqm<T> res; 00126 a1.mx_mul(a2,res); 00127 return res; 00128 } 00129 00130 }} 00131 00132 #endif