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 #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
00504 DataSource<Result>* t1 = DataSource<Result>::narrow( dsb.get() );
00505 if (t1)
00506 return t1;
00507
00508
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
00515 DataSource<Result&>* t3 = DataSource<Result&>::narrow( dsb.get() );
00516 if ( t3 )
00517 return new detail::DataSourceAdaptor<Result&, Result>( t3 );
00518
00519
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
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
00542 AssignableDataSource<Result>* t1 = AssignableDataSource<Result>::narrow( dsb.get() );
00543 if (t1)
00544 return t1;
00545
00546 #if 0
00547
00548
00549 AssignableDataSource<const Result&>* t2 = AssignableDataSource<const Result&>::narrow( dsb.get() );
00550 if ( t2 )
00551 return new detail::AssignableDataSourceAdaptor<const Result&, Result>( t2 );
00552 #endif
00553
00554 #ifndef ORO_EMBEDDED
00555
00556 DataSource<Result&>* t3 = DataSource<Result&>::narrow( dsb.get() );
00557 if ( t3 )
00558 return new detail::DataSourceAdaptor<Result&, Result>( t3 );
00559 #endif
00560
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
00579 AssignableDataSource<Result>* t1 = AssignableDataSource<Result>::narrow( dsb.get() );
00580 if (t1)
00581 return t1;
00582
00583
00584 DataSource<Result>* t3 = DataSource<Result>::narrow( dsb.get() );
00585 if ( t3 )
00586 return new detail::DataSourceAdaptor<Result, Result>( t3 );
00587
00588
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
00605 DataSource<Result>* t1 = DataSource<Result>::narrow( dsb.get() );
00606 if (t1)
00607 return t1;
00608
00609
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
00615 DataSource<TResult&>* t3 = DataSource<TResult&>::narrow( dsb.get() );
00616 if ( t3 )
00617 return new detail::DataSourceAdaptor<TResult&, Result>( t3 );
00618
00619
00620 DataSource<TResult>* t4 = DataSource<TResult>::narrow( dsb.get() );
00621 if ( t4 )
00622 return new detail::DataSourceAdaptor<TResult, Result>( t4 );
00623
00624
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
00643 DataSource<Result>* t1 = DataSource<Result>::narrow( dsb.get() );
00644 if (t1)
00645 return t1;
00646
00647
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
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
00670 DataSource<const TResult&>* t1 = DataSource<const TResult&>::narrow( dsb.get() );
00671 if (t1)
00672 return t1;
00673
00674
00675
00676 DataSource<TResult>* t2 = DataSource<TResult>::narrow( dsb.get() );
00677 if ( t2 )
00678 return new detail::DataSourceAdaptor<TResult, const TResult&>( t2 );
00679
00680
00681
00682 AssignableDataSource<TResult>* ta1 = AssignableDataSource<TResult>::narrow( dsb.get() );
00683 if (ta1 && &(ta1->set()) != 0 )
00684 return new detail::AssignableDataSourceAdaptor<TResult, const TResult&>( ta1 );
00685
00686 #ifndef ORO_EMBEDDED
00687
00688 DataSource<TResult&>* t3 = DataSource<TResult&>::narrow( dsb.get() );
00689 if ( t3 )
00690 return new detail::DataSourceAdaptor<TResult&, const TResult&>( t3 );
00691
00692
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
00700 return 0;
00701 }
00702
00703 };
00704 }
00705
00706 #endif