Go to the documentation of this file.00001 #ifndef RTT_TEMPLATE_TYPE_FACTORY
00002 #define RTT_TEMPLATE_TYPE_FACTORY
00003
00004 #include "ValueFactory.hpp"
00005 #include "../Property.hpp"
00006 #include "../Attribute.hpp"
00007 #include "../Logger.hpp"
00008 #include "../rtt-config.h"
00009
00010 namespace RTT
00011 {
00012 namespace types {
00013
00014 template<class T>
00015 class TemplateValueFactory
00016 : public ValueFactory
00017 {
00018 public:
00019 typedef T DataType;
00020 base::AttributeBase* buildConstant(std::string name, base::DataSourceBase::shared_ptr dsb) const
00021 {
00022 typename internal::DataSource<DataType>::shared_ptr res =
00023 boost::dynamic_pointer_cast< internal::DataSource<DataType> >( internal::DataSourceTypeInfo<DataType>::getTypeInfo()->convert(dsb));
00024 if ( res ) {
00025 res->get();
00026
00027 return new Constant<DataType>( name, res->rvalue() );
00028 }
00029 else
00030 return 0;
00031 }
00032
00033 base::AttributeBase* buildVariable(std::string name) const
00034 {
00035
00036
00037 return new Attribute<T>( name, new internal::UnboundDataSource<internal::ValueDataSource<T> >() );
00038 }
00039
00040 base::AttributeBase* buildAttribute( std::string name, base::DataSourceBase::shared_ptr in) const
00041 {
00042 typename internal::AssignableDataSource<DataType>::shared_ptr ds;
00043 if ( !in )
00044 ds = new internal::ValueDataSource<DataType>();
00045 else
00046 ds = internal::AssignableDataSource<DataType>::narrow( in.get() );
00047 if (!ds)
00048 return 0;
00049
00050
00051 return new Attribute<DataType>( name, ds.get() );
00052 }
00053
00054 base::AttributeBase* buildAlias(std::string name, base::DataSourceBase::shared_ptr in ) const
00055 {
00056 typename internal::DataSource<T>::shared_ptr ds = boost::dynamic_pointer_cast< internal::DataSource<T> >( internal::DataSourceTypeInfo<T>::getTypeInfo()->convert(in) );
00057 if ( ! ds )
00058 return 0;
00059 return new Alias( name, ds );
00060 }
00061
00062 base::DataSourceBase::shared_ptr buildActionAlias(base::ActionInterface* action, base::DataSourceBase::shared_ptr in) const
00063 {
00064 typename internal::AssignableDataSource<T>::shared_ptr ads = boost::dynamic_pointer_cast< internal::AssignableDataSource<T> >( in );
00065 if ( ads )
00066 return new internal::ActionAliasAssignableDataSource<T>(action, ads.get());
00067
00068 typename internal::DataSource<T>::shared_ptr ds = boost::dynamic_pointer_cast< internal::DataSource<T> >( in );
00069 if ( ! ds )
00070 return 0;
00071 return new internal::ActionAliasDataSource<T>(action, ds.get());
00072 }
00073
00074 virtual base::PropertyBase* buildProperty(const std::string& name, const std::string& desc, base::DataSourceBase::shared_ptr source = 0) const {
00075 if (source) {
00076 typename internal::AssignableDataSource<DataType>::shared_ptr ad
00077 = boost::dynamic_pointer_cast< internal::AssignableDataSource<DataType> >( source );
00078 if (ad)
00079 return new Property<DataType>(name, desc, ad );
00080 else {
00081
00082 }
00083 }
00084 return new Property<DataType>(name, desc, DataType());
00085 }
00086
00087 virtual base::DataSourceBase::shared_ptr buildValue() const {
00088 return new internal::ValueDataSource<DataType>();
00089 }
00090 virtual base::DataSourceBase::shared_ptr buildReference(void* ptr) const {
00091 return new internal::ReferenceDataSource<DataType>(*static_cast<DataType*>(ptr));
00092 }
00093
00094 };
00095
00096 }
00097 }
00098
00099 #endif