xor_handler.hpp
Go to the documentation of this file.
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


ecl_command_line
Author(s): Daniel Stonier (d.stonier@gmail.com)
autogenerated on Thu Jan 2 2014 11:12:37