Orocos Real-Time Toolkit  2.6.0
DataSource.cpp
00001 /***************************************************************************
00002   tag: Peter Soetens  Mon May 10 19:10:37 CEST 2004  DataSource.cxx
00003 
00004                         DataSource.cxx -  description
00005                            -------------------
00006     begin                : Mon May 10 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 #include "DataSource.hpp"
00038 #include "../types/TypeInfoName.hpp"
00039 
00040 #include "rtt-config.h"
00041 #include "../types/Types.hpp"
00042 #include "../types/TypeTransporter.hpp"
00043 
00044 namespace RTT {
00045     namespace base {
00046         std::ostream& operator<<(std::ostream& os, DataSourceBase::shared_ptr mobj)
00047         {
00048             return mobj->getTypeInfo()->write( os, mobj );
00049         }
00050 
00051         void intrusive_ptr_add_ref(const RTT::base::DataSourceBase* p )
00052         {
00053             p->ref();
00054         }
00055 
00056         void intrusive_ptr_release(const RTT::base::DataSourceBase* p )
00057         {
00058             p->deref();
00059         };
00060 
00061     }
00062 
00063     using namespace detail;
00064     using namespace std;
00065 
00066     bad_assignment::~bad_assignment() throw() {}
00067     const char* bad_assignment::what() const throw() { return "Bad DataSource assignment: incompatible types."; }
00068 
00069     DataSourceBase::shared_ptr DataSourceBase::stack_shared_ptr(DataSourceBase* dsb) {
00070         dsb->ref();
00071         return DataSourceBase::shared_ptr(dsb);
00072     }
00073 
00074     DataSourceBase::const_ptr DataSourceBase::stack_const_ptr(DataSourceBase const* dsb) {
00075         dsb->ref();
00076         return DataSourceBase::const_ptr(dsb);
00077     }
00078 
00079     DataSourceBase::DataSourceBase() : refcount(0) {  }
00080     void DataSourceBase::ref() const { refcount.inc(); }
00081     void DataSourceBase::deref() const { if ( refcount.dec_and_test() ) delete this; }
00082 
00083     DataSourceBase::~DataSourceBase()
00084     {
00085     }
00086 
00087     void DataSourceBase::reset()
00088     {
00089     }
00090 
00091     std::ostream& DataSourceBase::write(std::ostream& os)
00092     {
00093         DataSourceBase::shared_ptr mobj(this);
00094         return mobj->getTypeInfo()->write( os, mobj );
00095     }
00096 
00097 
00098     std::string DataSourceBase::toString()
00099     {
00100         DataSourceBase::shared_ptr mobj(this);
00101         return mobj->getTypeInfo()->toString( mobj );
00102     }
00103 
00104     bool DataSourceBase::isAssignable() const {
00105         return false;
00106     }
00107 
00108     bool DataSourceBase::update( DataSourceBase* ) {
00109         return false;
00110     }
00111 
00112     void DataSourceBase::updated()
00113     {}
00114 
00115     void* DataSourceBase::getRawPointer()
00116     { return 0; }
00117     void const* DataSourceBase::getRawConstPointer()
00118     { return 0; }
00119 
00120     ActionInterface* DataSourceBase::updateAction( DataSourceBase* ) {
00121         return 0;
00122     }
00123 
00124     DataSourceBase::shared_ptr DataSourceBase::getMember( const std::string& part_name ) {
00125         if ( part_name.empty() )
00126             return DataSourceBase::shared_ptr(this);
00127         return getTypeInfo()->getMember( this, part_name );
00128     }
00129 
00130     DataSourceBase::shared_ptr DataSourceBase::getMember( DataSourceBase::shared_ptr part_id, DataSourceBase::shared_ptr offset) {
00131         return getTypeInfo()->getMember( this, part_id );
00132     }
00133 
00134     vector<string> DataSourceBase::getMemberNames() const {
00135         return getTypeInfo()->getMemberNames();
00136     }
00137 
00138     DataSourceBase::shared_ptr DataSourceBase::getParent()  {
00139         return this;
00140     }
00141 
00142     namespace internal {
00143 
00144         TypeInfo* DataSourceTypeInfo<detail::UnknownType>::TypeInfoObject = 0;
00145 
00146         const std::string& DataSourceTypeInfo<UnknownType>::getType() { return getTypeInfo()->getTypeName(); }
00147         const std::string& DataSourceTypeInfo<UnknownType>::getTypeName() { return getTypeInfo()->getTypeName(); }
00148         const std::string& DataSourceTypeInfo<UnknownType>::getQualifier() { return noqual; }
00149         TypeInfo* DataSourceTypeInfo<UnknownType>::getTypeInfo() {
00150             if (!TypeInfoObject)
00151                 TypeInfoObject = new TypeInfo("unknown_t");
00152             return TypeInfoObject;
00153         }
00154 
00155         const std::string DataSourceTypeInfo<UnknownType>::noqual("");
00156         const std::string DataSourceTypeInfo<UnknownType>::cqual(" const");
00157         const std::string DataSourceTypeInfo<UnknownType>::refqual(" &");
00158         const std::string DataSourceTypeInfo<UnknownType>::crefqual(" const&");
00159         const std::string DataSourceTypeInfo<UnknownType>::ptrqual(" *");
00160         const std::string DataSourceTypeInfo<UnknownType>::cptrqual(" const*");
00161 
00162         // (void) type info
00163         TypeInfo* DataSourceTypeInfo<void>::TypeInfoObject = 0;
00164         const std::string DataSourceTypeInfo<void>::tname("void");
00165 
00166         const std::string& DataSourceTypeInfo<void>::getType() { return tname; }
00167         const std::string& DataSourceTypeInfo<void>::getTypeName() { return tname; }
00168         const std::string& DataSourceTypeInfo<void>::getQualifier() { return DataSourceTypeInfo<UnknownType>::noqual; }
00169         const TypeInfo* DataSourceTypeInfo<void>::getTypeInfo() {
00170             if (!TypeInfoObject)
00171                 return DataSourceTypeInfo<UnknownType>::getTypeInfo();
00172             return TypeInfoObject;
00173         }
00174     }
00175 }
00176