Back to home page

EIC code displayed by LXR

 
 

    


Warning, /include/Geant4/tools/lina/vec2 is written in an unsupported language. File is not indexed.

0001 // Copyright (C) 2010, Guy Barrand. All rights reserved.
0002 // See the file tools.license for terms.
0003 
0004 #ifndef tools_vec2
0005 #define tools_vec2
0006 
0007 #include <cstddef> //size_t
0008 
0009 namespace tools {
0010 
0011 template <class T>
0012 class vec2 {
0013 public:
0014   typedef T elem_t;
0015   unsigned int dimension() const {return 2;}
0016 public:
0017   vec2(){
0018     m_data[0] = T();
0019     m_data[1] = T();
0020   }
0021   vec2(const T a_vec[2]) {
0022     m_data[0] = a_vec[0];
0023     m_data[1] = a_vec[1];
0024   }
0025   vec2(const T& a0,const T& a1) {
0026     m_data[0] = a0;
0027     m_data[1] = a1;
0028   }
0029   virtual ~vec2() {
0030   }
0031 public:
0032   vec2(const vec2& a_from){
0033     m_data[0] = a_from.m_data[0];
0034     m_data[1] = a_from.m_data[1];
0035   }
0036   vec2& operator=(const vec2& a_from) {
0037     m_data[0] = a_from.m_data[0];
0038     m_data[1] = a_from.m_data[1];
0039     return *this;
0040   }
0041 public:
0042   const T& v0() const { return m_data[0];}
0043   const T& v1() const { return m_data[1];}
0044 
0045   void v0(const T& a_value) { m_data[0] = a_value;}
0046   void v1(const T& a_value) { m_data[1] = a_value;}
0047 
0048   const T& x() const {return m_data[0];}
0049   const T& y() const {return m_data[1];}
0050   T& x() {return m_data[0];}
0051   T& y() {return m_data[1];}
0052 
0053   void set_value(const T& a0,const T& a1) {
0054     m_data[0] = a0;
0055     m_data[1] = a1;
0056   }
0057   void set_value(const T aV[2]) {
0058     m_data[0] = aV[0];
0059     m_data[1] = aV[1];
0060   }
0061   void value(T& a0,T& a1) const {
0062     a0 = m_data[0];
0063     a1 = m_data[1];
0064   }
0065 
0066   T length(T(*a_sqrt)(T)) const {
0067     return a_sqrt(m_data[0]*m_data[0]+m_data[1]*m_data[1]);
0068   }
0069 
0070   T normalize(T(*a_sqrt)(T)) {
0071     T norme = length(a_sqrt);
0072     if(norme==T()) return T();
0073     divide(norme);
0074     return norme;
0075   }
0076 
0077   T dot(const vec2& aV) const {
0078     return (m_data[0] * aV.m_data[0] +
0079             m_data[1] * aV.m_data[1]);
0080   }
0081 
0082   T cross(const vec2& aV) const {
0083     return (m_data[0] * aV.m_data[1] - m_data[1] * aV.m_data[0]);
0084   }
0085 
0086   bool equal(const vec2& aV) const {
0087     if(m_data[0]!=aV.m_data[0]) return false;
0088     if(m_data[1]!=aV.m_data[1]) return false;
0089     return true;
0090   }
0091 
0092   bool divide(const T& a_T) {
0093     if(a_T==T()) return false;
0094     m_data[0] /= a_T;
0095     m_data[1] /= a_T;
0096     return true;
0097   }
0098 
0099   void add(const vec2& a_v) {
0100     m_data[0] += a_v.m_data[0];
0101     m_data[1] += a_v.m_data[1];
0102   }
0103 
0104   void add(const T& a0,const T& a1) {
0105     m_data[0] += a0;
0106     m_data[1] += a1;
0107   }
0108 
0109   void subtract(const vec2& a_v) {
0110     m_data[0] -= a_v.m_data[0];
0111     m_data[1] -= a_v.m_data[1];
0112   }
0113 
0114   void subtract(const T& a0,const T& a1) {
0115     m_data[0] -= a0;
0116     m_data[1] -= a1;
0117   }
0118 
0119 public: //operators
0120   T& operator[](size_t a_index) {
0121     //WARNING : no check on a_index.
0122     return m_data[a_index];
0123   }
0124   const T& operator[](size_t a_index) const {
0125     //WARNING : no check on a_index.
0126     return m_data[a_index];
0127   }
0128 
0129   vec2 operator+(const vec2& a_v) const {
0130     return vec2(m_data[0]+a_v.m_data[0],
0131                 m_data[1]+a_v.m_data[1]);
0132   }
0133 
0134   vec2 operator-(const vec2& a_v) const {
0135     return vec2(m_data[0]-a_v.m_data[0],
0136                 m_data[1]-a_v.m_data[1]);
0137   }
0138 
0139   vec2 operator*(const T& a_v) const {
0140     return vec2(m_data[0]*a_v,
0141                 m_data[1]*a_v);
0142   }
0143 
0144   bool operator==(const vec2& a_v) const {return equal(a_v);}
0145   bool operator!=(const vec2& a_v) const {return !operator==(a_v);}
0146 
0147 public: //for tools/sg/sf_vec
0148   typedef unsigned int size_type;
0149   size_type size() const {return 2;}
0150   const T* data() const {return m_data;}
0151 public: //for iv2sg
0152   const T* getValue() const {return m_data;}
0153   void getValue(T& a0,T& a1) const {
0154     a0 = m_data[0];
0155     a1 = m_data[1];
0156   }
0157   void setValue(const T& a0,const T& a1) {
0158     m_data[0] = a0;
0159     m_data[1] = a1;
0160   }
0161   void setValue(const T aV[2]) {
0162     m_data[0] = aV[0];
0163     m_data[1] = aV[1];
0164   }
0165 protected:
0166   T m_data[2];
0167 
0168 private:static void check_instantiation() {vec2<float> v;}
0169 };
0170 
0171 //for sf, mf :
0172 template <class T>
0173 inline const T* get_data(const vec2<T>& a_v) {return a_v.data();}
0174 
0175 }
0176 
0177 #include <ostream>
0178 
0179 namespace tools {
0180 
0181 // for sf_vec::dump().
0182 template <class T>
0183 inline std::ostream& operator<<(std::ostream& a_out,const vec2<T>& a_this){
0184   a_out << "x = " << a_this.v0()
0185         << ",y = " << a_this.v1();
0186   return a_out;
0187 }
0188 
0189 }
0190 
0191 #endif