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