PropertySequence.hpp
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 #ifndef PI_PROPERTY_SEQUENCE_HPP
00039 #define PI_PROPERTY_SEQUENCE_HPP
00040
00041 #include "PropertyBase.hpp"
00042 #include <vector>
00043
00044 #ifdef ORO_PRAGMA_INTERFACE
00045 #pragma interface
00046 #endif
00047
00048 namespace RTT
00049 {
00083 template< class T >
00084 class PropertySequence
00085 {
00086 public:
00087 typedef std::vector<T*> PropertyContainerType;
00088 typedef typename PropertyContainerType::iterator iterator;
00089 typedef typename PropertyContainerType::const_iterator const_iterator;
00090
00094 PropertySequence( )
00095 : _properties(), type("type_less")
00096 {}
00097
00103 PropertySequence( const std::string& _type)
00104 : _properties(), type(_type)
00105 {}
00106
00112 PropertySequence( const PropertySequence<T>& orig)
00113 : _properties( orig.getProperties() ), type( orig.getType() )
00114 {
00115 }
00116
00121 void add(T *p)
00122 {
00123 _properties.push_back(p);
00124 }
00125
00130 void remove(T *p)
00131 {
00132 iterator i = std::find(_properties.begin(), _properties.end(), p);
00133 if ( i != _properties.end() )
00134 _properties.erase(i);
00135 }
00136
00141 void clear()
00142 {
00143 _properties.clear();
00144 }
00145
00146
00152 void list(std::vector<std::string> &names) const
00153 {
00154 for (
00155 const_iterator i = _properties.begin();
00156 i != _properties.end();
00157 i++ )
00158 {
00159 names.push_back( (*i)->getName() );
00160 }
00161 }
00162
00170 T* find(const std::string& name) const
00171 {
00172 const_iterator i( std::find_if(_properties.begin(), _properties.end(), std::bind2nd(FindProp(), name ) ) );
00173 if ( i != _properties.end() )
00174 return ( *i );
00175 return 0;
00176 }
00177
00183 PropertySequence<T>& operator=(const PropertySequence<T>& orig)
00184 {
00185 if ( &orig == this )
00186 return *this;
00187 _properties.clear();
00188
00189 const_iterator i = orig.getProperties().begin();
00190 while (i != orig.getProperties().end() )
00191 {
00192 add( (*i) );
00193 ++i;
00194 }
00195 return *this;
00196 }
00197
00204 PropertySequence<T>& operator<<=(const PropertySequence<T>& source)
00205 {
00206
00207 const_iterator it(source.getProperties().begin());
00208 while ( it != source.getProperties().end() )
00209 {
00210 T* mine = find( (*it)->getName() );
00211 if (mine != 0)
00212 remove(mine);
00213 add( (*it) );
00214 ++it;
00215 }
00216 return *this;
00217 }
00218
00219 const std::string& getType() const { return type;}
00220
00221 const PropertyContainerType& getProperties() const { return _properties; }
00222
00223 protected:
00224 PropertyContainerType _properties;
00225
00229 struct FindProp : public std::binary_function<const T*,const std::string, bool>
00230 {
00231 bool operator()(const T* b1, const std::string& b2) const { return b1->getName() == b2; }
00232 };
00233
00234 const std::string type;
00235 };
00236
00237
00251 template< class T>
00252 void refreshProperties(PropertySequence<T>& target, const PropertySequence<T>& source);
00253
00262 template< class T>
00263 void copyProperties(PropertySequence<T>& target, const PropertySequence<T>& source);
00264
00269 template< class T>
00270 void deleteProperties(PropertySequence<T>& target);
00271
00279 template< class T>
00280 inline
00281 void update(PropertySequence<T>& a, const PropertySequence<T>& b)
00282 {
00283 refreshProperties(a,b);
00284 }
00285
00289 template< class T>
00290 inline
00291 void copy(PropertySequence<T>& a, const PropertySequence<T>& b)
00292 {
00293 copyProperties(a,b);
00294 }
00295
00296 }
00297 #endif