Orocos Real-Time Toolkit  2.5.0
MultiVector.hpp
00001 /***************************************************************************
00002   tag: Peter Soetens  Thu Oct 10 16:21:19 CEST 2002  MultiVector.hpp
00003 
00004                         MultiVector.hpp -  description
00005                            -------------------
00006     begin                : Thu October 10 2002
00007     copyright            : (C) 2002 Peter Soetens
00008     email                : peter.soetens@mech.kuleuven.ac.be
00009 
00010  ***************************************************************************
00011  *   This library is free software; you can redistribute it and/or         *
00012  *   modify it under the terms of the GNU General Public                   *
00013  *   License as published by the Free Software Foundation;                 *
00014  *   version 2 of the License.                                             *
00015  *                                                                         *
00016  *   As a special exception, you may use this file as part of a free       *
00017  *   software library without restriction.  Specifically, if other files   *
00018  *   instantiate templates or use macros or inline functions from this     *
00019  *   file, or you compile this file and link it with other files to        *
00020  *   produce an executable, this file does not by itself cause the         *
00021  *   resulting executable to be covered by the GNU General Public          *
00022  *   License.  This exception does not however invalidate any other        *
00023  *   reasons why the executable file might be covered by the GNU General   *
00024  *   Public License.                                                       *
00025  *                                                                         *
00026  *   This library is distributed in the hope that it will be useful,       *
00027  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
00028  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU     *
00029  *   Lesser General Public License for more details.                       *
00030  *                                                                         *
00031  *   You should have received a copy of the GNU General Public             *
00032  *   License along with this library; if not, write to the Free Software   *
00033  *   Foundation, Inc., 59 Temple Place,                                    *
00034  *   Suite 330, Boston, MA  02111-1307  USA                                *
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 { namespace extras {
00057 
00058 
00071     template <unsigned S = 6, class T = double>
00072     struct MultiVector
00073     {
00077         enum Size {size = S};
00078 
00083         typedef T DataType[ S ];
00084 
00089         DataType data;
00090 
00094         operator const T* () const
00095         {
00096             return data;
00097         }
00098 
00102         operator T&()
00103         {
00104             return *data;
00105         }
00106 
00113         MultiVector( const T d )
00114         {
00115             for ( unsigned int i = 0; i < S;++i )
00116                 data[ i ] = d;
00117         }
00118 
00122         MultiVector()
00123         {
00124             for ( unsigned int i = 0; i < S;++i )
00125                 data[ i ] = 0;
00126         }
00127 
00134         template<class Alloc>
00135         MultiVector(const std::vector<T,Alloc>& vect)
00136         {
00137             for ( unsigned int i = 0; i < S;++i )
00138                 if ( i < vect.size() )
00139                     data[ i ] = vect[i];
00140                 else
00141                     data[ i ] = 0;
00142         }
00143 
00150         MultiVector& operator += ( const MultiVector& d )
00151         {
00152             for ( unsigned int i = 0; i < S; ++i )
00153                 data[ i ] += d.data[ i ];
00154 
00155             return *this;
00156         }
00157 
00164         MultiVector& operator *= ( const MultiVector& d )
00165         {
00166             for ( unsigned int i = 0; i < S; ++i )
00167                 data[ i ] *= d.data[ i ];
00168 
00169             return *this;
00170         }
00171 
00178         MultiVector& operator *= ( const T d )
00179         {
00180             for ( unsigned int i = 0; i < S; ++i )
00181                 data[ i ] *= d;
00182 
00183             return *this;
00184         }
00185 
00192         MultiVector operator - ( const MultiVector& d ) const
00193         {
00194             MultiVector tmp;
00195 
00196             for ( unsigned int i = 0; i < S; ++i )
00197                 tmp.data[ i ] = data[ i ] - d.data[ i ];
00198 
00199             return tmp;
00200         }
00201 
00202         MultiVector operator - () const
00203         {
00204             MultiVector tmp;
00205 
00206             for ( unsigned int i = 0; i < S; ++i )
00207                 tmp.data[ i ] = - data[ i ];
00208 
00209             return tmp;
00210         }
00211 
00218         MultiVector operator + ( const MultiVector& d ) const
00219         {
00220             MultiVector tmp;
00221 
00222             for ( unsigned int i = 0; i < S; ++i )
00223                 tmp[ i ] = data[ i ] + d.data[ i ];
00224 
00225             return tmp;
00226         }
00227 
00234         MultiVector operator * ( const MultiVector& d ) const
00235         {
00236             MultiVector tmp;
00237 
00238             for ( unsigned int i = 0; i < S; ++i )
00239                 tmp[ i ] = data[ i ] * d.data[ i ];
00240 
00241             return tmp;
00242         }
00243 
00244         MultiVector operator / ( const T d ) const
00245         {
00246             MultiVector tmp;
00247 
00248             for ( unsigned int i = 0; i < S; ++i )
00249                 tmp[ i ] = data[ i ] / d;
00250 
00251             return tmp;
00252         }
00253 
00260         MultiVector operator * ( const T d ) const
00261         {
00262             MultiVector tmp;
00263 
00264             for ( unsigned int i = 0; i < S; ++i )
00265                 tmp[ i ] = d * data[ i ];
00266 
00267             return tmp;
00268         }
00269 
00277         MultiVector& operator = ( const MultiVector& d )
00278         {
00279             for ( unsigned int i = 0; i < S; ++i )
00280                 data[ i ] = d.data[ i ];
00281 
00282             return *this;
00283         }
00284 
00292         bool operator == ( const MultiVector& d )
00293         {
00294             for ( unsigned int i = 0; i < S; ++i )
00295                 if (data[ i ] != d.data[ i ])
00296                     return false;
00297             return true;
00298         }
00299 
00307         bool operator != ( const MultiVector& d )
00308         {
00309             for ( unsigned int i = 0; i < S; ++i )
00310                 if (data[ i ] != d.data[ i ])
00311                     return true;
00312             return false;
00313         }
00314 
00319         template<class Alloc>
00320         void getVector( std::vector<T, Alloc>& vect ) const
00321         {
00322             vect.resize(S);
00323             for ( unsigned int i = 0; i < S; ++i )
00324                 vect[i] = data[i];
00325         }
00326 
00331         template<class Alloc>
00332         bool setVector(const std::vector<T, Alloc>& vect )
00333         {
00334             if ( vect.size() != S )
00335                 return false;
00336             for ( unsigned int i = 0; i < S; ++i )
00337                 data[i] = vect[i];
00338             return true;
00339         }
00340 
00341         /*
00342          * This is just plain wrong since assignment with integer
00343          * would call this method.
00344          * Actually, it's the standard that's wrong for doing
00345          * int == pointer
00346          *
00347             MultiVector& operator = (const DataType d)
00348             {
00349         //        if (d != 0)
00350                     for (int i=0; i<S; ++i)
00351                         data[i] = d[i];
00352                 return *this;
00353             }
00354          *
00355          */
00356 
00364         MultiVector& operator = ( const T d )
00365         {
00366             for ( unsigned int i = 0; i < S; ++i )
00367                 data[ i ] = d;
00368 
00369             return *this;
00370         }
00371 
00378         //replaced int parameter with unsigned int to unconfuse MSVC
00379         T& operator[] ( unsigned int i )
00380         {
00381             return data[ i ];
00382         }
00383     };
00384 
00385     template<unsigned S, typename D>
00386     MultiVector<S,D> operator * ( const D d, const MultiVector<S,D>& v )
00387     {
00388         return v*d;
00389     }
00390 
00391     template<unsigned S, typename D>
00392     MultiVector<S,D> operator + ( const D d, const MultiVector<S,D>& v )
00393     {
00394         return v+d;
00395     }
00396 
00397     template<unsigned S, typename D>
00398     MultiVector<S,D> operator - ( const D d, const MultiVector<S,D>& v )
00399     {
00400         return v-d;
00401     }
00402 
00403 
00407     typedef MultiVector<6, double> Double6D;
00408 
00412     typedef MultiVector<6, int> Int6D;
00413 
00417     typedef MultiVector<6, bool> Bool6D;
00418 
00422     typedef MultiVector<6, long> Long6D;
00423 
00427     template <unsigned int S, class T>
00428     std::ostream &operator<<(std::ostream &os, MultiVector<S,T> &q)
00429     {
00430 #ifdef OS_HAVE_STREAMS
00431         std::stringstream ss;
00432         ss << "(";
00433         for (unsigned int i = 0; i < (S - 1) ; i++) {
00434             ss << q[i] << ", ";
00435         }
00436         ss << q[ S - 1 ] << ")";
00437         os << ss.str();
00438 #endif
00439         return os;
00440     }
00441 
00445     template <unsigned int S, class T>
00446     std::istream &operator>>(std::istream &os, MultiVector<S,T> &q)
00447     {
00448 #ifdef OS_HAVE_STREAMS
00449         MultiVector<S, T> p;
00450         char c;
00451         os >> c; // '('
00452         for (unsigned int i = 0; i < (S - 1) ; i++) {
00453             os >> p[i];
00454             os >> c; // ','
00455             os >> c; // ' '
00456         }
00457         os >> p[ S - 1 ];
00458         os >> c; // ')';
00459         if ( os )
00460             q = p;
00461 #endif
00462         return os;
00463     }
00464 
00465 }}
00466 
00467 #endif