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