Go to the documentation of this file.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 <mrpt/otherlibs/tclap/Arg.h>
00027 #include <string>
00028 #include <vector>
00029 #include <algorithm>
00030 #include <iostream>
00031
00032 namespace TCLAP {
00033
00034
00035
00036
00037
00038 class XorHandler
00039 {
00040 protected:
00041
00042
00043
00044
00045 std::vector< std::vector<Arg*> > _orList;
00046
00047 public:
00048
00049
00050
00051
00052 XorHandler( ) {}
00053
00054
00055
00056
00057
00058 void add( std::vector<Arg*>& ors );
00059
00060
00061
00062
00063
00064
00065
00066
00067 int check( const Arg* a );
00068
00069
00070
00071
00072 std::string shortUsage();
00073
00074
00075
00076
00077
00078 void printLongUsage(std::ostream& os);
00079
00080
00081
00082
00083
00084
00085 bool contains( const Arg* a );
00086
00087 std::vector< std::vector<Arg*> >& getXorList();
00088
00089 };
00090
00091
00092
00093
00094
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 for ( ArgVectorIterator it = _orList[i].begin();
00112 it != _orList[i].end();
00113 it++ )
00114 if ( a != (*it) )
00115 (*it)->xorSet();
00116
00117
00118 if ( (*ait)->allowMore() )
00119 return 0;
00120 else
00121 return static_cast<int>(_orList[i].size());
00122 }
00123 }
00124
00125 if ( a->isRequired() )
00126 return 1;
00127 else
00128 return 0;
00129 }
00130
00131 inline bool XorHandler::contains( const Arg* a )
00132 {
00133 for ( int i = 0; static_cast<unsigned int>(i) < _orList.size(); i++ )
00134 for ( ArgVectorIterator it = _orList[i].begin();
00135 it != _orList[i].end();
00136 it++ )
00137 if ( a == (*it) )
00138 return true;
00139
00140 return false;
00141 }
00142
00143 inline std::vector< std::vector<Arg*> >& XorHandler::getXorList()
00144 {
00145 return _orList;
00146 }
00147
00148
00149
00150
00151
00152
00153
00154 }
00155
00156 #endif