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