Go to the documentation of this file.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 #ifndef ORO_CORELIB_TYPEINFO_HPP
00039 #define ORO_CORELIB_TYPEINFO_HPP
00040
00041 #include <vector>
00042 #include <string>
00043 #include "../base/DataSourceBase.hpp"
00044 #include "../base/ChannelElementBase.hpp"
00045
00046 #ifndef NO_TYPE_INFO_FACTORY_FUNCTIONS
00047 #include "../internal/ConnFactory.hpp"
00048 #include "MemberFactory.hpp"
00049 #include "ValueFactory.hpp"
00050 #include "CompositionFactory.hpp"
00051 #ifndef NO_TYPE_INFO_STREAMS
00052 #include "StreamFactory.hpp"
00053 #endif
00054 #endif
00055
00056
00057 namespace RTT
00058 { namespace types {
00059 using internal::ConnFactory;
00060 using internal::ConnFactoryPtr;
00061
00068 class RTT_API TypeInfo
00069 {
00070 public:
00071 typedef const std::type_info * TypeId;
00072
00073 TypeInfo(const std::string& name) : mtypenames(1,name) {}
00074
00075 ~TypeInfo();
00084 const std::string& getTypeName() const { return mtypenames[0]; }
00085
00089 std::vector<std::string> getTypeNames() const;
00090
00096 void addAlias(const std::string& alias);
00097
00104 bool isType(const std::string& name);
00105
00109 TypeId getTypeId() const { return mtid; }
00110
00114 const char * getTypeIdName() const { return mtid_name; }
00115
00121 base::DataSourceBase::shared_ptr construct(const std::vector<base::DataSourceBase::shared_ptr>& args) const;
00122
00128 base::DataSourceBase::shared_ptr convert(base::DataSourceBase::shared_ptr arg) const;
00129
00133 void addConstructor(TypeConstructor* tb);
00134
00144 bool addProtocol(int protocol_id, TypeTransporter* tt);
00145
00151 TypeTransporter* getProtocol(int protocol_id) const;
00152
00156 bool hasProtocol(int protocol_id) const;
00157
00161 std::vector<int> getTransportNames() const;
00162
00163 #ifndef NO_TYPE_INFO_FACTORY_FUNCTIONS
00164
00174 base::AttributeBase* buildConstant(std::string name,base::DataSourceBase::shared_ptr source, int sizehint) const
00175 {
00176 return mdsf ? mdsf->buildConstant(name, source, sizehint) : 0;
00177 }
00178
00179 base::AttributeBase* buildConstant(std::string name,base::DataSourceBase::shared_ptr source) const
00180 {
00181 return mdsf ? mdsf->buildConstant(name, source) : 0;
00182 }
00188 base::AttributeBase* buildVariable(std::string name,int sizehint) const;
00189 base::AttributeBase* buildVariable(std::string name) const
00190 {
00191 return mdsf ? mdsf->buildVariable(name) : 0;
00192 }
00193
00198 bool resize(base::DataSourceBase::shared_ptr arg, int size) const
00199 {
00200 return mmembf ? mmembf->resize(arg, size) : false;
00201 }
00202
00207 base::AttributeBase* buildAlias(std::string name, base::DataSourceBase::shared_ptr b ) const
00208 {
00209 return mdsf ? mdsf->buildAlias(name, b) : 0;
00210 }
00211
00215 base::PropertyBase* buildProperty(const std::string& name, const std::string& desc, base::DataSourceBase::shared_ptr source = 0) const
00216 {
00217 return mdsf ? mdsf->buildProperty(name, desc, source) : 0;
00218 }
00219
00223 base::AttributeBase* buildAttribute(std::string name, base::DataSourceBase::shared_ptr source = 0 ) const
00224 {
00225 return mdsf ? mdsf->buildAttribute(name, source) : 0;
00226 }
00227
00231 base::DataSourceBase::shared_ptr buildValue() const
00232 {
00233 return mdsf ? mdsf->buildValue() : base::DataSourceBase::shared_ptr();
00234 }
00235
00239 base::DataSourceBase::shared_ptr buildReference(void* ptr) const
00240 {
00241 return mdsf ? mdsf->buildReference(ptr) : base::DataSourceBase::shared_ptr();
00242 }
00243
00249 base::DataSourceBase::shared_ptr buildActionAlias(base::ActionInterface* action, base::DataSourceBase::shared_ptr source) const
00250 {
00251 return mdsf ? mdsf->buildActionAlias(action,source) : base::DataSourceBase::shared_ptr();
00252 }
00253
00256 #ifndef NO_TYPE_INFO_STREAMS
00257
00266 std::ostream& write(std::ostream& os, base::DataSourceBase::shared_ptr in ) const
00267 {
00268 return mstrf ? mstrf->write(os, in) : os;
00269 }
00270
00275 std::istream& read(std::istream& os, base::DataSourceBase::shared_ptr out ) const
00276 {
00277 return mstrf ? mstrf->read(os, out) : os;
00278 }
00279
00280
00284 std::string toString( base::DataSourceBase::shared_ptr in ) const
00285 {
00286 return mstrf ? mstrf->toString(in) : std::string();
00287 }
00288
00292 bool fromString( const std::string& value, base::DataSourceBase::shared_ptr out ) const
00293 {
00294 return mstrf ? mstrf->fromString(value, out) : false;
00295 }
00296
00301 bool isStreamable() const
00302 {
00303 return mstrf ? mstrf->isStreamable() : false;
00304 }
00306 #endif
00307
00317 std::vector<std::string> getMemberNames() const
00318 {
00319 return mmembf ? mmembf->getMemberNames() : std::vector<std::string>();
00320 }
00321
00329 base::DataSourceBase::shared_ptr getMember(base::DataSourceBase::shared_ptr item, const std::string& name) const
00330 {
00331 return mmembf ? mmembf->getMember(item,name) : base::DataSourceBase::shared_ptr();
00332 }
00333
00343 bool getMember(internal::Reference* ref, base::DataSourceBase::shared_ptr item, const std::string& name) const
00344 {
00345 return mmembf ? mmembf->getMember(ref, item,name) : false;
00346 }
00347
00355 base::DataSourceBase::shared_ptr getMember(base::DataSourceBase::shared_ptr item,
00356 base::DataSourceBase::shared_ptr id) const
00357 {
00358 return mmembf ? mmembf->getMember(item,id) : base::DataSourceBase::shared_ptr();
00359 }
00360
00379 bool composeType( base::DataSourceBase::shared_ptr source, base::DataSourceBase::shared_ptr target) const
00380 {
00381 return mcompf ? mcompf->composeType(source,target) : false;
00382 }
00383
00395 base::DataSourceBase::shared_ptr decomposeType(base::DataSourceBase::shared_ptr source) const
00396 {
00397 return mcompf ? mcompf->decomposeType(source) : base::DataSourceBase::shared_ptr();
00398 }
00399
00407 base::DataSourceBase::shared_ptr convertType(base::DataSourceBase::shared_ptr source) const
00408 {
00409 return mcompf ? mcompf->convertType(source) : base::DataSourceBase::shared_ptr();
00410 }
00411
00420 base::InputPortInterface* inputPort(std::string const& name) const
00421 {
00422 return mconnf ? mconnf->inputPort(name) : 0;
00423 }
00424
00429 base::OutputPortInterface* outputPort(std::string const& name) const
00430 {
00431 return mconnf ? mconnf->outputPort(name) : 0;
00432 }
00433
00440 base::ChannelElementBase::shared_ptr buildDataStorage(ConnPolicy const& policy) const
00441 {
00442 return mconnf ? mconnf->buildDataStorage(policy) : base::ChannelElementBase::shared_ptr();
00443 }
00444 base::ChannelElementBase::shared_ptr buildChannelOutput(base::InputPortInterface& port) const
00445 {
00446 return mconnf ? mconnf->buildChannelOutput(port) : base::ChannelElementBase::shared_ptr();
00447 }
00448 base::ChannelElementBase::shared_ptr buildChannelInput(base::OutputPortInterface& port) const
00449 {
00450 return mconnf ? mconnf->buildChannelInput(port) : base::ChannelElementBase::shared_ptr();
00451 }
00452
00453 #endif // NO_TYPE_INFO_FACTORY_FUNCTIONS
00454
00455 void setTypeId(TypeId tid) {
00456 mtid = tid;
00457 mtid_name = tid->name();
00458 }
00459
00464 void setPortFactory( ConnFactoryPtr cf ) { if (cf) mconnf = cf; }
00465
00466 ConnFactoryPtr getPortFactory() const { return mconnf; }
00467
00468 void setMemberFactory( MemberFactoryPtr mf ) { if (mf) mmembf = mf; }
00469
00470 MemberFactoryPtr getMemberFactory() const { return mmembf; }
00471
00472 void setValueFactory( ValueFactoryPtr dsf) { if (dsf) mdsf = dsf; }
00473
00474 ValueFactoryPtr getValueFactory() const { return mdsf; }
00475
00476 void setCompositionFactory( CompositionFactoryPtr cf) { if(cf) mcompf = cf; }
00477
00478 CompositionFactoryPtr getCompositionFactory() const { return mcompf; }
00479
00480 void setStreamFactory( StreamFactoryPtr sf ) { if (sf) mstrf = sf; }
00481
00482 StreamFactoryPtr getStreamFactory() const { return mstrf; }
00483 protected:
00484 typedef std::vector<TypeConstructor*> Constructors;
00485 typedef std::vector<TypeTransporter*> Transporters;
00486 Constructors constructors;
00487 Transporters transporters;
00488 std::vector<std::string> mtypenames;
00489 const char* mtid_name;
00490 TypeId mtid;
00491 boost::shared_ptr<ConnFactory> mconnf;
00492 boost::shared_ptr<MemberFactory> mmembf;
00493 boost::shared_ptr<ValueFactory> mdsf;
00494 boost::shared_ptr<CompositionFactory> mcompf;
00495 boost::shared_ptr<StreamFactory> mstrf;
00496 };
00497
00498 }}
00499
00500 #endif