DataSourceAdaptor.hpp

00001 /***************************************************************************
00002   tag: Peter Soetens  Tue Apr 5 16:53:25 CEST 2005  DataSourceAdaptor.hpp
00003 
00004                         DataSourceAdaptor.hpp -  description
00005                            -------------------
00006     begin                : Tue April 05 2005
00007     copyright            : (C) 2005 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 #include "DataSource.hpp"
00039 
00040 #ifndef DATASOURCE_ADAPTOR_HPP
00041 #define DATASOURCE_ADAPTOR_HPP
00042 
00043 namespace RTT
00044 {
00045     namespace detail {
00046 
00047         template<class From, class To>
00048         struct DataSourceAdaptor;
00049 
00050         template<class From, class To>
00051         struct AssignableDataSourceAdaptor;
00052 
00089     template<class From, class To>
00090     struct DataSourceAdaptor
00091         : public DataSource<To>
00092     {
00093         typename DataSource<From>::shared_ptr orig_;
00094 
00095         DataSourceAdaptor( typename DataSource<From>::shared_ptr orig)
00096             : orig_(orig) {}
00097 
00098         virtual typename DataSource<To>::result_t  get() const { return orig_->get(); }
00099 
00100         virtual typename DataSource<To>::result_t  value() const { return orig_->value(); }
00101 
00102         virtual void reset() { orig_->reset(); }
00103 
00104         virtual bool evaluate() const { return orig_->evaluate(); }
00105 
00106         virtual DataSource<To>* clone() const {
00107             return new DataSourceAdaptor( orig_->clone() );
00108         }
00109 
00110         virtual DataSource<To>* copy( std::map<const DataSourceBase*, DataSourceBase*>& alreadyCloned ) const {
00111             std::map<const DataSourceBase*,  DataSourceBase*>::iterator i = alreadyCloned.find( this );
00112             if ( i == alreadyCloned.end() ) {
00113                 DataSourceAdaptor<From,To>* n = new DataSourceAdaptor<From,To>( orig_->copy( alreadyCloned) );
00114                 alreadyCloned[this] = n;
00115                 return n;
00116             }
00117             typedef DataSourceAdaptor<From,To> CastType;
00118             assert( dynamic_cast< CastType* >( i->second ) == static_cast< CastType* >( i->second ) );
00119             return static_cast< CastType* >( i->second );
00120         }
00121     };
00122 
00123 #ifndef ORO_EMBEDDED
00124 
00131     template<class TFrom>
00132     struct DataSourceAdaptor<TFrom&, TFrom>
00133         : public AssignableDataSource<TFrom>
00134     {
00135         typedef TFrom& From;
00136         typedef TFrom  To;
00137         typename DataSource<From>::shared_ptr orig_;
00138 
00139         DataSourceAdaptor( typename DataSource<From>::shared_ptr orig)
00140             : orig_(orig) {}
00141 
00142         virtual typename DataSource<To>::result_t  get() const { return orig_->get(); }
00143 
00144         virtual typename DataSource<To>::result_t  value() const { return orig_->value(); }
00145 
00146         virtual typename AssignableDataSource<To>::const_reference_t rvalue() const { return orig_->value(); }
00147 
00148         virtual typename AssignableDataSource<To>::reference_t set() { return orig_->get(); }
00149 
00150         virtual void set(typename AssignableDataSource<To>::param_t v) { orig_->get() = v; }
00151 
00152         virtual void reset() { orig_->reset(); }
00153 
00154         virtual bool evaluate() const { return orig_->evaluate(); }
00155 
00156         virtual AssignableDataSource<To>* clone() const {
00157             return new DataSourceAdaptor( orig_->clone() );
00158         }
00159 
00160         virtual AssignableDataSource<To>* copy( std::map<const DataSourceBase*, DataSourceBase*>& alreadyCloned ) const {
00161             std::map<const DataSourceBase*,  DataSourceBase*>::iterator i = alreadyCloned.find( this );
00162             if ( i == alreadyCloned.end() ) {
00163                 DataSourceAdaptor<From,To>* n = new DataSourceAdaptor<From,To>( orig_->copy( alreadyCloned) );
00164                 alreadyCloned[this] = n;
00165                 return n;
00166             }
00167             typedef DataSourceAdaptor<From,To> CastType;
00168             assert( dynamic_cast< CastType* >( i->second ) == static_cast< CastType* >( i->second ) );
00169             return static_cast< CastType* >( i->second );
00170         }
00171     };
00172 
00177     template<class TFrom>
00178     struct DataSourceAdaptor<const TFrom&, const TFrom>
00179         : public DataSource<const TFrom>
00180     {
00181         typedef const TFrom& From;
00182         typedef const TFrom  To;
00183         typename DataSource<From>::shared_ptr orig_;
00184 
00185         DataSourceAdaptor( typename DataSource<From>::shared_ptr orig)
00186             : orig_(orig) {}
00187 
00188         virtual typename DataSource<To>::result_t  get() const { return orig_->get(); }
00189 
00190         virtual typename DataSource<To>::result_t  value() const { return orig_->value(); }
00191 
00192         virtual void reset() { orig_->reset(); }
00193 
00194         virtual bool evaluate() const { return orig_->evaluate(); }
00195 
00196         virtual DataSource<To>* clone() const {
00197             return new DataSourceAdaptor( orig_->clone() );
00198         }
00199 
00200         virtual DataSource<To>* copy( std::map<const DataSourceBase*, DataSourceBase*>& alreadyCloned ) const {
00201             std::map<const DataSourceBase*,  DataSourceBase*>::iterator i = alreadyCloned.find( this );
00202             if ( i == alreadyCloned.end() ) {
00203                 DataSourceAdaptor<From,To>* n = new DataSourceAdaptor<From,To>( orig_->copy( alreadyCloned) );
00204                 alreadyCloned[this] = n;
00205                 return n;
00206             }
00207             typedef DataSourceAdaptor<From,To> CastType;
00208             assert( dynamic_cast< CastType* >( i->second ) == static_cast< CastType* >( i->second ) );
00209             return static_cast< CastType* >( i->second );
00210         }
00211     };
00212 
00218     template<class TFrom>
00219     struct DataSourceAdaptor<TFrom&, TFrom&>
00220         : public AssignableDataSource<TFrom&>
00221     {
00222         typedef TFrom& From;
00223         typedef TFrom& To;
00224         typename DataSource<From>::shared_ptr orig_;
00225 
00226         DataSourceAdaptor( typename DataSource<From>::shared_ptr orig)
00227             : orig_(orig) {}
00228 
00229         virtual typename DataSource<To>::result_t  get() const { return orig_->get(); }
00230 
00231         virtual typename DataSource<To>::result_t  value() const { return orig_->value(); }
00232 
00233         virtual typename AssignableDataSource<To>::const_reference_t rvalue() const { return orig_->value(); }
00234 
00235         virtual typename AssignableDataSource<To>::reference_t set() { return orig_->get(); }
00236 
00237         virtual void set(typename AssignableDataSource<To>::param_t v) { orig_->get() = v; }
00238 
00239         virtual void reset() { orig_->reset(); }
00240 
00241         virtual bool evaluate() const { return orig_->evaluate(); }
00242 
00243         virtual AssignableDataSource<To>* clone() const {
00244             return new DataSourceAdaptor( orig_->clone() );
00245         }
00246 
00247         virtual AssignableDataSource<To>* copy( std::map<const DataSourceBase*, DataSourceBase*>& alreadyCloned ) const {
00248             std::map<const DataSourceBase*,  DataSourceBase*>::iterator i = alreadyCloned.find( this );
00249             if ( i == alreadyCloned.end() ) {
00250                 DataSourceAdaptor<From,To>* n = new DataSourceAdaptor<From,To>( orig_->copy( alreadyCloned) );
00251                 alreadyCloned[this] = n;
00252                 return n;
00253             }
00254             typedef DataSourceAdaptor<From,To> CastType;
00255             assert( dynamic_cast< CastType* >( i->second ) == static_cast< CastType* >( i->second ) );
00256             return static_cast< CastType* >( i->second );
00257         }
00258     };
00259 
00260 #endif
00261 
00267     template<class TFrom>
00268     struct DataSourceAdaptor<TFrom,const TFrom&>
00269         : public DataSource<const TFrom&>
00270     {
00271         typedef const TFrom& To;
00272         typedef TFrom  From;
00273 
00274         typename DataSource<From>::shared_ptr orig_;
00275 
00276         DataSourceAdaptor( typename DataSource<From>::shared_ptr orig)
00277             : orig_(orig) {}
00278 
00279         mutable From copy_;  
00280 
00281         virtual typename DataSource<To>::result_t get() const { copy_ = orig_->get(); return copy_; }
00282 
00283         virtual typename DataSource<To>::result_t value() const { copy_ = orig_->value(); return copy_; }
00284 
00285         virtual void reset() { orig_->reset(); }
00286 
00287         virtual bool evaluate() const { return orig_->evaluate(); }
00288 
00289         virtual DataSource<To>* clone() const {
00290             return new DataSourceAdaptor( orig_->clone() );
00291         }
00292 
00293         virtual DataSource<To>* copy( std::map<const DataSourceBase*, DataSourceBase*>& alreadyCloned ) const {
00294             std::map<const DataSourceBase*,  DataSourceBase*>::iterator i = alreadyCloned.find( this );
00295             if ( i == alreadyCloned.end() ) {
00296                 DataSourceAdaptor<From,To>* n = new DataSourceAdaptor<From,To>( orig_->copy( alreadyCloned) );
00297                 alreadyCloned[this] = n;
00298                 return n;
00299             }
00300             typedef DataSourceAdaptor<From,To> CastType;
00301             assert( dynamic_cast< CastType* >( i->second ) == static_cast< CastType* >( i->second ) );
00302             return static_cast< CastType* >( i->second );
00303         }
00304 
00305     };
00306 
00307 #ifndef ORO_EMBEDDED
00308 
00315     template<class TFrom>
00316     struct DataSourceAdaptor<const TFrom, const TFrom&>
00317         : public DataSource<const TFrom&>
00318     {
00319         typedef const TFrom& To;
00320         typedef const TFrom From;
00321 
00322         typename DataSource<From>::shared_ptr orig_;
00323 
00324         DataSourceAdaptor( typename DataSource<From>::shared_ptr orig)
00325             : orig_(orig) {}
00326 
00327         mutable TFrom copy_;  
00328 
00329         virtual typename DataSource<To>::result_t get() const { copy_ = orig_->get(); return copy_; }
00330 
00331         virtual typename DataSource<To>::result_t value() const { copy_ = orig_->value(); return copy_; }
00332 
00333         virtual void reset() { orig_->reset(); }
00334 
00335         virtual bool evaluate() const { return orig_->evaluate(); }
00336 
00337         virtual DataSource<To>* clone() const {
00338             return new DataSourceAdaptor( orig_->clone() );
00339         }
00340 
00341         virtual DataSource<To>* copy( std::map<const DataSourceBase*, DataSourceBase*>& alreadyCloned ) const {
00342             std::map<const DataSourceBase*,  DataSourceBase*>::iterator i = alreadyCloned.find( this );
00343             if ( i == alreadyCloned.end() ) {
00344                 DataSourceAdaptor<From,To>* n = new DataSourceAdaptor<From,To>( orig_->copy( alreadyCloned) );
00345                 alreadyCloned[this] = n;
00346                 return n;
00347             }
00348             typedef DataSourceAdaptor<From,To> CastType;
00349             assert( dynamic_cast< CastType* >( i->second ) == static_cast< CastType* >( i->second ) );
00350             return static_cast< CastType* >( i->second );
00351         }
00352 
00353     };
00354 
00360     template<class From, class To>
00361     struct AssignableDataSourceAdaptor
00362         : public DataSource<To>
00363     {
00364         typename AssignableDataSource<From>::shared_ptr orig_;
00365         mutable typename DataSource<To>::value_t mcache;
00366 
00367         AssignableDataSourceAdaptor( typename AssignableDataSource<From>::shared_ptr orig)
00368             : orig_(orig) {}
00369 
00370         virtual typename DataSource<To>::result_t get() const { mcache = orig_->get(); return mcache; }
00371 
00372         virtual typename DataSource<To>::result_t value() const { mcache = orig_->value(); return mcache; }
00373 
00374         virtual void updated() { orig_->set( mcache ); }
00375 
00376         virtual void reset() { orig_->reset(); }
00377 
00378         virtual bool evaluate() const { return orig_->evaluate(); }
00379 
00380         virtual DataSource<To>* clone() const {
00381             return new AssignableDataSourceAdaptor( orig_->clone() );
00382         }
00383 
00384         virtual DataSource<To>* copy( std::map<const DataSourceBase*, DataSourceBase*>& alreadyCloned ) const {
00385             std::map<const DataSourceBase*,  DataSourceBase*>::iterator i = alreadyCloned.find( this );
00386             if ( i == alreadyCloned.end() ) {
00387                 AssignableDataSourceAdaptor<From,To>* n = new AssignableDataSourceAdaptor<From,To>( orig_->copy( alreadyCloned) );
00388                 alreadyCloned[this] = n;
00389                 return n;
00390             }
00391             typedef AssignableDataSourceAdaptor<From,To> CastType;
00392             assert( dynamic_cast< CastType* >( i->second ) == static_cast< CastType* >( i->second ) );
00393             return static_cast< CastType* >( i->second );
00394         }
00395 
00396     };
00397 #endif
00398 
00403     template<class From>
00404     struct AssignableDataSourceAdaptor<From, const From& >
00405         : public DataSource<const From&>
00406     {
00407         typedef const From& To;
00408         typename AssignableDataSource<From>::shared_ptr orig_;
00409 
00410         AssignableDataSourceAdaptor( typename AssignableDataSource<From>::shared_ptr orig)
00411             : orig_(orig) {}
00412 
00413         virtual typename DataSource<To>::result_t get() const { return orig_->rvalue(); }
00414 
00415         virtual typename DataSource<To>::result_t value() const { return orig_->rvalue(); }
00416 
00417         virtual void reset() { orig_->reset(); }
00418 
00419         virtual bool evaluate() const { return orig_->evaluate(); }
00420 
00421         virtual DataSource<To>* clone() const {
00422             return new AssignableDataSourceAdaptor( orig_->clone() );
00423         }
00424 
00425         virtual DataSource<To>* copy( std::map<const DataSourceBase*, DataSourceBase*>& alreadyCloned ) const {
00426             std::map<const DataSourceBase*,  DataSourceBase*>::iterator i = alreadyCloned.find( this );
00427             if ( i == alreadyCloned.end() ) {
00428                 AssignableDataSourceAdaptor<From,To>* n = new AssignableDataSourceAdaptor<From,To>( orig_->copy( alreadyCloned) );
00429                 alreadyCloned[this] = n;
00430                 return n;
00431             }
00432             typedef AssignableDataSourceAdaptor<From,To> CastType;
00433             assert( dynamic_cast< CastType* >( i->second ) == static_cast< CastType* >( i->second ) );
00434             return static_cast< CastType* >( i->second );
00435         }
00436 
00437     };
00438 
00443     template<class To>
00444     struct AssignableDataSourceAdaptor<To const&, To>
00445         : public AssignableDataSource<To>
00446     {
00447         typedef To const& From;
00448         typename AssignableDataSource<From>::shared_ptr orig_;
00449 
00450         AssignableDataSourceAdaptor( typename AssignableDataSource<From>::shared_ptr orig)
00451             : orig_(orig) {}
00452 
00453         virtual typename DataSource<To>::result_t get() const { return orig_->get(); }
00454 
00455         virtual typename DataSource<To>::result_t value() const { return orig_->value(); }
00456 
00457         virtual typename AssignableDataSource<To>::const_reference_t rvalue() const { return orig_->rvalue(); }
00458 
00459         virtual typename AssignableDataSource<To>::reference_t set() { return orig_->set(); }
00460 
00461         virtual void set( typename AssignableDataSource<To>::param_t v) { orig_->set(v); }
00462 
00463         virtual void updated() { orig_->updated(); }
00464 
00465         virtual void reset() { orig_->reset(); }
00466 
00467         virtual bool evaluate() const { return orig_->evaluate(); }
00468 
00469         virtual bool updatePart( DataSourceBase* part, DataSourceBase* other ) { return orig_->updatePart( part, other); }
00470 
00471         virtual CommandInterface* updatePartCommand( DataSourceBase* part, DataSourceBase* other) { return orig_->updatePartCommand(part, other ); }
00472 
00473         virtual AssignableDataSource<To>* clone() const {
00474             return new AssignableDataSourceAdaptor( orig_->clone() );
00475         }
00476 
00477         virtual AssignableDataSource<To>* copy( std::map<const DataSourceBase*, DataSourceBase*>& alreadyCloned ) const {
00478             std::map<const DataSourceBase*,  DataSourceBase*>::iterator i = alreadyCloned.find( this );
00479             if ( i == alreadyCloned.end() ) {
00480                 AssignableDataSourceAdaptor<From,To>* n = new AssignableDataSourceAdaptor<From,To>( orig_->copy( alreadyCloned) );
00481                 alreadyCloned[this] = n;
00482                 return n;
00483             }
00484             typedef AssignableDataSourceAdaptor<From,To> CastType;
00485             assert( dynamic_cast< CastType* >( i->second ) == static_cast< CastType* >( i->second ) );
00486             return static_cast< CastType* >( i->second );
00487         }
00488 
00489     };
00490 
00491     }
00492 
00496     template< class TResult >
00497     struct AdaptDataSource
00498     {
00499         typedef TResult Result;
00500 
00501         DataSource<Result>* operator()( DataSourceBase::shared_ptr dsb) const
00502         {
00503             // equal case
00504             DataSource<Result>* t1 = DataSource<Result>::narrow( dsb.get() );
00505             if (t1)
00506                 return t1;
00507 
00508             // const ref to value case
00509             DataSource<const Result&>* t2 = DataSource<const Result&>::narrow( dsb.get() );
00510             if ( t2 )
00511                 return new detail::DataSourceAdaptor<const Result&, Result>( t2 );
00512 
00513 #ifndef ORO_EMBEDDED
00514             // ref to value case
00515             DataSource<Result&>* t3 = DataSource<Result&>::narrow( dsb.get() );
00516             if ( t3 )
00517                 return new detail::DataSourceAdaptor<Result&, Result>( t3 );
00518 
00519             // const value to value case
00520             DataSource<const Result>* t4 = DataSource<const Result>::narrow( dsb.get() );
00521             if ( t4 )
00522                 return new detail::DataSourceAdaptor<const Result, Result>( t4 );
00523 #endif
00524 
00525             // complete type failure.
00526             return 0;
00527         }
00528 
00529     };
00530 
00534     template< class TResult >
00535     struct AdaptAssignableDataSource
00536     {
00537         typedef TResult Result;
00538 
00539         AssignableDataSource<Result>* operator()( DataSourceBase::shared_ptr dsb) const
00540         {
00541             // equal case
00542             AssignableDataSource<Result>* t1 = AssignableDataSource<Result>::narrow( dsb.get() );
00543             if (t1)
00544                 return t1;
00545 
00546 #if 0
00547             // Does this case exist ?
00548             // Assignable const ref case
00549             AssignableDataSource<const Result&>* t2 = AssignableDataSource<const Result&>::narrow( dsb.get() );
00550             if ( t2 )
00551                 return new detail::AssignableDataSourceAdaptor<const Result&, Result>( t2 ); // will return AssignableDS !
00552 #endif
00553 
00554 #ifndef ORO_EMBEDDED
00555             // ref to assignable value case
00556             DataSource<Result&>* t3 = DataSource<Result&>::narrow( dsb.get() );
00557             if ( t3 )
00558                 return new detail::DataSourceAdaptor<Result&, Result>( t3 ); // will return AssignableDS !
00559 #endif
00560             // complete type failure.
00561             return 0;
00562         }
00563 
00564     };
00565 
00566 #ifndef ORO_EMBEDDED
00567 
00571     template< class TResult >
00572     struct AdaptAssignableDataSource< TResult& >
00573     {
00574         typedef TResult& Result;
00575 
00576         AssignableDataSource<Result>* operator()( DataSourceBase::shared_ptr dsb) const
00577         {
00578             // equal case
00579             AssignableDataSource<Result>* t1 = AssignableDataSource<Result>::narrow( dsb.get() );
00580             if (t1)
00581                 return t1;
00582 
00583             // ref to assignable value case
00584             DataSource<Result>* t3 = DataSource<Result>::narrow( dsb.get() );
00585             if ( t3 )
00586                 return new detail::DataSourceAdaptor<Result, Result>( t3 ); // will return AssignableDS !
00587 
00588             // complete type failure.
00589             return 0;
00590         }
00591 
00592     };
00593 
00597     template< class TResult >
00598     struct AdaptDataSource< const TResult >
00599     {
00600         typedef const TResult Result;
00601 
00602         DataSource<Result>* operator()( DataSourceBase::shared_ptr dsb) const
00603         {
00604             // equal case
00605             DataSource<Result>* t1 = DataSource<Result>::narrow( dsb.get() );
00606             if (t1)
00607                 return t1;
00608 
00609             // const ref to const value case
00610             DataSource<const TResult&>* t2 = DataSource<const TResult&>::narrow( dsb.get() );
00611             if ( t2 )
00612                 return new detail::DataSourceAdaptor<const TResult&, Result>( t2 );
00613 
00614             // ref to const value case
00615             DataSource<TResult&>* t3 = DataSource<TResult&>::narrow( dsb.get() );
00616             if ( t3 )
00617                 return new detail::DataSourceAdaptor<TResult&, Result>( t3 );
00618 
00619             // value to const value case
00620             DataSource<TResult>* t4 = DataSource<TResult>::narrow( dsb.get() );
00621             if ( t4 )
00622                 return new detail::DataSourceAdaptor<TResult, Result>( t4 );
00623 
00624             // complete type failure.
00625             return 0;
00626         }
00627 
00628     };
00629 
00635     template< class TResult >
00636     struct AdaptDataSource< TResult& >
00637     {
00638         typedef TResult& Result;
00639 
00640         DataSource<Result>* operator()( DataSourceBase::shared_ptr dsb) const
00641         {
00642             // equal case
00643             DataSource<Result>* t1 = DataSource<Result>::narrow( dsb.get() );
00644             if (t1)
00645                 return t1;
00646 
00647             // assignable case
00648             AssignableDataSource<TResult>* t2 = AssignableDataSource<TResult>::narrow( dsb.get() );
00649             if (t2 && &(t2->set()) != 0 )
00650                 return new detail::AssignableDataSourceAdaptor<TResult, TResult&>( t2 );
00651 
00652             // complete type failure.
00653             return 0;
00654         }
00655 
00656     };
00657 
00658 #endif
00659 
00664     template<class TResult>
00665     struct AdaptDataSource<const TResult&>
00666     {
00667         DataSource<const TResult&>* operator()( DataSourceBase::shared_ptr dsb) const
00668         {
00669             // equal case
00670             DataSource<const TResult&>* t1 = DataSource<const TResult&>::narrow( dsb.get() );
00671             if (t1)
00672                 return t1;
00673 
00674             // value to const ref case
00675             // makes a copy !
00676             DataSource<TResult>* t2 = DataSource<TResult>::narrow( dsb.get() );
00677             if ( t2 )
00678                 return new detail::DataSourceAdaptor<TResult, const TResult&>( t2 );
00679 
00680             // assignable case: this is a more efficient implementation than the one above (t2)
00681             // does not involve a copy.
00682             AssignableDataSource<TResult>* ta1 =  AssignableDataSource<TResult>::narrow( dsb.get() );
00683             if (ta1 && &(ta1->set()) != 0 ) // check for null set()
00684                 return new detail::AssignableDataSourceAdaptor<TResult, const TResult&>( ta1 );
00685 
00686 #ifndef ORO_EMBEDDED
00687             // ref to const ref case
00688             DataSource<TResult&>* t3 = DataSource<TResult&>::narrow( dsb.get() );
00689             if ( t3 )
00690                 return new detail::DataSourceAdaptor<TResult&, const TResult&>( t3 );
00691 
00692             // const value to const ref case
00693             DataSource<const TResult>* t4 = DataSource<const TResult>::narrow( dsb.get() );
00694             if ( t4 )
00695                 return new detail::DataSourceAdaptor<const TResult, const TResult&>( t4 );
00696 
00697 #endif
00698 
00699             // complete type failure.
00700             return 0;
00701         }
00702 
00703     };
00704 }
00705 
00706 #endif

Generated on Tue Aug 25 14:17:22 2009 for Orocos Real-Time Toolkit by  doxygen 1.5.8