00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef TCLAP_VALUE_ARGUMENT_H
00024 #define TCLAP_VALUE_ARGUMENT_H
00025
00026 #include <string>
00027 #include <vector>
00028
00029 #include <tclap/Arg.h>
00030 #include <tclap/Constraint.h>
00031
00032 namespace TCLAP {
00033
00042 template<class T>
00043 class ValueArg : public Arg
00044 {
00045 protected:
00046
00052 T _value;
00053
00058 T _default;
00059
00067 std::string _typeDesc;
00068
00072 Constraint<T>* _constraint;
00073
00080 void _extractValue( const std::string& val );
00081
00082 public:
00083
00107 ValueArg( const std::string& flag,
00108 const std::string& name,
00109 const std::string& desc,
00110 bool req,
00111 T value,
00112 const std::string& typeDesc,
00113 Visitor* v = NULL);
00114
00115
00140 ValueArg( const std::string& flag,
00141 const std::string& name,
00142 const std::string& desc,
00143 bool req,
00144 T value,
00145 const std::string& typeDesc,
00146 CmdLineInterface& parser,
00147 Visitor* v = NULL );
00148
00171 ValueArg( const std::string& flag,
00172 const std::string& name,
00173 const std::string& desc,
00174 bool req,
00175 T value,
00176 Constraint<T>* constraint,
00177 CmdLineInterface& parser,
00178 Visitor* v = NULL );
00179
00201 ValueArg( const std::string& flag,
00202 const std::string& name,
00203 const std::string& desc,
00204 bool req,
00205 T value,
00206 Constraint<T>* constraint,
00207 Visitor* v = NULL );
00208
00218 virtual bool processArg(int* i, std::vector<std::string>& args);
00219
00223 T& getValue() ;
00224
00229 virtual std::string shortID(const std::string& val = "val") const;
00230
00235 virtual std::string longID(const std::string& val = "val") const;
00236
00237 virtual void reset() ;
00238
00239 private:
00243 ValueArg<T>(const ValueArg<T>& rhs);
00244 ValueArg<T>& operator=(const ValueArg<T>& rhs);
00245 };
00246
00247
00251 template<class T>
00252 ValueArg<T>::ValueArg(const std::string& flag,
00253 const std::string& name,
00254 const std::string& desc,
00255 bool req,
00256 T val,
00257 const std::string& typeDesc,
00258 Visitor* v)
00259 : Arg(flag, name, desc, req, true, v),
00260 _value( val ),
00261 _default( val ),
00262 _typeDesc( typeDesc ),
00263 _constraint( NULL )
00264 { }
00265
00266 template<class T>
00267 ValueArg<T>::ValueArg(const std::string& flag,
00268 const std::string& name,
00269 const std::string& desc,
00270 bool req,
00271 T val,
00272 const std::string& typeDesc,
00273 CmdLineInterface& parser,
00274 Visitor* v)
00275 : Arg(flag, name, desc, req, true, v),
00276 _value( val ),
00277 _default( val ),
00278 _typeDesc( typeDesc ),
00279 _constraint( NULL )
00280 {
00281 parser.add( this );
00282 }
00283
00284 template<class T>
00285 ValueArg<T>::ValueArg(const std::string& flag,
00286 const std::string& name,
00287 const std::string& desc,
00288 bool req,
00289 T val,
00290 Constraint<T>* constraint,
00291 Visitor* v)
00292 : Arg(flag, name, desc, req, true, v),
00293 _value( val ),
00294 _default( val ),
00295 _typeDesc( constraint->shortID() ),
00296 _constraint( constraint )
00297 { }
00298
00299 template<class T>
00300 ValueArg<T>::ValueArg(const std::string& flag,
00301 const std::string& name,
00302 const std::string& desc,
00303 bool req,
00304 T val,
00305 Constraint<T>* constraint,
00306 CmdLineInterface& parser,
00307 Visitor* v)
00308 : Arg(flag, name, desc, req, true, v),
00309 _value( val ),
00310 _default( val ),
00311 _typeDesc( constraint->shortID() ),
00312 _constraint( constraint )
00313 {
00314 parser.add( this );
00315 }
00316
00317
00321 template<class T>
00322 T& ValueArg<T>::getValue() { return _value; }
00323
00327 template<class T>
00328 bool ValueArg<T>::processArg(int *i, std::vector<std::string>& args)
00329 {
00330 if ( _ignoreable && Arg::ignoreRest() )
00331 return false;
00332
00333 if ( _hasBlanks( args[*i] ) )
00334 return false;
00335
00336 std::string flag = args[*i];
00337
00338 std::string value = "";
00339 trimFlag( flag, value );
00340
00341 if ( argMatches( flag ) )
00342 {
00343 if ( _alreadySet )
00344 {
00345 if ( _xorSet )
00346 throw( CmdLineParseException(
00347 "Mutually exclusive argument already set!",
00348 toString()) );
00349 else
00350 throw( CmdLineParseException("Argument already set!",
00351 toString()) );
00352 }
00353
00354 if ( Arg::delimiter() != ' ' && value == "" )
00355 throw( ArgParseException(
00356 "Couldn't find delimiter for this argument!",
00357 toString() ) );
00358
00359 if ( value == "" )
00360 {
00361 (*i)++;
00362 if ( static_cast<unsigned int>(*i) < args.size() )
00363 _extractValue( args[*i] );
00364 else
00365 throw( ArgParseException("Missing a value for this argument!",
00366 toString() ) );
00367 }
00368 else
00369 _extractValue( value );
00370
00371 _alreadySet = true;
00372 _checkWithVisitor();
00373 return true;
00374 }
00375 else
00376 return false;
00377 }
00378
00382 template<class T>
00383 std::string ValueArg<T>::shortID(const std::string& val) const
00384 {
00385 static_cast<void>(val);
00386 return Arg::shortID( _typeDesc );
00387 }
00388
00392 template<class T>
00393 std::string ValueArg<T>::longID(const std::string& val) const
00394 {
00395 static_cast<void>(val);
00396 return Arg::longID( _typeDesc );
00397 }
00398
00399 template<class T>
00400 void ValueArg<T>::_extractValue( const std::string& val )
00401 {
00402 try {
00403 ExtractValue(_value, val, typename ArgTraits<T>::ValueCategory());
00404 } catch( ArgParseException &e) {
00405 throw ArgParseException(e.error(), toString());
00406 }
00407
00408 if ( _constraint != NULL )
00409 if ( ! _constraint->check( _value ) )
00410 throw( CmdLineParseException( "Value '" + val +
00411 + "' does not meet constraint: "
00412 + _constraint->description(),
00413 toString() ) );
00414 }
00415
00416 template<class T>
00417 void ValueArg<T>::reset()
00418 {
00419 Arg::reset();
00420 _value = _default;
00421 }
00422
00423 }
00424
00425 #endif