Orocos Real-Time Toolkit  2.6.0
TypeInfo.hpp
00001 /***************************************************************************
00002   tag: Peter Soetens  Mon Jan 19 14:11:26 CET 2004  TypeInfo.hpp
00003 
00004                         TypeInfo.hpp -  description
00005                            -------------------
00006     begin                : Mon January 19 2004
00007     copyright            : (C) 2004 Peter Soetens
00008     email                : peter.soetens@mech.kuleuven.ac.be
00009 
00010  ***************************************************************************
00011  *   This library is free software; you can redistribute it and/or         *
00012  *   modify it under the terms of the GNU General Public                   *
00013  *   License as published by the Free Software Foundation;                 *
00014  *   version 2 of the License.                                             *
00015  *                                                                         *
00016  *   As a special exception, you may use this file as part of a free       *
00017  *   software library without restriction.  Specifically, if other files   *
00018  *   instantiate templates or use macros or inline functions from this     *
00019  *   file, or you compile this file and link it with other files to        *
00020  *   produce an executable, this file does not by itself cause the         *
00021  *   resulting executable to be covered by the GNU General Public          *
00022  *   License.  This exception does not however invalidate any other        *
00023  *   reasons why the executable file might be covered by the GNU General   *
00024  *   Public License.                                                       *
00025  *                                                                         *
00026  *   This library is distributed in the hope that it will be useful,       *
00027  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
00028  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU     *
00029  *   Lesser General Public License for more details.                       *
00030  *                                                                         *
00031  *   You should have received a copy of the GNU General Public             *
00032  *   License along with this library; if not, write to the Free Software   *
00033  *   Foundation, Inc., 59 Temple Place,                                    *
00034  *   Suite 330, Boston, MA  02111-1307  USA                                *
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