Go to the documentation of this file.00001
00011
00012
00013
00014
00015 #ifndef TCLAP_SWITCH_ARG_H
00016 #define TCLAP_SWITCH_ARG_H
00017
00018 #include <string>
00019 #include <vector>
00020
00021 #include "arg.hpp"
00022
00023 namespace ecl {
00024
00025
00031 class SwitchArg : public Arg
00032 {
00033 protected:
00034
00038 bool _value;
00039
00040 public:
00041
00054 SwitchArg(const std::string& flag,
00055 const std::string& name,
00056 const std::string& desc,
00057 bool def = false,
00058 Visitor* v = NULL);
00059
00060
00074 SwitchArg(const std::string& flag,
00075 const std::string& name,
00076 const std::string& desc,
00077 CmdLineInterface& parser,
00078 bool def = false,
00079 Visitor* v = NULL);
00080
00081
00090 virtual bool processArg(int* i, std::vector<std::string>& args);
00091
00096 bool combinedSwitchesMatch(std::string& combined);
00097
00101 bool getValue();
00102
00103 };
00104
00106
00108 inline SwitchArg::SwitchArg(const std::string& flag,
00109 const std::string& name,
00110 const std::string& desc,
00111 bool _default,
00112 Visitor* v )
00113 : Arg(flag, name, desc, false, false, v),
00114 _value( _default )
00115 { }
00116
00117 inline SwitchArg::SwitchArg(const std::string& flag,
00118 const std::string& name,
00119 const std::string& desc,
00120 CmdLineInterface& parser,
00121 bool _default,
00122 Visitor* v )
00123 : Arg(flag, name, desc, false, false, v),
00124 _value( _default )
00125 {
00126 parser.add( this );
00127 }
00128
00129 inline bool SwitchArg::getValue() { return _value; }
00130
00131 inline bool SwitchArg::combinedSwitchesMatch(std::string& combinedSwitches )
00132 {
00133
00134 if ( combinedSwitches[0] != Arg::flagStartString()[0] )
00135 return false;
00136
00137
00138 if ( combinedSwitches.substr( 0, Arg::nameStartString().length() ) ==
00139 Arg::nameStartString() )
00140 return false;
00141
00142
00143
00144 for ( unsigned int i = 1; i < combinedSwitches.length(); i++ )
00145 if ( combinedSwitches[i] == _flag[0] )
00146 {
00147
00148
00149
00150
00151 combinedSwitches[i] = Arg::blankChar();
00152 return true;
00153 }
00154
00155
00156 return false;
00157 }
00158
00159
00160 inline bool SwitchArg::processArg(int *i, std::vector<std::string>& args)
00161 {
00162 if ( _ignoreable && Arg::ignoreRest() )
00163 return false;
00164
00165 if ( argMatches( args[*i] ) || combinedSwitchesMatch( args[*i] ) )
00166 {
00167
00168
00169
00170 bool ret = false;
00171 if ( argMatches( args[*i] ) )
00172 ret = true;
00173
00174 if ( _alreadySet || ( !ret && combinedSwitchesMatch( args[*i] ) ) )
00175 throw(CmdLineParseException("Argument already set!", toString()));
00176
00177 _alreadySet = true;
00178
00179 if ( _value == true )
00180 _value = false;
00181 else
00182 _value = true;
00183
00184 _checkWithVisitor();
00185
00186 return ret;
00187 }
00188 else
00189 return false;
00190 }
00191
00193
00195
00196 };
00197
00198
00199 #endif