Back to home page

EIC code displayed by LXR

 
 

    


Warning, /include/Geant4/tools/lina/vec4 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_vec4
0005 #define tools_vec4
0006 
0007 #include <cstddef> //size_t
0008 
0009 namespace tools {
0010 
0011 template <class T>
0012 class vec4 {
0013 protected:
0014   static T zero() {return T();}
0015   static T minus_one() {return T(-1);}
0016 public:
0017   typedef T elem_t;
0018   unsigned int dimension() const {return 4;}
0019 public:
0020   vec4(){
0021     m_data[0] = T();
0022     m_data[1] = T();
0023     m_data[2] = T();
0024     m_data[3] = T();
0025   }
0026   vec4(const T a_vec[4]) {
0027     m_data[0] = a_vec[0];
0028     m_data[1] = a_vec[1];
0029     m_data[2] = a_vec[2];
0030     m_data[3] = a_vec[3];
0031   }
0032   vec4(const T& a0,const T& a1,const T& a2,const T& a3) {
0033     m_data[0] = a0;
0034     m_data[1] = a1;
0035     m_data[2] = a2;
0036     m_data[3] = a3;
0037   }
0038   virtual ~vec4() {
0039   }
0040 public:
0041   vec4(const vec4& a_from){
0042     m_data[0] = a_from.m_data[0];
0043     m_data[1] = a_from.m_data[1];
0044     m_data[2] = a_from.m_data[2];
0045     m_data[3] = a_from.m_data[3];
0046   }
0047   vec4& operator=(const vec4& a_from) {
0048     m_data[0] = a_from.m_data[0];
0049     m_data[1] = a_from.m_data[1];
0050     m_data[2] = a_from.m_data[2];
0051     m_data[3] = a_from.m_data[3];
0052     return *this;
0053   }
0054 public:
0055   const T& v0() const { return m_data[0];}
0056   const T& v1() const { return m_data[1];}
0057   const T& v2() const { return m_data[2];}
0058   const T& v3() const { return m_data[3];}
0059 
0060   void v0(const T& a_value) { m_data[0] = a_value;}
0061   void v1(const T& a_value) { m_data[1] = a_value;}
0062   void v2(const T& a_value) { m_data[2] = a_value;}
0063   void v3(const T& a_value) { m_data[3] = a_value;}
0064 
0065   const T& x() const { return m_data[0];}
0066   const T& y() const { return m_data[1];}
0067   const T& z() const { return m_data[2];}
0068   const T& t() const { return m_data[3];}
0069 
0070   void set_value(const T& a0,const T& a1,const T& a2,const T& a3) {
0071     m_data[0] = a0;
0072     m_data[1] = a1;
0073     m_data[2] = a2;
0074     m_data[3] = a3;
0075   }
0076   void set_value(const T aV[4]) {
0077     m_data[0] = aV[0];
0078     m_data[1] = aV[1];
0079     m_data[2] = aV[2];
0080     m_data[3] = aV[3];
0081   }
0082   void value(T& a0,T& a1,T& a2,T& a3) const {
0083     a0 = m_data[0];
0084     a1 = m_data[1];
0085     a2 = m_data[2];
0086     a3 = m_data[3];
0087   }
0088 
0089   bool set_value(unsigned int a_index,const T& a_value) {
0090     if(a_index>=4) return false;
0091     m_data[a_index] = a_value;
0092     return true;
0093   }
0094 
0095   T length(T(*a_sqrt)(T)) const {
0096     return a_sqrt(m_data[0]*m_data[0]+m_data[1]*m_data[1]+m_data[2]*m_data[2]+m_data[3]*m_data[3]);
0097   }
0098 
0099   T normalize(T(*a_sqrt)(T)) {
0100     T norme = length(a_sqrt);
0101     if(norme==T()) return T();
0102     divide(norme);
0103     return norme;
0104   }
0105 
0106   bool equal(const vec4& a_vec) const {
0107     if(m_data[0]!=a_vec.m_data[0]) return false;
0108     if(m_data[1]!=a_vec.m_data[1]) return false;
0109     if(m_data[2]!=a_vec.m_data[2]) return false;
0110     if(m_data[3]!=a_vec.m_data[3]) return false;
0111     return true;
0112   }
0113   bool equal(const vec4& a_vec,const T& a_epsil) const {
0114     T* tp = (T*)m_data;
0115     T* ap = (T*)a_vec.m_data;
0116     for(unsigned int i=0;i<4;i++,tp++,ap++) {
0117       T diff = (*tp) - (*ap);
0118       if(diff<zero()) diff *= minus_one();
0119       if(diff>=a_epsil) return false;
0120     }
0121     return true;
0122   }
0123 
0124   bool is_proportional(const vec4& a_vec,T& a_factor) const {
0125     // If true, then : a_vec = a_factor * this.
0126     a_factor = zero();
0127     bool first = true;
0128     T* tp = (T*)m_data;
0129     T* ap = (T*)a_vec.m_data;
0130     for(unsigned int i=0;i<4;i++,tp++,ap++) {
0131              if( ((*tp)==zero()) && ((*ap)==zero())) {
0132         continue;
0133       } else if( ((*tp)!=zero()) && ((*ap)==zero())) {
0134         return false;
0135       } else if( ((*tp)==zero()) && ((*ap)!=zero())) {
0136         return false;
0137       } else {
0138         if(first) {
0139           a_factor = (*ap)/(*tp);
0140           first = false;
0141         } else {
0142           if((*ap)!=(*tp)*a_factor) return false;
0143         }
0144       }
0145     }
0146     return true;
0147   }
0148 
0149   void multiply(const T& a_T) {
0150     m_data[0] *= a_T;
0151     m_data[1] *= a_T;
0152     m_data[2] *= a_T;
0153     m_data[3] *= a_T;
0154   }
0155 
0156   bool divide(const T& a_T) {
0157     if(a_T==T()) return false;
0158     m_data[0] /= a_T;
0159     m_data[1] /= a_T;
0160     m_data[2] /= a_T;
0161     m_data[3] /= a_T;
0162     return true;
0163   }
0164 
0165   void add(const vec4& a_v) {
0166     m_data[0] += a_v.m_data[0];
0167     m_data[1] += a_v.m_data[1];
0168     m_data[2] += a_v.m_data[2];
0169     m_data[3] += a_v.m_data[3];
0170   }
0171 
0172   void add(const T& a0,const T& a1,const T& a2,const T& a3) {
0173     m_data[0] += a0;
0174     m_data[1] += a1;
0175     m_data[2] += a2;
0176     m_data[3] += a3;
0177   }
0178 
0179   void subtract(const vec4& a_v) {
0180     m_data[0] -= a_v.m_data[0];
0181     m_data[1] -= a_v.m_data[1];
0182     m_data[2] -= a_v.m_data[2];
0183     m_data[3] -= a_v.m_data[3];
0184   }
0185 
0186   void subtract(const T& a0,const T& a1,const T& a2,const T& a3) {
0187     m_data[0] -= a0;
0188     m_data[1] -= a1;
0189     m_data[2] -= a2;
0190     m_data[3] -= a3;
0191   }
0192 
0193 public: //operators
0194   T& operator[](size_t a_index) {
0195     //WARNING : no check on a_index.
0196     return m_data[a_index];
0197   }
0198   const T& operator[](size_t a_index) const {
0199     //WARNING : no check on a_index.
0200     return m_data[a_index];
0201   }
0202 
0203   vec4 operator+(const vec4& a_v) const {
0204     return vec4(m_data[0]+a_v.m_data[0],
0205                 m_data[1]+a_v.m_data[1],
0206                 m_data[2]+a_v.m_data[2],
0207                 m_data[3]+a_v.m_data[3]);
0208   }
0209 
0210   vec4 operator-(const vec4& a_v) const {
0211     return vec4(m_data[0]-a_v.m_data[0],
0212                 m_data[1]-a_v.m_data[1],
0213                 m_data[2]-a_v.m_data[2],
0214                 m_data[3]-a_v.m_data[3]);
0215   }
0216 
0217   vec4 operator*(const T& a_v) const {
0218     return vec4(m_data[0]*a_v,
0219                 m_data[1]*a_v,
0220                 m_data[2]*a_v,
0221                 m_data[3]*a_v);
0222   }
0223 
0224   bool operator==(const vec4& a_v) const {return equal(a_v);}
0225   bool operator!=(const vec4& a_v) const {return !operator==(a_v);}
0226 
0227 public: //for tools/sg/sf_vec
0228   typedef unsigned int size_type;
0229   size_type size() const {return 4;}
0230   const T* data() const {return m_data;}
0231 protected:
0232   T m_data[4];
0233 private:static void check_instantiation() {vec4<float> v;}
0234 };
0235 
0236 //for sf, mf :
0237 template <class T>
0238 inline const T* get_data(const vec4<T>& a_v) {return a_v.data();}
0239 
0240 }
0241 
0242 #include <ostream>
0243 
0244 namespace tools {
0245 
0246 // for sf_vec::dump().
0247 template <class T>
0248 inline std::ostream& operator<<(std::ostream& a_out,const vec4<T>& a_this){
0249   a_out << "x = " << a_this.v0()
0250         << ",y = " << a_this.v1()
0251         << ",z = " << a_this.v2()
0252         << ",t = " << a_this.v3();
0253   return a_out;
0254 }
0255 
0256 }
0257 
0258 #endif