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_MULTIPLE_ARGUMENT_H
00024 #define TCLAP_MULTIPLE_ARGUMENT_H
00025
00026 #include <string>
00027 #include <vector>
00028
00029 #include <tclap/Arg.h>
00030 #include <tclap/Constraint.h>
00031
00032 namespace TCLAP {
00038 template<class T>
00039 class MultiArg : public Arg
00040 {
00041 public:
00042 typedef std::vector<T> container_type;
00043 typedef typename container_type::iterator iterator;
00044 typedef typename container_type::const_iterator const_iterator;
00045
00046 protected:
00047
00051 std::vector<T> _values;
00052
00056 std::string _typeDesc;
00057
00061 Constraint<T>* _constraint;
00062
00069 void _extractValue( const std::string& val );
00070
00074 bool _allowMore;
00075
00076 public:
00077
00095 MultiArg( const std::string& flag,
00096 const std::string& name,
00097 const std::string& desc,
00098 bool req,
00099 const std::string& typeDesc,
00100 Visitor* v = NULL);
00101
00120 MultiArg( const std::string& flag,
00121 const std::string& name,
00122 const std::string& desc,
00123 bool req,
00124 const std::string& typeDesc,
00125 CmdLineInterface& parser,
00126 Visitor* v = NULL );
00127
00143 MultiArg( const std::string& flag,
00144 const std::string& name,
00145 const std::string& desc,
00146 bool req,
00147 Constraint<T>* constraint,
00148 Visitor* v = NULL );
00149
00166 MultiArg( const std::string& flag,
00167 const std::string& name,
00168 const std::string& desc,
00169 bool req,
00170 Constraint<T>* constraint,
00171 CmdLineInterface& parser,
00172 Visitor* v = NULL );
00173
00182 virtual bool processArg(int* i, std::vector<std::string>& args);
00183
00188 const std::vector<T>& getValue();
00189
00194 const_iterator begin() const { return _values.begin(); }
00195
00200 const_iterator end() const { return _values.end(); }
00201
00206 virtual std::string shortID(const std::string& val="val") const;
00207
00212 virtual std::string longID(const std::string& val="val") const;
00213
00218 virtual bool isRequired() const;
00219
00220 virtual bool allowMore();
00221
00222 virtual void reset();
00223
00224 };
00225
00226 template<class T>
00227 MultiArg<T>::MultiArg(const std::string& flag,
00228 const std::string& name,
00229 const std::string& desc,
00230 bool req,
00231 const std::string& typeDesc,
00232 Visitor* v)
00233 : Arg( flag, name, desc, req, true, v ),
00234 _typeDesc( typeDesc ),
00235 _constraint( NULL ),
00236 _allowMore(false)
00237 {
00238 _acceptsMultipleValues = true;
00239 }
00240
00241 template<class T>
00242 MultiArg<T>::MultiArg(const std::string& flag,
00243 const std::string& name,
00244 const std::string& desc,
00245 bool req,
00246 const std::string& typeDesc,
00247 CmdLineInterface& parser,
00248 Visitor* v)
00249 : Arg( flag, name, desc, req, true, v ),
00250 _typeDesc( typeDesc ),
00251 _constraint( NULL ),
00252 _allowMore(false)
00253 {
00254 parser.add( this );
00255 _acceptsMultipleValues = true;
00256 }
00257
00261 template<class T>
00262 MultiArg<T>::MultiArg(const std::string& flag,
00263 const std::string& name,
00264 const std::string& desc,
00265 bool req,
00266 Constraint<T>* constraint,
00267 Visitor* v)
00268 : Arg( flag, name, desc, req, true, v ),
00269 _typeDesc( constraint->shortID() ),
00270 _constraint( constraint ),
00271 _allowMore(false)
00272 {
00273 _acceptsMultipleValues = true;
00274 }
00275
00276 template<class T>
00277 MultiArg<T>::MultiArg(const std::string& flag,
00278 const std::string& name,
00279 const std::string& desc,
00280 bool req,
00281 Constraint<T>* constraint,
00282 CmdLineInterface& parser,
00283 Visitor* v)
00284 : Arg( flag, name, desc, req, true, v ),
00285 _typeDesc( constraint->shortID() ),
00286 _constraint( constraint ),
00287 _allowMore(false)
00288 {
00289 parser.add( this );
00290 _acceptsMultipleValues = true;
00291 }
00292
00293 template<class T>
00294 const std::vector<T>& MultiArg<T>::getValue() { return _values; }
00295
00296 template<class T>
00297 bool MultiArg<T>::processArg(int *i, std::vector<std::string>& args)
00298 {
00299 if ( _ignoreable && Arg::ignoreRest() )
00300 return false;
00301
00302 if ( _hasBlanks( args[*i] ) )
00303 return false;
00304
00305 std::string flag = args[*i];
00306 std::string value = "";
00307
00308 trimFlag( flag, value );
00309
00310 if ( argMatches( flag ) )
00311 {
00312 if ( Arg::delimiter() != ' ' && value == "" )
00313 throw( ArgParseException(
00314 "Couldn't find delimiter for this argument!",
00315 toString() ) );
00316
00317
00318 if ( value == "" )
00319 {
00320 (*i)++;
00321 if ( static_cast<unsigned int>(*i) < args.size() )
00322 _extractValue( args[*i] );
00323 else
00324 throw( ArgParseException("Missing a value for this argument!",
00325 toString() ) );
00326 }
00327 else
00328 _extractValue( value );
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338 _alreadySet = true;
00339 _checkWithVisitor();
00340
00341 return true;
00342 }
00343 else
00344 return false;
00345 }
00346
00350 template<class T>
00351 std::string MultiArg<T>::shortID(const std::string& val) const
00352 {
00353 static_cast<void>(val);
00354 return Arg::shortID(_typeDesc) + " ... ";
00355 }
00356
00360 template<class T>
00361 std::string MultiArg<T>::longID(const std::string& val) const
00362 {
00363 static_cast<void>(val);
00364 return Arg::longID(_typeDesc) + " (accepted multiple times)";
00365 }
00366
00371 template<class T>
00372 bool MultiArg<T>::isRequired() const
00373 {
00374 if ( _required )
00375 {
00376 if ( _values.size() > 1 )
00377 return false;
00378 else
00379 return true;
00380 }
00381 else
00382 return false;
00383
00384 }
00385
00386 template<class T>
00387 void MultiArg<T>::_extractValue( const std::string& val )
00388 {
00389 try {
00390 T tmp;
00391 ExtractValue(tmp, val, typename ArgTraits<T>::ValueCategory());
00392 _values.push_back(tmp);
00393 } catch( ArgParseException &e) {
00394 throw ArgParseException(e.error(), toString());
00395 }
00396
00397 if ( _constraint != NULL )
00398 if ( ! _constraint->check( _values.back() ) )
00399 throw( CmdLineParseException( "Value '" + val +
00400 "' does not meet constraint: " +
00401 _constraint->description(),
00402 toString() ) );
00403 }
00404
00405 template<class T>
00406 bool MultiArg<T>::allowMore()
00407 {
00408 bool am = _allowMore;
00409 _allowMore = true;
00410 return am;
00411 }
00412
00413 template<class T>
00414 void MultiArg<T>::reset()
00415 {
00416 Arg::reset();
00417 _values.clear();
00418 }
00419
00420 }
00421
00422 #endif