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
00035
00036
00037
00038
00039 #ifndef ORO_TYPEINFO_NAME_HPP
00040 #define ORO_TYPEINFO_NAME_HPP
00041
00042 #include "Types.hpp"
00043 #include "../internal/DataSourceTypeInfo.hpp"
00044 #include "../Logger.hpp"
00045 #include "../rtt-config.h"
00046
00047 namespace RTT
00048 { namespace types {
00049
00053 class RTT_API EmptyTypeInfo
00054 : public TypeInfo
00055 {
00056 protected:
00057 const std::string tname;
00058 public:
00059 EmptyTypeInfo(std::string name)
00060 : tname(name)
00061 {
00062 }
00063
00064 using TypeInfo::buildConstant;
00065 using TypeInfo::buildVariable;
00066
00067 bool installTypeInfoObject() {
00068 return true;
00069 }
00070
00071 base::AttributeBase* buildConstant(std::string name,base::DataSourceBase::shared_ptr dsb) const
00072 {
00073 Logger::In loc("TypeInfoName");
00074 Logger::log() << Logger::Error << "Can not build Constant of "<<tname<<"."<<Logger::endl;
00075 return 0;
00076 }
00077
00078 base::AttributeBase* buildVariable(std::string name) const
00079 {
00080 Logger::In loc("TypeInfoName");
00081 Logger::log() << Logger::Error << "Can not build Variable of "<<tname<<"."<<Logger::endl;
00082 return 0;
00083 }
00084
00085 base::AttributeBase* buildAttribute(std::string name, base::DataSourceBase::shared_ptr in) const
00086 {
00087 Logger::In loc("TypeInfoName");
00088 Logger::log() << Logger::Error << "Can not build Attribute of "<<tname<<"."<<Logger::endl;
00089 return 0;
00090 }
00091
00092 base::AttributeBase* buildAlias(std::string name, base::DataSourceBase::shared_ptr in ) const
00093 {
00094 Logger::In loc("TypeInfoName");
00095 Logger::log() << Logger::Error << "Can not build Alias of "<<tname<<"."<<Logger::endl;
00096 return 0;
00097 }
00098
00099 base::DataSourceBase::shared_ptr buildActionAlias(base::ActionInterface* act, base::DataSourceBase::shared_ptr in ) const
00100 {
00101 Logger::In loc("TypeInfoName");
00102 Logger::log() << Logger::Error << "Can not build ActionAlias of "<<tname<<"."<<Logger::endl;
00103 return 0;
00104 }
00105
00106 virtual const std::string& getTypeName() const { return tname; }
00107
00108 virtual base::PropertyBase* buildProperty(const std::string& name, const std::string& desc, base::DataSourceBase::shared_ptr source = 0) const {
00109 Logger::In loc("TypeInfoName");
00110 Logger::log() << Logger::Error << "Can not build Property of "<<tname<<"."<<Logger::endl;
00111 return 0;
00112 }
00113
00114 virtual base::DataSourceBase::shared_ptr buildValue() const {
00115 Logger::In loc("TypeInfoName");
00116 Logger::log() << Logger::Error << "Can not build internal::ValueDataSource of "<<tname<<"."<<Logger::endl;
00117 return 0;
00118 }
00119
00120 virtual base::DataSourceBase::shared_ptr buildReference(void*) const {
00121 Logger::In loc("TypeInfoName");
00122 Logger::log() << Logger::Error << "Can not build internal::ReferenceDataSource of "<<tname<<"."<<Logger::endl;
00123 return 0;
00124 }
00125
00126
00127 base::DataSourceBase::shared_ptr construct(const std::vector<base::DataSourceBase::shared_ptr>& ) const {
00128 Logger::In loc("TypeInfoName");
00129 Logger::log() << Logger::Error << "Can not construct value of "<<tname<<"."<<Logger::endl;
00130 return base::DataSourceBase::shared_ptr();
00131 }
00132
00133 virtual base::DataSourceBase::shared_ptr getAssignable(base::DataSourceBase::shared_ptr arg) const {
00134 return base::DataSourceBase::shared_ptr();
00135 }
00136
00137 virtual std::ostream& write( std::ostream& os, base::DataSourceBase::shared_ptr in ) const {
00138 Logger::In loc("TypeInfoName");
00139 #ifdef OS_HAVE_STREAMS
00140 std::string output = std::string("(")+ in->getTypeName() +")";
00141 os << output;
00142 #endif
00143 return os;
00144 }
00145
00146 virtual std::istream& read( std::istream& is, base::DataSourceBase::shared_ptr out ) const {
00147 Logger::In loc("TypeInfoName");
00148 return is;
00149 }
00150
00151 virtual bool isStreamable() const { return false; }
00152
00153 virtual base::DataSourceBase::shared_ptr decomposeType( base::DataSourceBase::shared_ptr source ) const {
00154 Logger::In loc("TypeInfoName");
00155 Logger::log() << Logger::Debug << "Can not decompose "<<tname<<"."<<Logger::endl;
00156 return source;
00157 }
00158
00159 virtual bool composeType( base::DataSourceBase::shared_ptr source, base::DataSourceBase::shared_ptr result) const {
00160 Logger::In loc("TypeInfoName");
00161 Logger::log() << Logger::Error << "Can not compose "<<tname<<"."<<Logger::endl;
00162 return false;
00163 }
00164
00165 virtual std::string getTypeIdName() const { return ""; }
00166
00167 virtual base::InputPortInterface* inputPort(std::string const& name) const
00168 { return 0; }
00169 virtual base::OutputPortInterface* outputPort(std::string const& name) const
00170 { return 0; }
00171 virtual base::ChannelElementBase::shared_ptr buildDataStorage(ConnPolicy const& policy) const
00172 { return base::ChannelElementBase::shared_ptr(); }
00173 virtual base::ChannelElementBase::shared_ptr buildChannelOutput(base::InputPortInterface& port) const
00174 { return base::ChannelElementBase::shared_ptr(); }
00175 virtual base::ChannelElementBase::shared_ptr buildChannelInput(base::OutputPortInterface& port) const
00176 { return base::ChannelElementBase::shared_ptr(); }
00177
00178 };
00179
00186 template<typename T>
00187 struct TypeInfoName
00188 : public EmptyTypeInfo
00189 {
00197 TypeInfoName(std::string name)
00198 : EmptyTypeInfo(name)
00199 {
00200 }
00201
00202 bool installTypeInfoObject() {
00203 Logger::In in("TypeInfoName");
00204 TypeInfo* orig = internal::DataSourceTypeInfo<T>::value_type_info::TypeInfoObject;
00205 if ( orig != 0) {
00206 std::string oname = orig->getTypeName();
00207 if ( oname != tname ) {
00208 log(Info) << "TypeInfo for type '" << tname << "' already exists as '"
00209 << oname
00210 << "': I'll alias the original and install the new instance." << endlog();
00211 this->migrateProtocols( orig );
00212 Types()->aliasType( oname, this);
00213 }
00214 } else {
00215
00216 if ( Types()->type(tname) ) {
00217 log(Error) << "You attemted to register type name "<< tname << " which is already "
00218 << "in use for a different C++ type." <<endlog();
00219 return false;
00220 }
00221 }
00222
00223 internal::DataSourceTypeInfo<T>::value_type_info::TypeInfoObject = this;
00224 return true;
00225 }
00226 };
00227
00228 }}
00229
00230 #endif