COIN-OR::LEMON - Graph Library

Ticket #116: 60eecd3fe37a.patch

File 60eecd3fe37a.patch, 9.3 KB (added by Alpar Juttner, 16 years ago)
  • lemon/arg_parser.cc

    # HG changeset patch
    # User Alpar Juttner <alpar@cs.elte.hu>
    # Date 1215983125 -3600
    # Node ID 60eecd3fe37a549ea3670375f74bda21d0b25790
    # Parent  81cfc04531e8fcf0a6e72f22ff2871fcb827c416
    Some cleanup in ArgParser API (ticket #116)
    
    diff --git a/lemon/arg_parser.cc b/lemon/arg_parser.cc
    a b  
    239239    return *this;
    240240  }
    241241
    242   void ArgParser::show(std::ostream &os,Opts::iterator i)
     242  void ArgParser::show(std::ostream &os,Opts::const_iterator i) const
    243243  {
    244244    os << "-" << i->first;
    245245    if(i->second.has_syn)
    246       for(Opts::iterator j=_opts.begin();j!=_opts.end();++j)
     246      for(Opts::const_iterator j=_opts.begin();j!=_opts.end();++j)
    247247        if(j->second.syn&&j->second.help==i->first)
    248248          os << "|-" << j->first;
    249249    switch(i->second.type) {
     
    261261    }
    262262  }
    263263
    264   void ArgParser::show(std::ostream &os,Groups::iterator i)
     264  void ArgParser::show(std::ostream &os,Groups::const_iterator i) const
    265265  {
    266     GroupData::Opts::iterator o=i->second.opts.begin();
     266    GroupData::Opts::const_iterator o=i->second.opts.begin();
    267267    while(o!=i->second.opts.end()) {
    268268      show(os,_opts.find(*o));
    269269      ++o;
     
    271271    }
    272272  }
    273273
    274   void ArgParser::showHelp(Opts::iterator i)
     274  void ArgParser::showHelp(Opts::const_iterator i) const
    275275  {
    276276    if(i->second.help.size()==0||i->second.syn) return;
    277277    std::cerr << "  ";
     
    279279    std::cerr << std::endl;
    280280    std::cerr << "     " << i->second.help << std::endl;
    281281  }
    282   void ArgParser::showHelp(std::vector<ArgParser::OtherArg>::iterator i)
     282  void ArgParser::showHelp(std::vector<ArgParser::OtherArg>::const_iterator i)
     283    const
    283284  {
    284285    if(i->help.size()==0) return;
    285286    std::cerr << "  " << i->name << std::endl
    286287              << "     " << i->help << std::endl;
    287288  }
    288289
    289   void ArgParser::shortHelp()
     290  void ArgParser::shortHelp() const
    290291  {
    291292    const unsigned int LINE_LEN=77;
    292293    const std::string indent("    ");
    293294    std::cerr << "Usage:\n  " << _command_name;
    294295    int pos=_command_name.size()+2;
    295     for(Groups::iterator g=_groups.begin();g!=_groups.end();++g) {
     296    for(Groups::const_iterator g=_groups.begin();g!=_groups.end();++g) {
    296297      std::ostringstream cstr;
    297298      cstr << ' ';
    298299      if(!g->second.mandatory) cstr << '[';
     
    305306      std::cerr << cstr.str();
    306307      pos+=cstr.str().size();
    307308    }
    308     for(Opts::iterator i=_opts.begin();i!=_opts.end();++i)
     309    for(Opts::const_iterator i=_opts.begin();i!=_opts.end();++i)
    309310      if(!i->second.ingroup&&!i->second.syn) {
    310311        std::ostringstream cstr;
    311312        cstr << ' ';
     
    319320        std::cerr << cstr.str();
    320321        pos+=cstr.str().size();
    321322      }
    322     for(std::vector<OtherArg>::iterator i=_others_help.begin();
     323    for(std::vector<OtherArg>::const_iterator i=_others_help.begin();
    323324        i!=_others_help.end();++i)
    324325      {
    325326        std::ostringstream cstr;
     
    335336    std::cerr << std::endl;
    336337  }
    337338
    338   void ArgParser::showHelp()
     339  void ArgParser::showHelp() const
    339340  {
    340341    shortHelp();
    341342    std::cerr << "Where:\n";
    342     for(std::vector<OtherArg>::iterator i=_others_help.begin();
     343    for(std::vector<OtherArg>::const_iterator i=_others_help.begin();
    343344        i!=_others_help.end();++i) showHelp(i);
    344     for(Opts::iterator i=_opts.begin();i!=_opts.end();++i) showHelp(i);
     345    for(Opts::const_iterator i=_opts.begin();i!=_opts.end();++i) showHelp(i);
    345346    exit(1);
    346347  }
    347348
    348349
    349   void ArgParser::unknownOpt(std::string arg)
     350  void ArgParser::unknownOpt(std::string arg) const
    350351  {
    351352    std::cerr << "\nUnknown option: " << arg << "\n";
    352353    std::cerr << "\nType '" << _command_name <<
     
    354355    exit(1);
    355356  }
    356357
    357   void ArgParser::requiresValue(std::string arg, OptType t)
     358  void ArgParser::requiresValue(std::string arg, OptType t) const
    358359  {
    359360    std::cerr << "Argument '" << arg << "' requires a";
    360361    switch(t) {
     
    375376  }
    376377
    377378
    378   void ArgParser::checkMandatories()
     379  void ArgParser::checkMandatories() const
    379380  {
    380381    bool ok=true;
    381     for(Opts::iterator i=_opts.begin();i!=_opts.end();++i)
     382    for(Opts::const_iterator i=_opts.begin();i!=_opts.end();++i)
    382383      if(i->second.mandatory&&!i->second.set)
    383384        {
    384385          if(ok)
     
    387388          ok=false;
    388389          showHelp(i);
    389390        }
    390     for(Groups::iterator i=_groups.begin();i!=_groups.end();++i)
     391    for(Groups::const_iterator i=_groups.begin();i!=_groups.end();++i)
    391392      if(i->second.mandatory||i->second.only_one)
    392393        {
    393394          int set=0;
    394           for(GroupData::Opts::iterator o=i->second.opts.begin();
     395          for(GroupData::Opts::const_iterator o=i->second.opts.begin();
    395396              o!=i->second.opts.end();++o)
    396397            if(_opts.find(*o)->second.set) ++set;
    397398          if(i->second.mandatory&&!set) {
    398399            std::cerr << _command_name <<
    399400              ": At least one of the following arguments is mandatory.\n";
    400401            ok=false;
    401             for(GroupData::Opts::iterator o=i->second.opts.begin();
     402            for(GroupData::Opts::const_iterator o=i->second.opts.begin();
    402403                o!=i->second.opts.end();++o)
    403404              showHelp(_opts.find(*o));
    404405          }
     
    406407            std::cerr << _command_name <<
    407408              ": At most one of the following arguments can be given.\n";
    408409            ok=false;
    409             for(GroupData::Opts::iterator o=i->second.opts.begin();
     410            for(GroupData::Opts::const_iterator o=i->second.opts.begin();
    410411                o!=i->second.opts.end();++o)
    411412              showHelp(_opts.find(*o));
    412413          }
  • lemon/arg_parser.h

    diff --git a/lemon/arg_parser.h b/lemon/arg_parser.h
    a b  
    271271
    272272    ///@}
    273273
    274     void show(std::ostream &os,Opts::iterator i);
    275     void show(std::ostream &os,Groups::iterator i);
    276     void showHelp(Opts::iterator i);
    277     void showHelp(std::vector<OtherArg>::iterator i);
    278     void shortHelp();
    279     void showHelp();
     274  private:
     275    void show(std::ostream &os,Opts::const_iterator i) const;
     276    void show(std::ostream &os,Groups::const_iterator i) const;
     277    void showHelp(Opts::const_iterator i) const;
     278    void showHelp(std::vector<OtherArg>::const_iterator i) const;
    280279
    281     void unknownOpt(std::string arg);
     280    void unknownOpt(std::string arg) const;
    282281
    283     void requiresValue(std::string arg, OptType t);
    284     void checkMandatories();
     282    void requiresValue(std::string arg, OptType t) const;
     283    void checkMandatories() const;
     284
     285    void shortHelp() const;
     286    void showHelp() const;
     287  public:
    285288
    286289    ///Start the parsing process
    287290    ArgParser &parse();
     
    293296    }
    294297
    295298    ///Give back the command name (the 0th argument)
    296     const std::string &commandName() { return _command_name; }
     299    const std::string &commandName() const { return _command_name; }
    297300
    298301    ///Check if an opion has been given to the command.
    299     bool given(std::string op)
     302    bool given(std::string op) const
    300303    {
    301       Opts::iterator i = _opts.find(op);
     304      Opts::const_iterator i = _opts.find(op);
    302305      return i!=_opts.end()?i->second.set:false;
    303306    }
    304307
     
    311314    ///throws an exception (i.e. it performs runtime type checking).
    312315    class RefType
    313316    {
    314       ArgParser &_parser;
     317      const ArgParser &_parser;
    315318      std::string _name;
    316319    public:
    317320      ///\e
    318       RefType(ArgParser &p,const std::string &n) :_parser(p),_name(n) {}
     321      RefType(const ArgParser &p,const std::string &n) :_parser(p),_name(n) {}
    319322      ///\e
    320323      operator bool()
    321324      {
    322         Opts::iterator i = _parser._opts.find(_name);
     325        Opts::const_iterator i = _parser._opts.find(_name);
    323326        LEMON_ASSERT(i!=_parser._opts.end(),
    324327                     std::string()+"Unkown option: '"+_name+"'");
    325328        LEMON_ASSERT(i->second.type==ArgParser::BOOL,
     
    329332      ///\e
    330333      operator std::string()
    331334      {
    332         Opts::iterator i = _parser._opts.find(_name);
     335        Opts::const_iterator i = _parser._opts.find(_name);
    333336        LEMON_ASSERT(i!=_parser._opts.end(),
    334337                     std::string()+"Unkown option: '"+_name+"'");
    335338        LEMON_ASSERT(i->second.type==ArgParser::STRING,
     
    339342      ///\e
    340343      operator double()
    341344      {
    342         Opts::iterator i = _parser._opts.find(_name);
     345        Opts::const_iterator i = _parser._opts.find(_name);
    343346        LEMON_ASSERT(i!=_parser._opts.end(),
    344347                     std::string()+"Unkown option: '"+_name+"'");
    345348        LEMON_ASSERT(i->second.type==ArgParser::DOUBLE ||
     
    351354      ///\e
    352355      operator int()
    353356      {
    354         Opts::iterator i = _parser._opts.find(_name);
     357        Opts::const_iterator i = _parser._opts.find(_name);
    355358        LEMON_ASSERT(i!=_parser._opts.end(),
    356359                     std::string()+"Unkown option: '"+_name+"'");
    357360        LEMON_ASSERT(i->second.type==ArgParser::INTEGER,
     
    365368
    366369    ///Give back the value of an option.
    367370    ///\sa RefType
    368     RefType operator[](const std::string &n)
     371    RefType operator[](const std::string &n) const
    369372    {
    370373      return RefType(*this, n);
    371374    }
     
    374377
    375378    ///Give back a reference to a vector consisting of the program arguments
    376379    ///not starting with a '-' character.
    377     std::vector<std::string> &files() { return _file_args; }
     380    const std::vector<std::string> &files() const { return _file_args; }
    378381
    379382  };
    380383}