/** * Specialize to resize \a result given the size of \a source. */ virtual bool composeTypeImpl(const PropertyBag& bag, typename internal::AssignableDataSource<T>::reference_t result) const { if ( bag.getType() == "Matrix" ) { unsigned int rows = bag.size(); unsigned int cols = 0; // Get values for (unsigned int i = 1; i <= rows ; i++) { std::stringstream out; out << i; Property<PropertyBag>* row_bag = bag.getProperty<PropertyBag>(out.str()); if(row_bag==NULL){ log(Error)<<"Could not read row "<<i<<endlog(); return false; } Property<RowVector> row_p(row_bag->getName(),row_bag->getDescription()); if(!(row_p.getDataSource()->composeType(row_bag->getDataSource()))){ log(Error)<<"Could not decompose row "<<i<<endlog(); return false; } if(row_p.ready()){ if(i==1){ cols = row_p.get().size(); result.resize(rows,cols); } else if(row_p.get().size()!=cols){ log(Error)<<"Row "<<i+1<<" size does not match matrix columns"<<endlog(); return false; } for ( unsigned int j=1; j <= row_p.get().size() ; j++){ result(i,j)=row_p.get()(j); } }else{ log(Error)<<"Property of Row "<<i<<"was not ready for use"<<endlog(); return false; } } }else { log(Error) << "Composing Property< Matrix > :" << " type mismatch, got type '"<< bag.getType() << "', expected type "<<"Matrix."<<endlog(); return false; } return true; }