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 #ifndef VECTOR_TEMPLATE_COMPOSITION_HPP
00035 #define VECTOR_TEMPLATE_COMPOSITION_HPP
00036
00037 #include <rtt/Property.hpp>
00038 #include <rtt/PropertyBag.hpp>
00039 #include <rtt/TemplateTypeInfo.hpp>
00040 #include <rtt/Types.hpp>
00041 #include <rtt/Logger.hpp>
00042 #include <ostream>
00043 #include <sstream>
00044 #include <vector>
00045
00046 namespace RTT
00047 {
00048 class PropertyIntrospection;
00049
00056 template<class T>
00057 void decomposeProperty(const std::vector<T>& vec, PropertyBag& targetbag)
00058 {
00059 targetbag.setType("list");
00060 int dimension = vec.size();
00061 std::string str;
00062
00063 assert( targetbag.empty() );
00064
00065 for ( int i=0; i < dimension ; i++){
00066 std::stringstream out;
00067 out << i+1;
00068 str = out.str();
00069 targetbag.add( new Property<T>("Element " + str, str +"th element of list",vec[i]) );
00070 }
00071 };
00076 template<class T>
00077 bool composeProperty(const PropertyBag& bag, std::vector<T>& result)
00078 {
00079 if ( bag.getType() == "list" ) {
00080 int dimension = bag.size();
00081 Logger::log() << Logger::Info << "bag size " << dimension <<Logger::endl;
00082 result.resize( dimension );
00083
00084
00085 for (int i = 0; i < dimension ; i++) {
00086 PropertyBase* element = bag.getItem( i );
00087
00088 log(Debug)<<element->getName()<<", "<< element->getDescription()<<endlog();
00089
00090 Property<T> my_property_t (element->getName(),element->getDescription());
00091 if(my_property_t.getType()!=element->getType())
00092 log(Error)<< "Type of "<< element->getName() << " does not match type of list"<<endlog();
00093 else{
00094 my_property_t.getTypeInfo()->composeType(element->getDataSource(),my_property_t.getDataSource());
00095 result[ i ] = my_property_t.get();
00096 }
00097 }
00098 }
00099 else {
00100 Logger::log() << Logger::Error << "Composing Property< std::vector<T> > :"
00101 << " type mismatch, got type '"<< bag.getType()
00102 << "', expected type 'list'."<<Logger::endl;
00103 return false;
00104 }
00105 return true;
00106 };
00107 template <typename T>
00108 struct StdVectorTemplateTypeInfo
00109 : public TemplateContainerTypeInfo<std::vector<T>, int, T, ArrayIndexChecker<std::vector<T> >, SizeAssignChecker<std::vector<T> >, false >
00110 {
00111 StdVectorTemplateTypeInfo<T>( std::string name )
00112 : TemplateContainerTypeInfo<std::vector<T>, int, T, ArrayIndexChecker<std::vector<T> >, SizeAssignChecker<std::vector<T> >, false >(name)
00113 {
00114 };
00115
00116 bool decomposeTypeImpl(const std::vector<T>& vec, PropertyBag& targetbag) const
00117 {
00118 decomposeProperty<T>( vec, targetbag );
00119 return true;
00120 };
00121
00122 bool composeTypeImpl(const PropertyBag& bag, std::vector<T>& result) const
00123 {
00124 return composeProperty<T>( bag, result );
00125 }
00126
00127 };
00128
00129 };
00130 #endif
00131