clingo
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups
program_options.h
Go to the documentation of this file.
1 //
2 // Copyright (c) Benjamin Kaufmann 2004
3 //
4 // This is free software; you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation; either version 2 of the License, or
7 // (at your option) any later version.
8 //
9 // This file is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 // GNU General Public License for more details.
13 //
14 // You should have received a copy of the GNU General Public License
15 // along with this file; if not, write to the Free Software
16 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 //
18 //
19 // NOTE: ProgramOptions is inspired by Boost.Program_options
20 // see: www.boost.org/libs/program_options
21 //
22 #ifndef PROGRAM_OPTIONS_PROGRAM_OPTIONS_H_INCLUDED
23 #define PROGRAM_OPTIONS_PROGRAM_OPTIONS_H_INCLUDED
24 #include "value.h"
25 #include "detail/refcountable.h"
26 #include <iosfwd>
27 #include <set>
28 #include <map>
29 #include <vector>
30 #include <stdexcept>
31 #include <memory>
32 #include <cstdio>
33 namespace ProgramOptions {
34 
36 
45 class Option : public detail::RefCountable {
46 public:
55  Option( const std::string& longName, char shortName,
56  const char* description, Value* value);
57 
58  ~Option();
59 
60  const std::string& name() const { return name_; }
61  char alias() const { return value_->alias(); }
62  Value* value() const { return value_; }
63  const char* description() const { return description_; }
64  const char* argName() const { return value_->arg(); }
65  bool assignDefault() const;
66  std::size_t maxColumn() const;
67  DescriptionLevel descLevel() const { return value_->level(); }
68 private:
69  std::string name_; // name (and unique key) of option
70  const char* description_; // description of the option (used for --help)
71  Value* value_; // the option's value manager
72 };
73 
75 
76 class OptionInitHelper;
77 class OptionContext;
78 class OptionParser;
79 class ParsedValues;
80 class ParsedOptions;
81 class OptionOutput;
82 
84 
88 class OptionGroup {
89 public:
90  typedef std::vector<SharedOptPtr> OptionList;
91  typedef OptionList::const_iterator option_iterator;
92 
97  ~OptionGroup();
98 
100  const std::string& caption() const { return caption_; }
101 
102  std::size_t size() const { return options_.size(); }
103  bool empty() const { return options_.empty(); }
104  option_iterator begin() const { return options_.begin(); }
105  option_iterator end() const { return options_.end(); }
106  DescriptionLevel descLevel()const { return level_; }
107 
109 
122 
124  void addOption(std::auto_ptr<Option> option);
125 
126  void setDescriptionLevel(DescriptionLevel level) { level_ = level; }
127 
129  void format(OptionOutput& out, size_t maxW, DescriptionLevel level = desc_level_default) const;
130 
131  std::size_t maxColumn(DescriptionLevel level) const;
132 private:
133  friend class OptionContext;
134  std::string caption_;
135  OptionList options_;
136  DescriptionLevel level_;
137 };
138 
140 public:
141  explicit OptionInitHelper(OptionGroup& owner);
142 
144 
152  OptionInitHelper& operator()(const char* key,
153  Value* val, const char* desc);
154 private:
155  OptionGroup* owner_;
156 };
157 
159 
168 private:
169  typedef std::size_t key_type;
170  typedef std::map<std::string, key_type> Name2Key;
171  typedef std::vector<OptionGroup> GroupList;
172  typedef Name2Key::const_iterator index_iterator;
173  typedef std::pair<index_iterator, index_iterator> PrefixRange;
174  typedef OptionGroup::OptionList OptionList;
175 public:
177  typedef OptionList::const_iterator option_iterator;
178  typedef PrefixRange OptionRange;
179 
180  OptionContext(const std::string& caption = "", DescriptionLevel desc_default = desc_level_default);
181  ~OptionContext();
182 
183  const std::string& caption() const;
184 
186 
194  OptionContext& add(const OptionGroup& group);
195 
197 
200  OptionContext& addAlias(const std::string& aliasName, option_iterator option);
201 
203 
210  OptionContext& add(const OptionContext& other);
211 
212  option_iterator begin() const { return options_.begin(); }
213  option_iterator end() const { return options_.end(); }
214 
216  std::size_t size() const { return options_.size(); }
218  std::size_t groups() const { return groups_.size(); }
219 
221 
223 
236  option_iterator find(const char* key, FindType t = find_name) const;
241  option_iterator tryFind(const char* key, FindType t = find_name) const;
242 
243  OptionRange findImpl(const char* key, FindType t, unsigned eMask = unsigned(-1)) const { return findImpl(key, t, eMask, caption()); }
244  OptionRange findImpl(const char* key, FindType t, unsigned eMask, const std::string& eCtx) const;
245 
246  const OptionGroup& findGroup(const std::string& caption) const;
247  const OptionGroup* tryFindGroup(const std::string& caption) const;
248 
250 
255  DescriptionLevel getActiveDescLevel() const { return descLevel_; }
256 
259 
261  std::string defaults(std::size_t prefixSize = 0) const;
262 
264  friend std::ostream& operator<<(std::ostream& os, const OptionContext& ctx);
265 
267 
270  bool assignDefaults(const ParsedOptions& exclude) const;
271 private:
272  void insertOption(size_t groupId, const SharedOptPtr& o);
273  size_t findGroupKey(const std::string& name) const;
274 
275  Name2Key index_;
276  OptionList options_;
277  GroupList groups_;
278  std::string caption_;
279  DescriptionLevel descLevel_;
280 };
281 
282 class OptionParser;
283 class ParsedValues;
284 
287 public:
288  ParsedOptions();
289  ~ParsedOptions();
290  bool empty() const { return parsed_.empty(); }
291  std::size_t size() const { return parsed_.size(); }
292  std::size_t count(const std::string& name) const { return parsed_.count(name); }
293  void add(const std::string& name) { parsed_.insert(name); }
294 
296 
307  bool assign(const ParsedValues& p, const ParsedOptions* exclude = 0);
308 private:
309  std::set<std::string> parsed_;
310  int assign(const Option& o, const std::string& value);
311 };
312 
317 public:
318  typedef std::pair<SharedOptPtr, std::string> OptionAndValue;
319  typedef std::vector<OptionAndValue> Values;
320  typedef Values::const_iterator iterator;
321 
325  explicit ParsedValues(const OptionContext& a_ctx)
326  : ctx(&a_ctx)
327  {}
329 
331  void add(const std::string& opt, const std::string& value);
332  void add(const SharedOptPtr& opt, const std::string& value) {
333  parsed_.push_back(OptionAndValue(opt, value));
334  }
335 
336  iterator begin() const { return parsed_.begin(); }
337  iterator end() const { return parsed_.end(); }
338 
339  void clear() { parsed_.clear(); }
340 private:
341  Values parsed_;
342 };
343 
345 public:
347  virtual ~ParseContext();
348  virtual SharedOptPtr getOption(const char* name, FindType ft) = 0;
349  virtual SharedOptPtr getOption(int posKey, const char* tok) = 0;
350  virtual void addValue(const SharedOptPtr& key, const std::string& value) = 0;
351 };
352 
355 public:
357  explicit OptionParser(ParseContext& ctx);
358  virtual ~OptionParser();
359  ParseContext& parse();
360 protected:
361  ParseContext& ctx() const { return *ctx_; }
362  SharedOptPtr getOption(const char* name, FindType ft) const { return ctx_->getOption(name, ft); }
363  SharedOptPtr getOption(int posKey, const char* tok) const { return ctx_->getOption(posKey, tok); }
364  void addOptionValue(const SharedOptPtr& key, const std::string& value) { ctx_->addValue(key, value); }
365 private:
366  virtual void doParse() = 0;
367  ParseContext* ctx_;
368 };
369 
372  std::size_t format(std::vector<char>&, const OptionContext&) { return 0; }
374  std::size_t format(std::vector<char>& buffer, const OptionGroup& g);
376  std::size_t format(std::vector<char>& buffer, const Option& o, std::size_t maxW);
378 
382  std::size_t format(std::vector<char>& buffer, const char* desc, const Value&, std::size_t maxW);
383 };
384 
387 public:
389  virtual ~OptionOutput() {}
390  virtual bool printContext(const OptionContext& ctx) = 0;
391  virtual bool printGroup(const OptionGroup& group) = 0;
392  virtual bool printOption(const Option& opt, std::size_t maxW) = 0;
393 };
394 
396 template <class Writer, class Formatter = DefaultFormat>
398 public:
399  OptionOutputImpl(const Writer& w = Writer(), const Formatter& form = Formatter())
400  : writer_(w)
401  , formatter_(form) { }
402  bool printContext(const OptionContext& ctx) {
403  writer_.write(buffer_, formatter_.format(buffer_, ctx));
404  return true;
405  }
406  bool printGroup(const OptionGroup& group) {
407  writer_.write(buffer_, formatter_.format(buffer_, group));
408  return true;
409  }
410  bool printOption(const Option& opt, std::size_t maxW) {
411  writer_.write(buffer_, formatter_.format(buffer_, opt, maxW));
412  writer_.write(buffer_, formatter_.format(buffer_, opt.description(), *opt.value(), maxW));
413  return true;
414  }
415 private:
416  std::vector<char> buffer_;
417  Writer writer_;
418  Formatter formatter_;
419 };
422  OstreamWriter(std::ostream& os) : out(os) {}
423  void write(const std::vector<char>& buf, std::size_t num);
424  std::ostream& out;
425 private: void operator=(const OstreamWriter&);
426 };
428 struct StringWriter {
429  StringWriter(std::string& str) : out(str) {}
430  void write(const std::vector<char>& buf, std::size_t num);
431  std::string& out;
432 private: void operator=(const StringWriter&);
433 };
435 struct FileWriter {
436  FileWriter(FILE* f) : out(f) {}
437  void write(const std::vector<char>& buf, std::size_t num);
438  FILE* out;
439 };
444 // parse functions
446 
452 typedef bool (*PosOption)(const std::string&, std::string&);
453 
456 };
457 
473 ParsedValues parseCommandLine(int& argc, char** argv, const OptionContext& ctx,
474  bool allowUnregistered = true,
475  PosOption posParser = 0, unsigned flags = 0);
476 
477 ParseContext& parseCommandLine(int& argc, char** argv, ParseContext& ctx, unsigned flags = 0);
478 
491 ParsedValues parseCommandString(const std::string& cmd, const OptionContext& ctx, bool allowUnreg = false, PosOption posParser = 0, unsigned flags = command_line_allow_flag_value);
492 ParseContext& parseCommandString(const char* cmd, ParseContext& ctx, unsigned flags = command_line_allow_flag_value);
493 
507 ParsedValues parseCfgFile(std::istream& is, const OptionContext& o, bool allowUnregistered);
508 
509 }
510 
511 #endif
DescriptionLevel getActiveDescLevel() const
Definition: program_options.h:255
Definition: program_options.h:455
OptionList::const_iterator option_iterator
Type for identifying an option within a context.
Definition: program_options.h:177
virtual void addValue(const SharedOptPtr &key, const std::string &value)=0
Definition: program_options.h:344
OptionOutputImpl< StringWriter > StringOut
Definition: program_options.h:441
iterator end() const
Definition: program_options.h:337
virtual ~ParseContext()
Definition: program_options.cpp:575
iterator begin() const
Definition: program_options.h:336
std::size_t size() const
Definition: program_options.h:102
DescriptionLevel
Definition: value.h:38
char alias() const
Definition: program_options.h:61
bool printGroup(const OptionGroup &group)
Definition: program_options.h:406
void add(const SharedOptPtr &opt, const std::string &value)
Definition: program_options.h:332
FILE * out
Definition: program_options.h:438
Definition: refcountable.h:37
~Option()
Definition: program_options.cpp:195
virtual SharedOptPtr getOption(const char *name, FindType ft)=0
OptionOutputImpl< OstreamWriter > StreamOut
Definition: program_options.h:440
Definition: program_options.h:220
const char * argName() const
Definition: program_options.h:64
std::size_t groups() const
Returns the number of groups in this context.
Definition: program_options.h:218
Definition: program_options.h:220
const std::string & caption() const
Returns the caption of this group.
Definition: program_options.h:100
const std::string & name() const
Definition: program_options.h:60
Set of options holding a parsed value.
Definition: program_options.h:286
OptionContext::FindType FindType
Definition: program_options.h:356
A (logically grouped) list of unique options.
Definition: program_options.h:167
FindType
Definition: program_options.h:220
option_iterator begin() const
Definition: program_options.h:212
bool assignDefault() const
Definition: program_options.cpp:219
OptionContext & addAlias(const std::string &aliasName, option_iterator option)
Adds an alias name for the given option.
Definition: program_options.cpp:339
Writes formatted option descriptions to an std::string.
Definition: program_options.h:428
void setActiveDescLevel(DescriptionLevel level)
Sets the description level to be used when generating description.
Definition: program_options.cpp:315
PrefixRange OptionRange
Definition: program_options.h:178
std::vector< OptionAndValue > Values
Definition: program_options.h:319
ParsedValues parseCommandString(const std::string &cmd, const OptionContext &ctx, bool allowUnreg=false, PosOption posParser=0, unsigned flags=command_line_allow_flag_value)
Definition: program_options.cpp:875
Manages the value of an option and defines how it is parsed from a string.
Definition: value.h:53
const OptionGroup & findGroup(const std::string &caption) const
Definition: program_options.cpp:347
auto f
Definition: statements.cc:122
const OptionGroup * tryFindGroup(const std::string &caption) const
Definition: program_options.cpp:352
option_iterator end() const
Definition: program_options.h:213
ParsedValues parseCommandLine(int &argc, char **argv, const OptionContext &ctx, bool allowUnregistered=true, PosOption posParser=0, unsigned flags=0)
Definition: program_options.cpp:858
OptionList::const_iterator option_iterator
Definition: program_options.h:91
OptionContext(const std::string &caption="", DescriptionLevel desc_default=desc_level_default)
Definition: program_options.cpp:306
StringWriter(std::string &str)
Definition: program_options.h:429
void add(const std::string &opt, const std::string &value)
Adds a value for option opt.
Definition: program_options.cpp:555
const OptionContext * ctx
Definition: program_options.h:328
OptionInitHelper & operator()(const char *key, Value *val, const char *desc)
Factory function for creating an option.
Definition: program_options.cpp:263
Definition: program_options.h:139
OptionOutput()
Definition: program_options.h:388
std::size_t format(std::vector< char > &, const OptionContext &)
Definition: program_options.h:372
Implementation class for printing options.
Definition: program_options.h:397
OptionGroup(const std::string &caption="", DescriptionLevel descLevel=desc_level_default)
Definition: program_options.cpp:228
const char * arg() const
Returns the name of this value.
Definition: program_options.cpp:134
std::unique_ptr< ValTerm > val(Value v)
Definition: term_helper.hh:31
ParseContext & ctx() const
Definition: program_options.h:361
bool assignDefaults(const ParsedOptions &exclude) const
Assigns any default values to all options not in exclude.
Definition: program_options.cpp:482
Writes formatted option descriptions to an std::ostream.
Definition: program_options.h:421
void write(const std::vector< char > &buf, std::size_t num)
Definition: program_options.cpp:111
OstreamWriter(std::ostream &os)
Definition: program_options.h:422
std::size_t size() const
Returns the number of options in this context.
Definition: program_options.h:216
option_iterator begin() const
Definition: program_options.h:104
void format(OptionOutput &out, size_t maxW, DescriptionLevel level=desc_level_default) const
Creates a formated description of all options with level() <= level in this group.
Definition: program_options.cpp:250
OptionInitHelper addOptions()
Returns an object that can be used to add options.
Definition: program_options.cpp:231
Represents one program option.
Definition: program_options.h:45
Option(const std::string &longName, char shortName, const char *description, Value *value)
Definition: program_options.cpp:186
DescriptionLevel descLevel() const
Definition: program_options.h:106
void addOptionValue(const SharedOptPtr &key, const std::string &value)
Definition: program_options.h:364
Value * level(DescriptionLevel lev)
Sets a description level for the corresponding option.
Definition: value.h:96
void write(const std::vector< char > &buf, std::size_t num)
Definition: program_options.cpp:114
void add(const std::string &name)
Definition: program_options.h:293
std::size_t size() const
Definition: program_options.h:291
bool assign(const ParsedValues &p, const ParsedOptions *exclude=0)
Assigns the parsed values in p to their options.
Definition: program_options.cpp:496
std::vector< SharedOptPtr > OptionList
Definition: program_options.h:90
friend std::ostream & operator<<(std::ostream &os, const OptionContext &ctx)
Writes a formatted description of options in this context to os.
Definition: program_options.cpp:476
OptionContext::FindType FindType
Definition: program_options.h:346
Definition: program_options.h:316
virtual bool printGroup(const OptionGroup &group)=0
std::pair< SharedOptPtr, std::string > OptionAndValue
Definition: program_options.h:318
Writes formatted option descriptions to a FILE.
Definition: program_options.h:435
OptionContext & add(const OptionGroup &group)
Adds the given group of options to this context.
Definition: program_options.cpp:325
DescriptionLevel descLevel() const
Definition: program_options.h:67
bool printOption(const Option &opt, std::size_t maxW)
Definition: program_options.h:410
void setDescriptionLevel(DescriptionLevel level)
Definition: program_options.h:126
const char * description() const
Definition: program_options.h:63
option_iterator find(const char *key, FindType t=find_name) const
Returns the option with the given key.
Definition: program_options.cpp:384
OptionParser(ParseContext &ctx)
Definition: program_options.cpp:564
ParseContext & parse()
Definition: program_options.cpp:571
unsigned num
Definition: dependency.cc:114
option_iterator tryFind(const char *key, FindType t=find_name) const
Definition: program_options.cpp:388
Values::const_iterator iterator
Definition: program_options.h:320
Value * value() const
Definition: program_options.h:62
OptionOutputImpl< FileWriter > FileOut
Definition: program_options.h:442
tuple p
Definition: server.py:49
OptionOutputImpl(const Writer &w=Writer(), const Formatter &form=Formatter())
Definition: program_options.h:399
StringSet str
Definition: dependency.cc:92
bool empty() const
Definition: program_options.h:290
std::size_t maxColumn() const
Definition: program_options.cpp:198
Base class for options parsers.
Definition: program_options.h:354
void write(const std::vector< char > &buf, std::size_t num)
Definition: program_options.cpp:108
ParsedValues(const OptionContext &a_ctx)
Definition: program_options.h:325
Value * alias(char c)
Sets an alias name for the corresponding option.
Definition: value.h:89
const std::string & caption() const
Definition: program_options.cpp:312
ParsedOptions()
Definition: program_options.cpp:494
virtual ~OptionOutput()
Definition: program_options.h:389
Definition: refcountable.h:26
bool printContext(const OptionContext &ctx)
Definition: program_options.h:402
void addOption(std::auto_ptr< Option > option)
Adds option to this group.
Definition: program_options.cpp:235
OptionOutput & description(OptionOutput &out) const
Writes a formatted description of options in this context.
Definition: program_options.cpp:426
unsigned flags
Definition: program_options.cpp:588
CommandLineFlags
Definition: program_options.h:454
std::ostream & out
Definition: program_options.h:424
~OptionGroup()
Definition: program_options.cpp:229
ParsedValues parseCfgFile(std::istream &is, const OptionContext &o, bool allowUnregistered)
Definition: program_options.cpp:880
~OptionContext()
Definition: program_options.cpp:310
Definition: program_options.h:220
Base class for printing options.
Definition: program_options.h:386
std::size_t maxColumn(DescriptionLevel level) const
Definition: program_options.cpp:240
std::string defaults(std::size_t prefixSize=0) const
Returns the default command-line of this context.
Definition: program_options.cpp:446
std::string & out
Definition: program_options.h:431
option_iterator end() const
Definition: program_options.h:105
bool(* PosOption)(const std::string &, std::string &)
Definition: program_options.h:452
bool empty() const
Definition: program_options.h:103
SharedOptPtr getOption(int posKey, const char *tok) const
Definition: program_options.h:363
SharedOptPtr getOption(const char *name, FindType ft) const
Definition: program_options.h:362
detail::IntrusiveSharedPtr< Option > SharedOptPtr
Definition: program_options.h:74
Default formatting for options.
Definition: program_options.h:371
A list of options logically grouped under a caption.
Definition: program_options.h:88
std::size_t count(const std::string &name) const
Definition: program_options.h:292
void clear()
Definition: program_options.h:339
~ParsedOptions()
Definition: program_options.cpp:495
LparseOutputter & out
Definition: output.cc:685
virtual bool printOption(const Option &opt, std::size_t maxW)=0
OptionRange findImpl(const char *key, FindType t, unsigned eMask=unsigned(-1)) const
Definition: program_options.h:243
OptionInitHelper(OptionGroup &owner)
Definition: program_options.cpp:260
FileWriter(FILE *f)
Definition: program_options.h:436
unsigned eMask
Definition: program_options.cpp:853
virtual bool printContext(const OptionContext &ctx)=0
virtual ~OptionParser()
Definition: program_options.cpp:568