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
00039 #ifndef ORO_PARTDATASOURCE_HPP_
00040 #define ORO_PARTDATASOURCE_HPP_
00041
00042 #include "DataSource.hpp"
00043 #include "../types/carray.hpp"
00044
00045 namespace RTT
00046 {
00047 namespace internal
00048 {
00061 template<typename T>
00062 class PartDataSource
00063 : public AssignableDataSource<T>
00064 {
00065
00066 typename AssignableDataSource<T>::reference_t mref;
00067
00068 base::DataSourceBase::shared_ptr mparent;
00069 public:
00070 ~PartDataSource() {}
00071
00072 typedef boost::intrusive_ptr<PartDataSource<T> > shared_ptr;
00073
00080 PartDataSource( typename AssignableDataSource<T>::reference_t ref,
00081 base::DataSourceBase::shared_ptr parent )
00082 : mref(ref), mparent(parent)
00083 {
00084 }
00085
00086 typename DataSource<T>::result_t get() const
00087 {
00088 return mref;
00089 }
00090
00091 typename DataSource<T>::result_t value() const
00092 {
00093 return mref;
00094 }
00095
00096 void set( typename AssignableDataSource<T>::param_t t )
00097 {
00098 mref = t;
00099 updated();
00100 }
00101
00102 typename AssignableDataSource<T>::reference_t set()
00103 {
00104 return mref;
00105 }
00106
00107 typename AssignableDataSource<T>::const_reference_t rvalue() const
00108 {
00109 return mref;
00110 }
00111
00112 void updated() {
00113 mparent->updated();
00114 }
00115
00116 virtual PartDataSource<T>* clone() const {
00117 return new PartDataSource<T>(mref, mparent);
00118 }
00119
00120 virtual PartDataSource<T>* copy( std::map<const base::DataSourceBase*, base::DataSourceBase*>& replace ) const {
00121
00122 if ( replace[this] != 0 ) {
00123 assert ( dynamic_cast<PartDataSource<T>*>( replace[this] ) == static_cast<PartDataSource<T>*>( replace[this] ) );
00124 return static_cast<PartDataSource<T>*>( replace[this] );
00125 }
00126
00127 replace[this] = new PartDataSource<T>(mref, mparent->copy(replace));
00128
00129 return static_cast<PartDataSource<T>*>(replace[this]);
00130
00131 }
00132 };
00133
00134 template<typename T>
00135 class PartDataSource< types::carray<T> >
00136 : public AssignableDataSource< types::carray<T> >
00137 {
00138
00139 types::carray<T> mref;
00140
00141 base::DataSourceBase::shared_ptr mparent;
00142 public:
00143 ~PartDataSource() {}
00144
00145 typedef boost::intrusive_ptr<PartDataSource<T> > shared_ptr;
00146
00153 PartDataSource( types::carray<T> ref,
00154 base::DataSourceBase::shared_ptr parent )
00155 : mref(ref), mparent(parent)
00156 {
00157 }
00158
00159 types::carray<T> get() const
00160 {
00161 return mref;
00162 }
00163
00164 types::carray<T> value() const
00165 {
00166 return mref;
00167 }
00168
00169 void set( typename AssignableDataSource< types::carray<T> >::param_t t )
00170 {
00171 mref = t;
00172 updated();
00173 }
00174
00175 types::carray<T>& set()
00176 {
00177 return mref;
00178 }
00179
00180 types::carray<T> const& rvalue() const
00181 {
00182 return mref;
00183 }
00184
00185 void updated() {
00186 mparent->updated();
00187 }
00188
00189 virtual PartDataSource* clone() const {
00190 return new PartDataSource(mref, mparent);
00191 }
00192
00193 virtual PartDataSource* copy( std::map<const base::DataSourceBase*, base::DataSourceBase*>& replace ) const {
00194
00195 if ( replace[this] != 0 ) {
00196 assert ( dynamic_cast<PartDataSource*>( replace[this] ) == static_cast<PartDataSource*>( replace[this] ) );
00197 return static_cast<PartDataSource*>( replace[this] );
00198 }
00199
00200 replace[this] = new PartDataSource(mref, mparent->copy(replace));
00201
00202 return static_cast<PartDataSource*>(replace[this]);
00203
00204 }
00205 };
00206 }
00207 }
00208
00209
00210 #endif