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 #ifdef TOOLS_MEM
0010 #include "../mem"
0011 #endif
0012 
0013 namespace tools {
0014 
0015 template <class T>
0016 class vec2 {
0017 #ifdef TOOLS_MEM
0018   static const std::string& s_class() {
0019     static const std::string s_v("tools::vec2");
0020     return s_v;
0021   }
0022 #endif
0023 public:
0024   typedef T elem_t;
0025   unsigned int dimension() const {return 2;}
0026 public:
0027   vec2(){
0028 #ifdef TOOLS_MEM
0029     mem::increment(s_class().c_str());
0030 #endif
0031     m_data[0] = T();
0032     m_data[1] = T();
0033   }
0034   vec2(const T a_vec[2]) {
0035 #ifdef TOOLS_MEM
0036     mem::increment(s_class().c_str());
0037 #endif
0038     m_data[0] = a_vec[0];
0039     m_data[1] = a_vec[1];
0040   }
0041   vec2(const T& a0,const T& a1) {
0042 #ifdef TOOLS_MEM
0043     mem::increment(s_class().c_str());
0044 #endif
0045     m_data[0] = a0;
0046     m_data[1] = a1;
0047   }
0048   virtual ~vec2() {
0049 #ifdef TOOLS_MEM
0050     mem::decrement(s_class().c_str());
0051 #endif
0052   }
0053 public:
0054   vec2(const vec2& a_from){
0055 #ifdef TOOLS_MEM
0056     mem::increment(s_class().c_str());
0057 #endif
0058     m_data[0] = a_from.m_data[0];
0059     m_data[1] = a_from.m_data[1];
0060   }
0061   vec2& operator=(const vec2& a_from) {
0062     m_data[0] = a_from.m_data[0];
0063     m_data[1] = a_from.m_data[1];
0064     return *this;
0065   }
0066 public:
0067   const T& v0() const { return m_data[0];}
0068   const T& v1() const { return m_data[1];}
0069 
0070   void v0(const T& a_value) { m_data[0] = a_value;}
0071   void v1(const T& a_value) { m_data[1] = a_value;}
0072 
0073   const T& x() const {return m_data[0];}
0074   const T& y() const {return m_data[1];}
0075   T& x() {return m_data[0];}
0076   T& y() {return m_data[1];}
0077 
0078   void set_value(const T& a0,const T& a1) {
0079     m_data[0] = a0;
0080     m_data[1] = a1;
0081   }
0082   void set_value(const T aV[2]) {
0083     m_data[0] = aV[0];
0084     m_data[1] = aV[1];
0085   }
0086   void value(T& a0,T& a1) const {
0087     a0 = m_data[0];
0088     a1 = m_data[1];
0089   }
0090 
0091   //bool set_value(unsigned int a_index,const T& a_value) {
0092   //  if(a_index>=2) return false;
0093   //  m_[a_index] = a_value;
0094   //  return true;
0095   //}
0096 
0097   T length(T(*a_sqrt)(T)) const {
0098     return a_sqrt(m_data[0]*m_data[0]+m_data[1]*m_data[1]);
0099   }
0100 
0101   T normalize(T(*a_sqrt)(T)) {
0102     T norme = length(a_sqrt);
0103     if(norme==T()) return T();
0104     divide(norme);
0105     return norme;
0106   }
0107 
0108   T dot(const vec2& aV) const {
0109     return (m_data[0] * aV.m_data[0] +
0110             m_data[1] * aV.m_data[1]);
0111   }
0112 
0113   T cross(const vec2& aV) const {
0114     return (m_data[0] * aV.m_data[1] - m_data[1] * aV.m_data[0]);
0115   }
0116 
0117   bool equal(const vec2& aV) const {
0118     if(m_data[0]!=aV.m_data[0]) return false;
0119     if(m_data[1]!=aV.m_data[1]) return false;
0120     return true;
0121   }
0122 
0123   bool divide(const T& a_T) {
0124     if(a_T==T()) return false;
0125     m_data[0] /= a_T;
0126     m_data[1] /= a_T;
0127     return true;
0128   }
0129 
0130   void add(const vec2& a_v) {
0131     m_data[0] += a_v.m_data[0];
0132     m_data[1] += a_v.m_data[1];
0133   }
0134 
0135   void add(const T& a0,const T& a1) {
0136     m_data[0] += a0;
0137     m_data[1] += a1;
0138   }
0139 
0140   void subtract(const vec2& a_v) {
0141     m_data[0] -= a_v.m_data[0];
0142     m_data[1] -= a_v.m_data[1];
0143   }
0144 
0145   void subtract(const T& a0,const T& a1) {
0146     m_data[0] -= a0;
0147     m_data[1] -= a1;
0148   }
0149 
0150 public: //operators
0151   T& operator[](size_t a_index) {
0152     //WARNING : no check on a_index.
0153     return m_data[a_index];
0154   }
0155   const T& operator[](size_t a_index) const {
0156     //WARNING : no check on a_index.
0157     return m_data[a_index];
0158   }
0159 
0160   vec2 operator+(const vec2& a_v) const {
0161     return vec2(m_data[0]+a_v.m_data[0],
0162                 m_data[1]+a_v.m_data[1]);
0163   }
0164 
0165   vec2 operator-(const vec2& a_v) const {
0166     return vec2(m_data[0]-a_v.m_data[0],
0167                 m_data[1]-a_v.m_data[1]);
0168   }
0169 
0170   vec2 operator*(const T& a_v) const {
0171     return vec2(m_data[0]*a_v,
0172                 m_data[1]*a_v);
0173   }
0174 
0175   bool operator==(const vec2& a_v) const {return equal(a_v);}
0176   bool operator!=(const vec2& a_v) const {return !operator==(a_v);}
0177 
0178 public: //for tools/sg/sf_vec
0179   typedef unsigned int size_type;
0180   size_type size() const {return 2;}
0181   const T* data() const {return m_data;}
0182 public: //for iv2sg
0183   const T* getValue() const {return m_data;}
0184   void getValue(T& a0,T& a1) const {
0185     a0 = m_data[0];
0186     a1 = m_data[1];
0187   }
0188   void setValue(const T& a0,const T& a1) {
0189     m_data[0] = a0;
0190     m_data[1] = a1;
0191   }
0192   void setValue(const T aV[2]) {
0193     m_data[0] = aV[0];
0194     m_data[1] = aV[1];
0195   }
0196 protected:
0197   T m_data[2];
0198 
0199 private:static void check_instantiation() {vec2<float> v;}
0200 };
0201 
0202 //for sf, mf :
0203 template <class T>
0204 inline const T* get_data(const vec2<T>& a_v) {return a_v.data();}
0205 
0206 }
0207 
0208 #include <ostream>
0209 
0210 namespace tools {
0211 
0212 // for sf_vec::dump().
0213 template <class T>
0214 inline std::ostream& operator<<(std::ostream& a_out,const vec2<T>& a_this){
0215   a_out << "x = " << a_this.v0()
0216         << ",y = " << a_this.v1();
0217   return a_out;
0218 }
0219 
0220 }
0221 
0222 #endif