MultiVector.hpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 #ifndef MULTIVECTOR_HPP
00040 #define MULTIVECTOR_HPP
00041
00042 #include "rtt-config.h"
00043
00044 #include <ostream>
00045 #ifdef OS_HAVE_STREAMS
00046 #include <sstream>
00047 #endif
00048
00049 #include <vector>
00050
00051 #ifdef ORO_PRAGMA_INTERFACE
00052 #pragma interface
00053 #endif
00054
00055 namespace RTT
00056 {
00057
00070 template <unsigned S = 6, class T = double>
00071 struct MultiVector
00072 {
00076 enum Size {size = S};
00077
00082 typedef T DataType[ S ];
00083
00088 DataType data;
00089
00093 operator const T* () const
00094 {
00095 return data;
00096 }
00097
00101 operator T&()
00102 {
00103 return *data;
00104 }
00105
00112 MultiVector( const T d )
00113 {
00114 for ( unsigned int i = 0; i < S;++i )
00115 data[ i ] = d;
00116 }
00117
00121 MultiVector()
00122 {
00123 for ( unsigned int i = 0; i < S;++i )
00124 data[ i ] = 0;
00125 }
00126
00133 template<class Alloc>
00134 MultiVector(const std::vector<T,Alloc>& vect)
00135 {
00136 for ( unsigned int i = 0; i < S;++i )
00137 if ( i < vect.size() )
00138 data[ i ] = vect[i];
00139 else
00140 data[ i ] = 0;
00141 }
00142
00149 MultiVector& operator += ( const MultiVector& d )
00150 {
00151 for ( unsigned int i = 0; i < S; ++i )
00152 data[ i ] += d.data[ i ];
00153
00154 return *this;
00155 }
00156
00163 MultiVector& operator *= ( const MultiVector& d )
00164 {
00165 for ( unsigned int i = 0; i < S; ++i )
00166 data[ i ] *= d.data[ i ];
00167
00168 return *this;
00169 }
00170
00177 MultiVector& operator *= ( const T d )
00178 {
00179 for ( unsigned int i = 0; i < S; ++i )
00180 data[ i ] *= d;
00181
00182 return *this;
00183 }
00184
00191 MultiVector operator - ( const MultiVector& d ) const
00192 {
00193 MultiVector tmp;
00194
00195 for ( unsigned int i = 0; i < S; ++i )
00196 tmp.data[ i ] = data[ i ] - d.data[ i ];
00197
00198 return tmp;
00199 }
00200
00201 MultiVector operator - () const
00202 {
00203 MultiVector tmp;
00204
00205 for ( unsigned int i = 0; i < S; ++i )
00206 tmp.data[ i ] = - data[ i ];
00207
00208 return tmp;
00209 }
00210
00217 MultiVector operator + ( const MultiVector& d ) const
00218 {
00219 MultiVector tmp;
00220
00221 for ( unsigned int i = 0; i < S; ++i )
00222 tmp[ i ] = data[ i ] + d.data[ i ];
00223
00224 return tmp;
00225 }
00226
00233 MultiVector operator * ( const MultiVector& d ) const
00234 {
00235 MultiVector tmp;
00236
00237 for ( unsigned int i = 0; i < S; ++i )
00238 tmp[ i ] = data[ i ] * d.data[ i ];
00239
00240 return tmp;
00241 }
00242
00243 MultiVector operator / ( const T d ) const
00244 {
00245 MultiVector tmp;
00246
00247 for ( unsigned int i = 0; i < S; ++i )
00248 tmp[ i ] = data[ i ] / d;
00249
00250 return tmp;
00251 }
00252
00259 MultiVector operator * ( const T d ) const
00260 {
00261 MultiVector tmp;
00262
00263 for ( unsigned int i = 0; i < S; ++i )
00264 tmp[ i ] = d * data[ i ];
00265
00266 return tmp;
00267 }
00268
00276 MultiVector& operator = ( const MultiVector& d )
00277 {
00278 for ( unsigned int i = 0; i < S; ++i )
00279 data[ i ] = d.data[ i ];
00280
00281 return *this;
00282 }
00283
00291 bool operator == ( const MultiVector& d )
00292 {
00293 for ( unsigned int i = 0; i < S; ++i )
00294 if (data[ i ] != d.data[ i ])
00295 return false;
00296 return true;
00297 }
00298
00306 bool operator != ( const MultiVector& d )
00307 {
00308 for ( unsigned int i = 0; i < S; ++i )
00309 if (data[ i ] != d.data[ i ])
00310 return true;
00311 return false;
00312 }
00313
00318 template<class Alloc>
00319 void getVector( std::vector<T, Alloc>& vect ) const
00320 {
00321 vect.resize(S);
00322 for ( unsigned int i = 0; i < S; ++i )
00323 vect[i] = data[i];
00324 }
00325
00330 template<class Alloc>
00331 bool setVector(const std::vector<T, Alloc>& vect )
00332 {
00333 if ( vect.size() != S )
00334 return false;
00335 for ( unsigned int i = 0; i < S; ++i )
00336 data[i] = vect[i];
00337 return true;
00338 }
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00363 MultiVector& operator = ( const T d )
00364 {
00365 for ( unsigned int i = 0; i < S; ++i )
00366 data[ i ] = d;
00367
00368 return *this;
00369 }
00370
00377 T& operator[] ( int i )
00378 {
00379 return data[ i ];
00380 }
00381 };
00382
00383 template<unsigned S, typename D>
00384 MultiVector<S,D> operator * ( const D d, const MultiVector<S,D>& v )
00385 {
00386 return v*d;
00387 }
00388
00389 template<unsigned S, typename D>
00390 MultiVector<S,D> operator + ( const D d, const MultiVector<S,D>& v )
00391 {
00392 return v+d;
00393 }
00394
00395 template<unsigned S, typename D>
00396 MultiVector<S,D> operator - ( const D d, const MultiVector<S,D>& v )
00397 {
00398 return v-d;
00399 }
00400
00401
00405 typedef MultiVector<6, double> Double6D;
00406
00410 typedef MultiVector<6, int> Int6D;
00411
00415 typedef MultiVector<6, bool> Bool6D;
00416
00420 typedef MultiVector<6, long> Long6D;
00421
00422 extern template class MultiVector<6, double>;
00423 extern template class MultiVector<6, int>;
00424 extern template class MultiVector<6, bool>;
00425 extern template class MultiVector<6, long>;
00426
00430 template <unsigned int S, class T>
00431 std::ostream &operator<<(std::ostream &os, MultiVector<S,T> &q)
00432 {
00433 #ifdef OS_HAVE_STREAMS
00434 std::stringstream ss;
00435 ss << "(";
00436 for (unsigned int i = 0; i < (S - 1) ; i++) {
00437 ss << q[i] << ", ";
00438 }
00439 ss << q[ S - 1 ] << ")";
00440 os << ss.str();
00441 #endif
00442 return os;
00443 }
00444
00448 template <unsigned int S, class T>
00449 std::istream &operator>>(std::istream &os, MultiVector<S,T> &q)
00450 {
00451 #ifdef OS_HAVE_STREAMS
00452 MultiVector<S, T> p;
00453 char c;
00454 os >> c;
00455 for (unsigned int i = 0; i < (S - 1) ; i++) {
00456 os >> p[i];
00457 os >> c;
00458 os >> c;
00459 }
00460 os >> p[ S - 1 ];
00461 os >> c;
00462 if ( os )
00463 q = p;
00464 #endif
00465 return os;
00466 }
00467
00468 }
00469
00470 #endif