Geant4 Cross Reference |
1 // Copyright (C) 2010, Guy Barrand. All rights 1 // Copyright (C) 2010, Guy Barrand. All rights reserved. 2 // See the file tools.license for terms. 2 // See the file tools.license for terms. 3 3 4 #ifndef tools_vec2 4 #ifndef tools_vec2 5 #define tools_vec2 5 #define tools_vec2 6 6 7 #include <cstddef> //size_t 7 #include <cstddef> //size_t 8 8 9 #ifdef TOOLS_MEM 9 #ifdef TOOLS_MEM 10 #include "../mem" 10 #include "../mem" 11 #endif 11 #endif 12 12 13 namespace tools { 13 namespace tools { 14 14 15 template <class T> 15 template <class T> 16 class vec2 { 16 class vec2 { 17 #ifdef TOOLS_MEM 17 #ifdef TOOLS_MEM 18 static const std::string& s_class() { 18 static const std::string& s_class() { 19 static const std::string s_v("tools::vec2" 19 static const std::string s_v("tools::vec2"); 20 return s_v; 20 return s_v; 21 } 21 } 22 #endif 22 #endif 23 public: 23 public: 24 typedef T elem_t; 24 typedef T elem_t; 25 unsigned int dimension() const {return 2;} 25 unsigned int dimension() const {return 2;} 26 public: 26 public: 27 vec2(){ 27 vec2(){ 28 #ifdef TOOLS_MEM 28 #ifdef TOOLS_MEM 29 mem::increment(s_class().c_str()); 29 mem::increment(s_class().c_str()); 30 #endif 30 #endif 31 m_data[0] = T(); 31 m_data[0] = T(); 32 m_data[1] = T(); 32 m_data[1] = T(); 33 } 33 } 34 vec2(const T a_vec[2]) { 34 vec2(const T a_vec[2]) { 35 #ifdef TOOLS_MEM 35 #ifdef TOOLS_MEM 36 mem::increment(s_class().c_str()); 36 mem::increment(s_class().c_str()); 37 #endif 37 #endif 38 m_data[0] = a_vec[0]; 38 m_data[0] = a_vec[0]; 39 m_data[1] = a_vec[1]; 39 m_data[1] = a_vec[1]; 40 } 40 } 41 vec2(const T& a0,const T& a1) { 41 vec2(const T& a0,const T& a1) { 42 #ifdef TOOLS_MEM 42 #ifdef TOOLS_MEM 43 mem::increment(s_class().c_str()); 43 mem::increment(s_class().c_str()); 44 #endif 44 #endif 45 m_data[0] = a0; 45 m_data[0] = a0; 46 m_data[1] = a1; 46 m_data[1] = a1; 47 } 47 } 48 virtual ~vec2() { 48 virtual ~vec2() { 49 #ifdef TOOLS_MEM 49 #ifdef TOOLS_MEM 50 mem::decrement(s_class().c_str()); 50 mem::decrement(s_class().c_str()); 51 #endif 51 #endif 52 } 52 } 53 public: 53 public: 54 vec2(const vec2& a_from){ 54 vec2(const vec2& a_from){ 55 #ifdef TOOLS_MEM 55 #ifdef TOOLS_MEM 56 mem::increment(s_class().c_str()); 56 mem::increment(s_class().c_str()); 57 #endif 57 #endif 58 m_data[0] = a_from.m_data[0]; 58 m_data[0] = a_from.m_data[0]; 59 m_data[1] = a_from.m_data[1]; 59 m_data[1] = a_from.m_data[1]; 60 } 60 } 61 vec2& operator=(const vec2& a_from) { 61 vec2& operator=(const vec2& a_from) { 62 m_data[0] = a_from.m_data[0]; 62 m_data[0] = a_from.m_data[0]; 63 m_data[1] = a_from.m_data[1]; 63 m_data[1] = a_from.m_data[1]; 64 return *this; 64 return *this; 65 } 65 } 66 public: 66 public: 67 const T& v0() const { return m_data[0];} 67 const T& v0() const { return m_data[0];} 68 const T& v1() const { return m_data[1];} 68 const T& v1() const { return m_data[1];} 69 69 70 void v0(const T& a_value) { m_data[0] = a_va 70 void v0(const T& a_value) { m_data[0] = a_value;} 71 void v1(const T& a_value) { m_data[1] = a_va 71 void v1(const T& a_value) { m_data[1] = a_value;} 72 72 73 const T& x() const {return m_data[0];} 73 const T& x() const {return m_data[0];} 74 const T& y() const {return m_data[1];} 74 const T& y() const {return m_data[1];} 75 T& x() {return m_data[0];} 75 T& x() {return m_data[0];} 76 T& y() {return m_data[1];} 76 T& y() {return m_data[1];} 77 77 78 void set_value(const T& a0,const T& a1) { 78 void set_value(const T& a0,const T& a1) { 79 m_data[0] = a0; 79 m_data[0] = a0; 80 m_data[1] = a1; 80 m_data[1] = a1; 81 } 81 } 82 void set_value(const T aV[2]) { 82 void set_value(const T aV[2]) { 83 m_data[0] = aV[0]; 83 m_data[0] = aV[0]; 84 m_data[1] = aV[1]; 84 m_data[1] = aV[1]; 85 } 85 } 86 void value(T& a0,T& a1) const { 86 void value(T& a0,T& a1) const { 87 a0 = m_data[0]; 87 a0 = m_data[0]; 88 a1 = m_data[1]; 88 a1 = m_data[1]; 89 } 89 } 90 90 91 //bool set_value(unsigned int a_index,const 91 //bool set_value(unsigned int a_index,const T& a_value) { 92 // if(a_index>=2) return false; 92 // if(a_index>=2) return false; 93 // m_[a_index] = a_value; 93 // m_[a_index] = a_value; 94 // return true; 94 // return true; 95 //} 95 //} 96 96 97 T length(T(*a_sqrt)(T)) const { 97 T length(T(*a_sqrt)(T)) const { 98 return a_sqrt(m_data[0]*m_data[0]+m_data[1 98 return a_sqrt(m_data[0]*m_data[0]+m_data[1]*m_data[1]); 99 } 99 } 100 100 101 T normalize(T(*a_sqrt)(T)) { 101 T normalize(T(*a_sqrt)(T)) { 102 T norme = length(a_sqrt); 102 T norme = length(a_sqrt); 103 if(norme==T()) return T(); 103 if(norme==T()) return T(); 104 divide(norme); 104 divide(norme); 105 return norme; 105 return norme; 106 } 106 } 107 107 108 T dot(const vec2& aV) const { 108 T dot(const vec2& aV) const { 109 return (m_data[0] * aV.m_data[0] + 109 return (m_data[0] * aV.m_data[0] + 110 m_data[1] * aV.m_data[1]); 110 m_data[1] * aV.m_data[1]); 111 } 111 } 112 112 113 T cross(const vec2& aV) const { 113 T cross(const vec2& aV) const { 114 return (m_data[0] * aV.m_data[1] - m_data[ 114 return (m_data[0] * aV.m_data[1] - m_data[1] * aV.m_data[0]); 115 } 115 } 116 116 117 bool equal(const vec2& aV) const { 117 bool equal(const vec2& aV) const { 118 if(m_data[0]!=aV.m_data[0]) return false; 118 if(m_data[0]!=aV.m_data[0]) return false; 119 if(m_data[1]!=aV.m_data[1]) return false; 119 if(m_data[1]!=aV.m_data[1]) return false; 120 return true; 120 return true; 121 } 121 } 122 122 123 bool divide(const T& a_T) { 123 bool divide(const T& a_T) { 124 if(a_T==T()) return false; 124 if(a_T==T()) return false; 125 m_data[0] /= a_T; 125 m_data[0] /= a_T; 126 m_data[1] /= a_T; 126 m_data[1] /= a_T; 127 return true; 127 return true; 128 } 128 } 129 129 130 void add(const vec2& a_v) { 130 void add(const vec2& a_v) { 131 m_data[0] += a_v.m_data[0]; 131 m_data[0] += a_v.m_data[0]; 132 m_data[1] += a_v.m_data[1]; 132 m_data[1] += a_v.m_data[1]; 133 } 133 } 134 134 135 void add(const T& a0,const T& a1) { 135 void add(const T& a0,const T& a1) { 136 m_data[0] += a0; 136 m_data[0] += a0; 137 m_data[1] += a1; 137 m_data[1] += a1; 138 } 138 } 139 139 140 void subtract(const vec2& a_v) { 140 void subtract(const vec2& a_v) { 141 m_data[0] -= a_v.m_data[0]; 141 m_data[0] -= a_v.m_data[0]; 142 m_data[1] -= a_v.m_data[1]; 142 m_data[1] -= a_v.m_data[1]; 143 } 143 } 144 144 145 void subtract(const T& a0,const T& a1) { 145 void subtract(const T& a0,const T& a1) { 146 m_data[0] -= a0; 146 m_data[0] -= a0; 147 m_data[1] -= a1; 147 m_data[1] -= a1; 148 } 148 } 149 149 150 public: //operators 150 public: //operators 151 T& operator[](size_t a_index) { 151 T& operator[](size_t a_index) { 152 //WARNING : no check on a_index. 152 //WARNING : no check on a_index. 153 return m_data[a_index]; 153 return m_data[a_index]; 154 } 154 } 155 const T& operator[](size_t a_index) const { 155 const T& operator[](size_t a_index) const { 156 //WARNING : no check on a_index. 156 //WARNING : no check on a_index. 157 return m_data[a_index]; 157 return m_data[a_index]; 158 } 158 } 159 159 160 vec2 operator+(const vec2& a_v) const { 160 vec2 operator+(const vec2& a_v) const { 161 return vec2(m_data[0]+a_v.m_data[0], 161 return vec2(m_data[0]+a_v.m_data[0], 162 m_data[1]+a_v.m_data[1]); 162 m_data[1]+a_v.m_data[1]); 163 } 163 } 164 164 165 vec2 operator-(const vec2& a_v) const { 165 vec2 operator-(const vec2& a_v) const { 166 return vec2(m_data[0]-a_v.m_data[0], 166 return vec2(m_data[0]-a_v.m_data[0], 167 m_data[1]-a_v.m_data[1]); 167 m_data[1]-a_v.m_data[1]); 168 } 168 } 169 169 170 vec2 operator*(const T& a_v) const { 170 vec2 operator*(const T& a_v) const { 171 return vec2(m_data[0]*a_v, 171 return vec2(m_data[0]*a_v, 172 m_data[1]*a_v); 172 m_data[1]*a_v); 173 } 173 } 174 174 175 bool operator==(const vec2& a_v) const {retu 175 bool operator==(const vec2& a_v) const {return equal(a_v);} 176 bool operator!=(const vec2& a_v) const {retu 176 bool operator!=(const vec2& a_v) const {return !operator==(a_v);} 177 177 178 public: //for tools/sg/sf_vec 178 public: //for tools/sg/sf_vec 179 typedef unsigned int size_type; 179 typedef unsigned int size_type; 180 size_type size() const {return 2;} 180 size_type size() const {return 2;} 181 const T* data() const {return m_data;} 181 const T* data() const {return m_data;} 182 public: //for iv2sg 182 public: //for iv2sg 183 const T* getValue() const {return m_data;} 183 const T* getValue() const {return m_data;} 184 void getValue(T& a0,T& a1) const { 184 void getValue(T& a0,T& a1) const { 185 a0 = m_data[0]; 185 a0 = m_data[0]; 186 a1 = m_data[1]; 186 a1 = m_data[1]; 187 } 187 } 188 void setValue(const T& a0,const T& a1) { 188 void setValue(const T& a0,const T& a1) { 189 m_data[0] = a0; 189 m_data[0] = a0; 190 m_data[1] = a1; 190 m_data[1] = a1; 191 } 191 } 192 void setValue(const T aV[2]) { 192 void setValue(const T aV[2]) { 193 m_data[0] = aV[0]; 193 m_data[0] = aV[0]; 194 m_data[1] = aV[1]; 194 m_data[1] = aV[1]; 195 } 195 } 196 protected: 196 protected: 197 T m_data[2]; 197 T m_data[2]; 198 198 199 private:static void check_instantiation() {vec 199 private:static void check_instantiation() {vec2<float> v;} 200 }; 200 }; 201 201 202 //for sf, mf : 202 //for sf, mf : 203 template <class T> 203 template <class T> 204 inline const T* get_data(const vec2<T>& a_v) { 204 inline const T* get_data(const vec2<T>& a_v) {return a_v.data();} 205 205 206 } 206 } 207 207 208 #include <ostream> 208 #include <ostream> 209 209 210 namespace tools { 210 namespace tools { 211 211 212 // for sf_vec::dump(). 212 // for sf_vec::dump(). 213 template <class T> 213 template <class T> 214 inline std::ostream& operator<<(std::ostream& 214 inline std::ostream& operator<<(std::ostream& a_out,const vec2<T>& a_this){ 215 a_out << "x = " << a_this.v0() 215 a_out << "x = " << a_this.v0() 216 << ",y = " << a_this.v1(); 216 << ",y = " << a_this.v1(); 217 return a_out; 217 return a_out; 218 } 218 } 219 219 220 } 220 } 221 221 222 #endif 222 #endif