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