

#include <tclap/CmdLine.h>
#include <iostream>
#include <string>

using namespace TCLAP; 
using namespace std; 

string _orTest;
string _orTest2;
string _testc;
bool _testd;

void parseOptions(int argc, char** argv);

int main(int argc, char** argv)
{

  parseOptions(argc,argv);

  cout << "for A OR B we got : " << _orTest<< endl
     << "for string C we got : " << _testc << endl
     << "for string D we got : " << _testd << endl
     << "for E or F or G we got: " << _orTest2 << endl;

}


void parseOptions(int argc, char** argv)
{
  try {

  CmdLine cmd("this is a message", ' ', "0.99" );

  // 
  // Define arguments
  //

  ValueArg<string> atest("a", "aaa", "or test a", true, "homer", "string");
  ValueArg<string> btest("b", "bbb", "or test b", true, "homer", "string");
  cmd.xorAdd( atest, btest );

  ValueArg<string> ctest("c", "ccc", "c test", true, "homer", "string");
  cmd.add( ctest );

  SwitchArg dtest("", "ddd", "d test", false);
  cmd.add( dtest );

  ValueArg<string> etest("", "eee", "e test", false, "homer", "string");
  ValueArg<string> ftest("", "fff", "f test", false, "homer", "string");
  ValueArg<string> gtest("g", "ggg", "g test", false, "homer", "string");
  vector<Arg*> xorlist;
  xorlist.push_back(&etest);
  xorlist.push_back(&ftest);
  xorlist.push_back(&gtest);
  cmd.xorAdd( xorlist );

  MultiArg<string> itest("i", "iii", "or test i", true, "string");
  MultiArg<string> jtest("j", "jjj", "or test j", true, "string");
  cmd.xorAdd( itest, jtest );

  //
  // Parse the command line.
  //
  cmd.parse(argc,argv);


  //
  // Set variables
  //
  
  if ( atest.isSet() )
    _orTest = atest.getValue();
  else if ( btest.isSet() )
    _orTest = btest.getValue();
  else
    // Should never get here because TCLAP will note that one of the
    // required args above has not been set.
    throw("very bad things...");

  _testc = ctest.getValue();
  _testd = dtest.getValue();

  if ( etest.isSet() )
    _orTest2 = etest.getValue();
  else if ( ftest.isSet() )
    _orTest2 = ftest.getValue();
  else if ( gtest.isSet() )
    _orTest2 = gtest.getValue();
  else
    throw("still bad");

    if ( jtest.isSet() )
    {
        cout << "for J:" << endl;
        vector<string> v = jtest.getValue();
        for ( int z = 0; static_cast<unsigned int>(z) < v.size(); z++ )
            cout << " " << z << "  " << v[z] << endl;
    }
    else if ( itest.isSet() )
    {
        cout << "for I:" << endl;
        vector<string> v = itest.getValue();
        for ( int z = 0; static_cast<unsigned int>(z) < v.size(); z++ )
            cout << " " << z << "  " << v[z] << endl;
    }
    else
    throw("yup, still bad");
  


  } catch ( ArgException& e )
  { cout << "ERROR: " << e.error() << " " << e.argId() << endl; }
}



