$search
00001 00011 /***************************************************************************** 00012 ** Ifdefs 00013 *****************************************************************************/ 00014 00015 #ifndef TCLAP_XORHANDLER_H 00016 #define TCLAP_XORHANDLER_H 00017 00018 #include "arg.hpp" 00019 #include <string> 00020 #include <vector> 00021 #include <algorithm> 00022 #include <iostream> 00023 00024 namespace ecl { 00025 00032 class XorHandler 00033 { 00034 protected: 00035 00039 std::vector< std::vector<Arg*> > _orList; 00040 00041 public: 00042 00046 XorHandler( ) {} 00047 00052 void add( std::vector<Arg*>& ors ); 00053 00061 int check( const Arg* a ); 00062 00066 std::string shortUsage(); 00067 00072 void printLongUsage(std::ostream& os); 00073 00079 bool contains( const Arg* a ); 00080 00081 std::vector< std::vector<Arg*> >& getXorList(); 00082 00083 }; 00084 00085 00087 //BEGIN XOR.cpp 00089 inline void XorHandler::add( std::vector<Arg*>& ors ) 00090 { 00091 _orList.push_back( ors ); 00092 } 00093 00094 inline int XorHandler::check( const Arg* a ) 00095 { 00096 // iterate over each XOR list 00097 for ( int i = 0; static_cast<unsigned int>(i) < _orList.size(); i++ ) 00098 { 00099 // if the XOR list contains the arg.. 00100 ArgVectorIterator ait = std::find( _orList[i].begin(), 00101 _orList[i].end(), a ); 00102 if ( ait != _orList[i].end() ) 00103 { 00104 // go through and set each arg that is not a 00105 for ( ArgVectorIterator it = _orList[i].begin(); 00106 it != _orList[i].end(); 00107 it++ ) 00108 if ( a != (*it) ) 00109 (*it)->xorSet(); 00110 00111 // return the number of required args that have now been set 00112 if ( (*ait)->allowMore() ) 00113 return 0; 00114 else 00115 return static_cast<int>(_orList[i].size()); 00116 } 00117 } 00118 00119 if ( a->isRequired() ) 00120 return 1; 00121 else 00122 return 0; 00123 } 00124 00125 inline bool XorHandler::contains( const Arg* a ) 00126 { 00127 for ( int i = 0; static_cast<unsigned int>(i) < _orList.size(); i++ ) 00128 for ( ArgVectorIterator it = _orList[i].begin(); 00129 it != _orList[i].end(); 00130 it++ ) 00131 if ( a == (*it) ) 00132 return true; 00133 00134 return false; 00135 } 00136 00137 inline std::vector< std::vector<Arg*> >& XorHandler::getXorList() 00138 { 00139 return _orList; 00140 } 00141 00142 }; // namespace ecl 00143 00144 00145 #endif