Orocos Real-Time Toolkit
2.5.0
|
00001 #ifndef ORO_CORELIB_DATASOURCES_INL 00002 #define ORO_CORELIB_DATASOURCES_INL 00003 00004 #include "DataSources.hpp" 00005 #include "DataSource.inl" 00006 00007 namespace RTT 00008 { namespace internal { 00009 00010 template<typename T> 00011 ValueDataSource<T>::~ValueDataSource() {} 00012 00013 template<typename T> 00014 ValueDataSource<T>::ValueDataSource( T data ) 00015 : mdata( data ) 00016 { 00017 } 00018 00019 template<typename T> 00020 ValueDataSource<T>::ValueDataSource( ) 00021 : mdata() 00022 { 00023 } 00024 00025 template<typename T> 00026 void ValueDataSource<T>::set( typename AssignableDataSource<T>::param_t t ) 00027 { 00028 mdata = t; 00029 } 00030 00031 template<typename T> 00032 ValueDataSource<T>* ValueDataSource<T>::clone() const 00033 { 00034 return new ValueDataSource<T>( mdata ); 00035 } 00036 00037 template<typename T> 00038 ValueDataSource<T>* ValueDataSource<T>::copy( std::map<const base::DataSourceBase*, base::DataSourceBase*>& replace ) const { 00039 // if somehow a copy exists, return the copy, otherwise return this (see Attribute copy) 00040 if ( replace[this] != 0 ) { 00041 assert ( dynamic_cast<ValueDataSource<T>*>( replace[this] ) == static_cast<ValueDataSource<T>*>( replace[this] ) ); 00042 return static_cast<ValueDataSource<T>*>( replace[this] ); 00043 } 00044 // Other pieces in the code rely on insertion in the map : 00045 replace[this] = const_cast<ValueDataSource<T>*>(this); 00046 // return this instead of a copy. 00047 return const_cast<ValueDataSource<T>*>(this); 00048 } 00049 00050 template<typename T> 00051 ConstantDataSource<T>::~ConstantDataSource() {} 00052 00053 template<typename T> 00054 ConstantDataSource<T>::ConstantDataSource( T value ) 00055 : mdata( value ) 00056 { 00057 } 00058 00059 template<typename T> 00060 ConstantDataSource<T>* ConstantDataSource<T>::clone() const 00061 { 00062 return new ConstantDataSource<T>(mdata); 00063 } 00064 00065 template<typename T> 00066 ConstantDataSource<T>* ConstantDataSource<T>::copy( std::map<const base::DataSourceBase*, base::DataSourceBase*>& alreadyCloned ) const { 00067 // no copy needed, share this with all instances. 00068 return const_cast<ConstantDataSource<T>*>(this); 00069 } 00070 00071 template<typename T> 00072 ConstReferenceDataSource<T>::~ConstReferenceDataSource() {} 00073 00074 template<typename T> 00075 ConstReferenceDataSource<T>::ConstReferenceDataSource( typename DataSource<T>::const_reference_t ref ) 00076 : mref( ref ) 00077 { 00078 } 00079 00080 template<typename T> 00081 ConstReferenceDataSource<T>* ConstReferenceDataSource<T>::clone() const 00082 { 00083 return new ConstReferenceDataSource<T>(mref); 00084 } 00085 00086 template<typename T> 00087 ConstReferenceDataSource<T>* ConstReferenceDataSource<T>::copy( std::map<const base::DataSourceBase*, base::DataSourceBase*>& alreadyCloned ) const { 00088 return const_cast<ConstReferenceDataSource<T>*>(this); // no copy needed, data is outside. 00089 } 00090 00091 template<typename T> 00092 ReferenceDataSource<T>::~ReferenceDataSource() {} 00093 00094 template<typename T> 00095 ReferenceDataSource<T>::ReferenceDataSource( typename AssignableDataSource<T>::reference_t ref ) 00096 : mptr( &ref ) 00097 { 00098 } 00099 template<typename T> 00100 void ReferenceDataSource<T>::set( typename AssignableDataSource<T>::param_t t ) 00101 { 00102 *mptr = t; 00103 } 00104 00105 template<typename T> 00106 ReferenceDataSource<T>* ReferenceDataSource<T>::clone() const 00107 { 00108 return new ReferenceDataSource<T>(*mptr); 00109 } 00110 00111 template<typename T> 00112 ReferenceDataSource<T>* ReferenceDataSource<T>::copy( std::map<const base::DataSourceBase*, base::DataSourceBase*>& alreadyCloned ) const { 00113 return const_cast<ReferenceDataSource<T>*>(this); // no copy needed, data is outside. 00114 } 00115 00116 template<typename T> 00117 ArrayDataSource<T>::~ArrayDataSource() { delete[] mdata; } 00118 00119 template<typename T> 00120 ArrayDataSource<T>::ArrayDataSource( std::size_t size ) 00121 : mdata(size ? new typename T::value_type[size] : 0 ), marray(mdata,size) 00122 { 00123 } 00124 00125 template<typename T> 00126 ArrayDataSource<T>::ArrayDataSource( T const& oarray ) 00127 : mdata( oarray.count() ? new typename T::value_type[oarray.count()] : 0 ), marray(mdata, oarray.count()) 00128 { 00129 marray = oarray; // deep copy! 00130 } 00131 00132 template<typename T> 00133 void ArrayDataSource<T>::newArray( std::size_t size ) 00134 { 00135 delete[] mdata; 00136 mdata = size ? new typename T::value_type[size] : 0; 00137 for(std::size_t i=0; i!= size; ++i) mdata[i] = typename T::value_type(); 00138 marray.init(mdata,size); 00139 } 00140 00141 template<typename T> 00142 void ArrayDataSource<T>::set( typename AssignableDataSource<T>::param_t t ) 00143 { 00144 // makes a deep copy ! 00145 marray = t; 00146 } 00147 00148 template<typename T> 00149 ArrayDataSource<T>* ArrayDataSource<T>::clone() const 00150 { 00151 ArrayDataSource<T>* ret = new ArrayDataSource<T>( marray.count() ); 00152 ret->set( marray ); 00153 return ret; 00154 } 00155 00156 template<typename T> 00157 ArrayDataSource<T>* ArrayDataSource<T>::copy( std::map<const base::DataSourceBase*, base::DataSourceBase*>& replace ) const { 00158 // if somehow a copy exists, return the copy, otherwise return this (see Attribute copy) 00159 if ( replace[this] != 0 ) { 00160 assert ( dynamic_cast<ArrayDataSource<T>*>( replace[this] ) == static_cast<ArrayDataSource<T>*>( replace[this] ) ); 00161 return static_cast<ArrayDataSource<T>*>( replace[this] ); 00162 } 00163 // Other pieces in the code rely on insertion in the map : 00164 replace[this] = const_cast<ArrayDataSource<T>*>(this); 00165 // return this instead of a copy. 00166 return const_cast<ArrayDataSource<T>*>(this); 00167 } 00168 00169 template< typename BoundT> 00170 UnboundDataSource<BoundT>::UnboundDataSource( typename BoundT::result_t data ) 00171 : BoundT( data ) 00172 { 00173 } 00174 00175 template< typename BoundT> 00176 UnboundDataSource<BoundT>::UnboundDataSource( ) 00177 { 00178 } 00179 00180 template< typename BoundT> 00181 UnboundDataSource<BoundT>* UnboundDataSource<BoundT>::copy( std::map<const base::DataSourceBase*, base::DataSourceBase*>& replace) const { 00182 if ( replace[this] != 0 ) 00183 return static_cast<UnboundDataSource<BoundT>*>(replace[this]); 00184 replace[this] = new UnboundDataSource<BoundT>( this->get() ); 00185 return static_cast<UnboundDataSource<BoundT>*>(replace[this]); 00186 } 00187 } 00188 } 00189 00190 #endif