Go to the documentation of this file.00001
00011
00012
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
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
00097 for ( int i = 0; static_cast<unsigned int>(i) < _orList.size(); i++ )
00098 {
00099
00100 ArgVectorIterator ait = std::find( _orList[i].begin(),
00101 _orList[i].end(), a );
00102 if ( ait != _orList[i].end() )
00103 {
00104
00105 for ( ArgVectorIterator it = _orList[i].begin();
00106 it != _orList[i].end();
00107 it++ )
00108 if ( a != (*it) )
00109 (*it)->xorSet();
00110
00111
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 };
00143
00144
00145 #endif