UniversalIndentGUI 1.2.0
|
00001 00002 /****************************************************************************** 00003 * 00004 * file: UnlabeledValueArg.h 00005 * 00006 * Copyright (c) 2003, Michael E. Smoot . 00007 * Copyright (c) 2004, Michael E. Smoot, Daniel Aarno. 00008 * All rights reverved. 00009 * 00010 * See the file COPYING in the top directory of this distribution for 00011 * more information. 00012 * 00013 * THE SOFTWARE IS PROVIDED _AS IS_, WITHOUT WARRANTY OF ANY KIND, EXPRESS 00014 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 00015 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 00016 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 00017 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 00018 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 00019 * DEALINGS IN THE SOFTWARE. 00020 * 00021 *****************************************************************************/ 00022 00023 00024 #ifndef TCLAP_UNLABELED_VALUE_ARGUMENT_H 00025 #define TCLAP_UNLABELED_VALUE_ARGUMENT_H 00026 00027 #include <string> 00028 #include <vector> 00029 00030 #include <tclap/ValueArg.h> 00031 #include <tclap/OptionalUnlabeledTracker.h> 00032 00033 00034 namespace TCLAP { 00035 00042 template<class T> 00043 class UnlabeledValueArg : public ValueArg<T> 00044 { 00045 00046 // If compiler has two stage name lookup (as gcc >= 3.4 does) 00047 // this is requried to prevent undef. symbols 00048 using ValueArg<T>::_ignoreable; 00049 using ValueArg<T>::_hasBlanks; 00050 using ValueArg<T>::_extractValue; 00051 using ValueArg<T>::_typeDesc; 00052 using ValueArg<T>::_name; 00053 using ValueArg<T>::_description; 00054 using ValueArg<T>::_alreadySet; 00055 using ValueArg<T>::toString; 00056 00057 public: 00058 00080 UnlabeledValueArg( const std::string& name, 00081 const std::string& desc, 00082 bool req, 00083 T value, 00084 const std::string& typeDesc, 00085 bool ignoreable = false, 00086 Visitor* v = NULL); 00087 00110 UnlabeledValueArg( const std::string& name, 00111 const std::string& desc, 00112 bool req, 00113 T value, 00114 const std::string& typeDesc, 00115 CmdLineInterface& parser, 00116 bool ignoreable = false, 00117 Visitor* v = NULL ); 00118 00138 UnlabeledValueArg( const std::string& name, 00139 const std::string& desc, 00140 bool req, 00141 T value, 00142 Constraint<T>* constraint, 00143 bool ignoreable = false, 00144 Visitor* v = NULL ); 00145 00146 00167 UnlabeledValueArg( const std::string& name, 00168 const std::string& desc, 00169 bool req, 00170 T value, 00171 Constraint<T>* constraint, 00172 CmdLineInterface& parser, 00173 bool ignoreable = false, 00174 Visitor* v = NULL); 00175 00184 virtual bool processArg(int* i, std::vector<std::string>& args); 00185 00189 virtual std::string shortID(const std::string& val="val") const; 00190 00194 virtual std::string longID(const std::string& val="val") const; 00195 00199 virtual bool operator==(const Arg& a ) const; 00200 00205 virtual void addToList( std::list<Arg*>& argList ) const; 00206 00207 }; 00208 00212 template<class T> 00213 UnlabeledValueArg<T>::UnlabeledValueArg(const std::string& name, 00214 const std::string& desc, 00215 bool req, 00216 T val, 00217 const std::string& typeDesc, 00218 bool ignoreable, 00219 Visitor* v) 00220 : ValueArg<T>("", name, desc, req, val, typeDesc, v) 00221 { 00222 _ignoreable = ignoreable; 00223 00224 OptionalUnlabeledTracker::check(req, toString()); 00225 00226 } 00227 00228 template<class T> 00229 UnlabeledValueArg<T>::UnlabeledValueArg(const std::string& name, 00230 const std::string& desc, 00231 bool req, 00232 T val, 00233 const std::string& typeDesc, 00234 CmdLineInterface& parser, 00235 bool ignoreable, 00236 Visitor* v) 00237 : ValueArg<T>("", name, desc, req, val, typeDesc, v) 00238 { 00239 _ignoreable = ignoreable; 00240 OptionalUnlabeledTracker::check(req, toString()); 00241 parser.add( this ); 00242 } 00243 00247 template<class T> 00248 UnlabeledValueArg<T>::UnlabeledValueArg(const std::string& name, 00249 const std::string& desc, 00250 bool req, 00251 T val, 00252 Constraint<T>* constraint, 00253 bool ignoreable, 00254 Visitor* v) 00255 : ValueArg<T>("", name, desc, req, val, constraint, v) 00256 { 00257 _ignoreable = ignoreable; 00258 OptionalUnlabeledTracker::check(req, toString()); 00259 } 00260 00261 template<class T> 00262 UnlabeledValueArg<T>::UnlabeledValueArg(const std::string& name, 00263 const std::string& desc, 00264 bool req, 00265 T val, 00266 Constraint<T>* constraint, 00267 CmdLineInterface& parser, 00268 bool ignoreable, 00269 Visitor* v) 00270 : ValueArg<T>("", name, desc, req, val, constraint, v) 00271 { 00272 _ignoreable = ignoreable; 00273 OptionalUnlabeledTracker::check(req, toString()); 00274 parser.add( this ); 00275 } 00276 00280 template<class T> 00281 bool UnlabeledValueArg<T>::processArg(int *i, std::vector<std::string>& args) 00282 { 00283 00284 if ( _alreadySet ) 00285 return false; 00286 00287 if ( _hasBlanks( args[*i] ) ) 00288 return false; 00289 00290 // never ignore an unlabeled arg 00291 00292 _extractValue( args[*i] ); 00293 _alreadySet = true; 00294 return true; 00295 } 00296 00300 template<class T> 00301 std::string UnlabeledValueArg<T>::shortID(const std::string& val) const 00302 { 00303 static_cast<void>(val); // Ignore input, don't warn 00304 return std::string("<") + _typeDesc + ">"; 00305 } 00306 00310 template<class T> 00311 std::string UnlabeledValueArg<T>::longID(const std::string& val) const 00312 { 00313 static_cast<void>(val); // Ignore input, don't warn 00314 00315 // Ideally we would like to be able to use RTTI to return the name 00316 // of the type required for this argument. However, g++ at least, 00317 // doesn't appear to return terribly useful "names" of the types. 00318 return std::string("<") + _typeDesc + ">"; 00319 } 00320 00324 template<class T> 00325 bool UnlabeledValueArg<T>::operator==(const Arg& a ) const 00326 { 00327 if ( _name == a.getName() || _description == a.getDescription() ) 00328 return true; 00329 else 00330 return false; 00331 } 00332 00333 template<class T> 00334 void UnlabeledValueArg<T>::addToList( std::list<Arg*>& argList ) const 00335 { 00336 argList.push_back( const_cast<Arg*>(static_cast<const Arg* const>(this)) ); 00337 } 00338 00339 } 00340 #endif