PT-Cooling-Log 1.0
PTCoolingLogViewer
src/Switch.cc
00001 #include "Switch.hh"
00002 #include "ArgParser.hh"
00003 #include "Usage.hh"
00004 
00005 #include <list>
00006 #include <iomanip>
00007 #include <iostream>
00008 
00009 using namespace std;
00010 
00011 Switch::Switch() : map< string, ArgParser* > () {
00012   Switch& sw = *this;
00013   sw[ "help" ]    = new Usage( this );
00014   sw[ "Help" ]    = sw[ "help" ];
00015   sw[ "HELP" ]    = sw[ "help" ];
00016   sw[ "?" ]       = sw[ "help" ];
00017   
00018 }
00019 
00020 Switch::~Switch(){
00021   // delete all parser object
00022   list< ArgParser* > buff;
00023   for( Switch::iterator itr = this->begin(); itr != this->end(); itr++ ){
00024     if( itr->second != NULL ) buff.push_back( itr->second );
00025   }
00026   buff.sort();
00027   buff.unique();
00028   for( list< ArgParser* >::iterator itr = buff.begin();
00029        itr != buff.end(); itr++ ) 
00030     delete (*itr);
00031   
00032 }
00033 
00034 vector< string > Switch::divide( const std::string& argv ){
00035   static string lOpt( "--" );
00036   vector< string > data( 0 );
00037   if( argv.substr( 0, lOpt.size() ) != lOpt ) return data;
00038   int sep = argv.find( "=" );
00039   data.resize( 2, "" );
00040   if( sep == string::npos ){
00041     data[ 0 ] = argv.substr( 2 );
00042   } else {
00043     data[ 0 ] = argv.substr( 2, sep - 2 );
00044     data[ 1 ] = argv.substr( sep + 1 );
00045   }
00046   return data;
00047 }
00048 
00049 bool Switch::parse( const vector< string >& argList ){
00050   for( int i = 0; i < argList.size(); i++ ){
00051     vector< string > d = this->divide( argList[ i ] );
00052     if( d.size() == 0 ) continue;
00053     Switch::iterator itr = this->find( d[ 0 ] );
00054     if( itr == this->end() ) {
00055       
00056       continue;
00057     }
00058     if( ! ( *( itr->second ) )( d[ 1 ] ) ) return false;
00059   }
00060   return true;
00061 }
00062 
 全て クラス ファイル 関数 変数