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