| 39 |  |  | 
| 40 |  | namespace oopse { | 
| 41 |  |  | 
| 42 | + | const double epsilon = 0.000001; | 
| 43 | + |  | 
| 44 | + | template<typename T> | 
| 45 | + | inline bool equal(T e1, T e2) { | 
| 46 | + | return e1 == e2; | 
| 47 | + | } | 
| 48 | + |  | 
| 49 | + | template<> | 
| 50 | + | inline bool equal(float e1, float e2) { | 
| 51 | + | return fabs(e1 - e2) < epsilon; | 
| 52 | + | } | 
| 53 | + |  | 
| 54 | + | template<> | 
| 55 | + | inline bool equal(double e1, double e2) { | 
| 56 | + | return fabs(e1 - e2) < epsilon; | 
| 57 | + | } | 
| 58 | + |  | 
| 59 |  | /** | 
| 60 |  | * @class Vector Vector.hpp "math/Vector.hpp" | 
| 61 |  | * @brief Fix length vector class | 
| 130 |  | inline  const double& operator()(unsigned int i) const { | 
| 131 |  | assert( i < Dim); | 
| 132 |  | return data_[i]; | 
| 133 | + | } | 
| 134 | + |  | 
| 135 | + | /** | 
| 136 | + | * Tests if this vetor is equal to other vector | 
| 137 | + | * @return true if equal, otherwise return false | 
| 138 | + | * @param v vector to be compared | 
| 139 | + | */ | 
| 140 | + | inline bool operator ==(const Vector<Real, Dim>& v) { | 
| 141 | + |  | 
| 142 | + | for (unsigned int i = 0; i < Dim; i ++) { | 
| 143 | + | if (!equal(data_[i], v[i])) { | 
| 144 | + | return false; | 
| 145 | + | } | 
| 146 | + | } | 
| 147 | + |  | 
| 148 | + | return true; | 
| 149 |  | } | 
| 150 |  |  | 
| 151 | + | /** | 
| 152 | + | * Tests if this vetor is not equal to other vector | 
| 153 | + | * @return true if equal, otherwise return false | 
| 154 | + | * @param v vector to be compared | 
| 155 | + | */ | 
| 156 | + | inline bool operator !=(const Vector<Real, Dim>& v) { | 
| 157 | + | return !(*this == v); | 
| 158 | + | } | 
| 159 | + |  | 
| 160 |  | /** Negates the value of this vector in place. */ | 
| 161 |  | inline void negate() { | 
| 162 |  | data_[0] = -data_[0]; |