00001 #ifndef OBTConfigurationItem_H
00002 #define OBTConfigurationItem_H
00003
00004 #include <vector>
00005 #include <map>
00006 #include <string>
00007 #include "OBT_ASSERT.h"
00008
00009 namespace OBT
00010 {
00021 class OBT_API ConfigurationItem
00022 {
00023 public:
00024
00025 friend class AbstractConfigurationFileParser ;
00026
00030 ConfigurationItem( const char* name ) ;
00031
00035 virtual ~ConfigurationItem() ;
00036
00041 const char* getName() const ;
00042
00048 const ConfigurationItem* getChild( unsigned int childNumber ) const ;
00049
00055 std::vector<const ConfigurationItem*> getChildren( const char* name ) const ;
00056
00061 void addChild( const ConfigurationItem& child ) ;
00062
00067 unsigned int getChildrenCount() const ;
00068
00074 const char* getArgument( const char* key ) const ;
00075
00081 std::pair< const char*, const char* > getArgument( unsigned int argument ) const ;
00082
00088 void addArgument( const char* key, const char* value ) ;
00089
00094 unsigned int getArgumentsCount() const ;
00095
00100 std::string traceConfigurationItems() const ;
00101
00106 const char* getText() const ;
00107
00112 void setText( const char* text ) ;
00113
00118 int getLine() const ;
00119
00124 void setLine( int line ) ;
00125
00130 int getColumn() const ;
00131
00136 void setColumn( int column ) ;
00137
00138 private:
00139
00145 ConfigurationItem& touchChild( unsigned int childNumber ) ;
00146
00152 std::vector<ConfigurationItem*> touchChildren( const char* name ) ;
00153
00155 std::string _name ;
00156
00158 std::string _text;
00159
00161 int _line;
00162
00164 int _column;
00165
00167 std::map<std::string, std::string> _arguments ;
00168
00170 std::vector<ConfigurationItem> _children ;
00171
00172 } ;
00173
00174
00175
00176
00177 inline const char*
00178 ConfigurationItem::getName() const
00179 {
00180 return _name.c_str() ;
00181 }
00182
00183
00184
00185
00186 inline const char*
00187 ConfigurationItem::getText() const
00188 {
00189 if ( _text.empty() )
00190 {
00191 return NULL ;
00192 }
00193 else
00194 {
00195 return _text.c_str() ;
00196 }
00197 }
00198
00199
00200
00201
00202 inline void
00203 ConfigurationItem::setText(const char* text)
00204 {
00205 if ( text )
00206 {
00207 _text = text ;
00208 }
00209 }
00210
00211
00212
00213
00214 inline int
00215 ConfigurationItem::getLine() const
00216 {
00217 return _line ;
00218 }
00219
00220
00221
00222
00223 inline void
00224 ConfigurationItem::setLine( int line )
00225 {
00226 _line = line ;
00227 }
00228
00229
00230
00231
00232 inline int
00233 ConfigurationItem::getColumn() const
00234 {
00235 return _column ;
00236 }
00237
00238
00239
00240
00241 inline void
00242 ConfigurationItem::setColumn( int column)
00243 {
00244 _column = column ;
00245 }
00246
00247
00248
00249
00250 inline const ConfigurationItem*
00251 ConfigurationItem::getChild( unsigned int childNumber ) const
00252 {
00253 if ( childNumber < _children.size() )
00254 {
00255 return &_children[childNumber] ;
00256 }
00257 else
00258 {
00259 return NULL ;
00260 }
00261 }
00262
00263
00264
00265
00266 inline ConfigurationItem&
00267 ConfigurationItem::touchChild( unsigned int childNumber )
00268 {
00269 return _children.at( childNumber ) ;
00270 }
00271
00272
00273
00274
00275 inline void
00276 ConfigurationItem::addChild( const ConfigurationItem& child )
00277 {
00278 _children.push_back( child ) ;
00279 }
00280
00281
00282
00283
00284 inline unsigned int
00285 ConfigurationItem::getChildrenCount() const
00286 {
00287 return static_cast<unsigned int>( _children.size() ) ;
00288 }
00289
00290
00291
00292
00293 inline const char*
00294 ConfigurationItem::getArgument( const char* key ) const
00295 {
00296 std::map<std::string, std::string>::const_iterator ite( _arguments.find( key ) ) ;
00297 if ( ite != _arguments.end() )
00298 {
00299 return ite->second.c_str() ;
00300 }
00301 else
00302 {
00303 return NULL ;
00304 }
00305 }
00306
00307
00308
00309
00310 inline
00311 unsigned int ConfigurationItem::getArgumentsCount() const
00312 {
00313 return static_cast< unsigned int >( _arguments.size( ) ) ;
00314 }
00315
00316
00317
00318
00319 inline
00320 std::pair< const char*, const char* > ConfigurationItem::getArgument( unsigned int argument ) const
00321 {
00322 std::map<std::string, std::string>::const_iterator ite( _arguments.begin() ) ;
00323 for ( ; argument != 0; --argument )
00324 {
00325 ++ite ;
00326 }
00327 return std::pair< const char*, const char* >( ite->first.c_str(), ite->second.c_str() ) ;
00328 }
00329
00330
00331
00332
00333 inline void
00334 ConfigurationItem::addArgument( const char* key, const char* value )
00335 {
00336 _arguments.insert( std::make_pair( key, value ) ) ;
00337 }
00338 }
00339 #endif //header