Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/externals/g4tools/include/tools/lina/vec2

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

  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