Orocos Real-Time Toolkit  2.5.0
MultiVectorComposition.hpp
00001 /***************************************************************************
00002   tag: Peter Soetens  Sat May 21 20:15:51 CEST 2005  MultiVectorComposition.hpp
00003 
00004                         MultiVectorComposition.hpp -  description
00005                            -------------------
00006     begin                : Sat May 21 2005
00007     copyright            : (C) 2005 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 
00040 #ifndef MULTIVECTOR_COMPOSITION_HPP
00041 #define MULTIVECTOR_COMPOSITION_HPP
00042 
00043 #include "MultiVector.hpp"
00044 #include "../Property.hpp"
00045 #include "../PropertyBag.hpp"
00046 #include "../Logger.hpp"
00047 
00048 namespace RTT
00049 { namespace extras {
00050 
00055     template<class T, int S>
00056     void decomposeProperty(base::PropertyIntrospection *pi, const Property< MultiVector<S, T> >& c)
00057     {
00058         Property<PropertyBag> result(c.getName(),c.getDescription(), PropertyBag("MultiVector") );
00059 
00060         MultiVector<S,T> vec = c;
00061         Property<int>* dimension = new Property<int>("Size","Size of the MultiVector", vec.size() );
00062 
00063         result.value().add( dimension );
00064 
00065         std::stringstream data_name;
00066 
00067         for ( int i=0; i < dimension->get() ; i++)
00068             {
00069                 data_name  << i;
00070                 result.value().add( new Property<T>(data_name.str(),"",vec[i]) ); // Put variables in the bag
00071                 data_name.str("");
00072             }
00073 
00074         pi->introspect(result); // introspect the bag.
00075         deleteProperties( result.value() );
00076 
00077     }
00078 
00079     template<class T, int S>
00080     void decomposeProperty(base::PropertyIntrospection *pi, const Property< const MultiVector<S, T>& >& c)
00081     {
00082         Property<PropertyBag> result(c.getName(),c.getDescription(), PropertyBag("MultiVector") );
00083 
00084         MultiVector<S,T> vec = c;
00085         Property<int>* dimension = new Property<int>("Size","Size of the MultiVector", vec.size() );
00086 
00087         result.value().add( dimension );
00088 
00089         std::stringstream data_name;
00090 
00091         for ( int i=0; i < dimension->get() ; i++)
00092             {
00093                 data_name  << i;
00094                 result.value().add( new Property<T>(data_name.str(),"",vec[i]) ); // Put variables in the bag
00095                 data_name.str("");
00096             }
00097 
00098         pi->introspect(result); // introspect the bag.
00099         deleteProperties( result.value() );
00100 
00101     }
00102 
00106     template<class T, int S>
00107     bool composeProperty(const PropertyBag& bag, Property<MultiVector<S,T> >& result)
00108     {
00109         base::PropertyBase* v_base = bag.find( result.getName() );
00110         if ( v_base == 0 )
00111             return false;
00112 
00113         Property<PropertyBag>* v_bag = dynamic_cast< Property<PropertyBag>* >( v_base );
00114 
00115         if (v_bag != 0 && v_bag->get().getType() == "MultiVector")
00116             {
00117                 Property<T>* comp;
00118 
00119                 Property<int>* dim;
00120                 v_base = v_bag->get().find("Size");
00121                 if ( v_base == 0 ) {
00122                     Logger::log() << Logger::Error << "In PropertyBag for Property< MultiVector<S,T> > :"
00123                                   << result.getName() << " : could not find property \"Size\"."<<Logger::endl;
00124                     return false;
00125                 }
00126                 dim = dynamic_cast< Property<int>* >(v_base);
00127                 if ( dim == 0) {
00128                     Logger::log() << Logger::Error << "In PropertyBag for Property< MultiVector<S,T> > :"
00129                                   << result.getName() << " : Expected \"Size\" to be of type short."<<Logger::endl;
00130                     return false;
00131                 }
00132                 int dimension = dim->get();
00133 
00134                 std::stringstream data_name;
00135 
00136                 // Get values
00137                 for (int i = 0; i < dimension ; i++)
00138                     {
00139                         data_name  << i;
00140                         base::PropertyBase* element = v_bag->get().find( data_name.str() );
00141                         if ( element == 0 ) {
00142                             Logger::log() << Logger::Error << "Aborting composition of Property< MultiVector<S,T> > "<<result.getName()
00143                                           << ": Data element "<< data_name.str() <<" not found !"
00144                                           <<Logger::endl;
00145                             return false;
00146                         }
00147                         comp = dynamic_cast< Property<T>* >( element );
00148                         if ( comp == 0 ) {
00149                             base::DataSourceBase::shared_ptr ds = element->getDataSource();
00150                             Logger::log() << Logger::Error << "Aborting composition of Property< MultiVector<S,T> > "<<result.getName()
00151                                           << ": Exptected data element "<< data_name.str() << " to be of type "<<internal::DataSource<T>::GetType()
00152                                           <<" got type " << element->getType()
00153                                           <<Logger::endl;
00154                             return false;
00155                         }
00156                         result.value()[i] = comp->get();
00157 
00158                         data_name.str("");
00159                     }
00160             }
00161         else
00162             {
00163                 if ( v_bag != 0 ) {
00164                     Logger::log() << Logger::Error << "Composing Property< MultiVector<S,T> > :"
00165                                   << result.getName() << " : type mismatch, got type '"<< v_bag->get().getType()  <<"'"<<Logger::endl;
00166                 } else {
00167                     Logger::log() << Logger::Error << "Composing Property< MultiVector<S,T> > :"
00168                                   << result.getName() << " : not a PropertyBag."<<Logger::endl;
00169                 }
00170                 // cerr << "\033[1;33mWarning: Bag was empty! \033[0m" << endl;
00171                 Logger::log() << Logger::Debug << "Could not update Property< MultiVector<S,T> > : "<<result.getName()<<Logger::endl;
00172                 return false;
00173             }
00174         return true;
00175 
00176     }
00177 
00178 }}; // namespace RTT
00179 
00180 
00181 #endif