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_XORHANDLER_H
00024 #define TCLAP_XORHANDLER_H
00025
00026 #include <tclap/Arg.h>
00027 #include <string>
00028 #include <vector>
00029 #include <algorithm>
00030 #include <iostream>
00031
00032 namespace TCLAP {
00033
00038 class XorHandler
00039 {
00040 protected:
00041
00045 std::vector< std::vector<Arg*> > _orList;
00046
00047 public:
00048
00052 XorHandler( ) : _orList(std::vector< std::vector<Arg*> >()) {}
00053
00058 void add( std::vector<Arg*>& ors );
00059
00067 int check( const Arg* a );
00068
00072 std::string shortUsage();
00073
00078 void printLongUsage(std::ostream& os);
00079
00085 bool contains( const Arg* a );
00086
00087 std::vector< std::vector<Arg*> >& getXorList();
00088
00089 };
00090
00091
00093
00095 inline void XorHandler::add( std::vector<Arg*>& ors )
00096 {
00097 _orList.push_back( ors );
00098 }
00099
00100 inline int XorHandler::check( const Arg* a )
00101 {
00102
00103 for ( int i = 0; static_cast<unsigned int>(i) < _orList.size(); i++ )
00104 {
00105
00106 ArgVectorIterator ait = std::find( _orList[i].begin(),
00107 _orList[i].end(), a );
00108 if ( ait != _orList[i].end() )
00109 {
00110
00111
00112 for ( ArgVectorIterator it = _orList[i].begin();
00113 it != _orList[i].end();
00114 it++ )
00115 if ( a != (*it) && (*it)->isSet() )
00116 throw(CmdLineParseException(
00117 "Mutually exclusive argument already set!",
00118 (*it)->toString()));
00119
00120
00121 for ( ArgVectorIterator it = _orList[i].begin();
00122 it != _orList[i].end();
00123 it++ )
00124 if ( a != (*it) )
00125 (*it)->xorSet();
00126
00127
00128 if ( (*ait)->allowMore() )
00129 return 0;
00130 else
00131 return static_cast<int>(_orList[i].size());
00132 }
00133 }
00134
00135 if ( a->isRequired() )
00136 return 1;
00137 else
00138 return 0;
00139 }
00140
00141 inline bool XorHandler::contains( const Arg* a )
00142 {
00143 for ( int i = 0; static_cast<unsigned int>(i) < _orList.size(); i++ )
00144 for ( ArgVectorIterator it = _orList[i].begin();
00145 it != _orList[i].end();
00146 it++ )
00147 if ( a == (*it) )
00148 return true;
00149
00150 return false;
00151 }
00152
00153 inline std::vector< std::vector<Arg*> >& XorHandler::getXorList()
00154 {
00155 return _orList;
00156 }
00157
00158
00159
00161
00163
00164 }
00165
00166 #endif