ewmscp  ..
Options.h
Go to the documentation of this file.
1 /*
2  Option parser C++(11) library for parsing command line options
3  Copyright (C) 2016 Juergen Hannappel
4 
5  This program is free software: you can redistribute it and/or modify
6  it under the terms of the GNU General Public License as published by
7  the Free Software Foundation, either version 3 of the License, or
8  (at your option) any later version.
9 
10  This program is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  GNU General Public License for more details.
14 
15  You should have received a copy of the GNU General Public License
16  along with this program. If not, see <http://www.gnu.org/licenses/>.
17 */
18 #ifndef __Options_H__
19 #define __Options_H__
20 
21 #include <limits>
22 #include <string>
23 #include <map>
24 #include <vector>
25 #include <set>
26 #include <iostream>
27 #include <iomanip>
28 #include <sstream>
29 #include <fstream>
30 #include <typeinfo>
31 #include <functional>
32 
33 namespace options {
34  namespace internal {
36  class sourceFile {
37  protected:
38  std::string lName;
40  public:
41  static const sourceFile gUnsetSource;
42  static const sourceFile gCmdLine;
43  sourceFile(const std::string& aName, decltype(lParent) aParent):
44  lName(aName),
45  lParent(aParent) {
46  };
47  const std::string& fGetName() const {
48  return lName;
49  };
50  };
51 
53  class sourceItem {
54  protected:
55  const sourceFile* lFile;
57  public:
58  sourceItem(): lFile(&sourceFile::gUnsetSource) {
59  };
60  sourceItem(decltype(lFile) aFile,
61  decltype(lLineNumber) aLineNumber):
62  lFile(aFile), lLineNumber(aLineNumber) {
63  };
64  decltype(lFile) fGetFile() const {
65  return lFile;
66  };
67  decltype(lLineNumber) fGetLineNumber() const {
68  return lLineNumber;
69  }
70  bool fIsUnset() const {
72  }
73  };
74  } // end of namespace internal
75 
76  std::ostream& operator<< (std::ostream &aStream, const internal::sourceItem& aItem);
77  namespace escapedIO {
78  std::istream& operator>> (std::istream &aStream, const char*& aCstring);
79  } // end of namespace escapedIO
80 
82  template <typename T> class fundamental_wrapper {
83  protected:
84  T lValue;
85  public:
87  fundamental_wrapper(T aValue): lValue(aValue) {};
88  fundamental_wrapper& operator=(const T aValue) {
89  lValue = aValue;
90  return *this;
91  }
92  operator T& () {
93  return lValue;
94  }
95  operator const T& () const {
96  return lValue;
97  }
98  T operator=(const T& aValue) {
99  lValue = aValue;
100  return lValue;
101  }
102  };
103 
104  template <typename T> class postFixedNumber {
105  protected:
107  public:
109  postFixedNumber(T aValue): lValue(aValue) {};
110  postFixedNumber& operator=(const T aValue) {
111  lValue = aValue;
112  return *this;
113  }
114  operator T () const {
115  return lValue;
116  }
117  operator T& () {
118  return lValue;
119  }
120  };
121  template <typename T> std::ostream& operator<<(std::ostream& aStream, const postFixedNumber<T>& aNumber) {
122  T n = aNumber;
123  int m = 0;
124  // as long as no better solution pops up for the shell scrip parser
125  // always write just normally
126  //while (n != 0 && (n & ((static_cast<T>(1) << 10) - 1)) == 0) {
127  // n = n >> 10;
128  // m++;
129  //}
130  aStream << n;
131  if (m > 0) {
132  static std::string gMultipliers("kMGTPEZY");
133  aStream << gMultipliers.at(m - 1);
134  }
135  return aStream;
136  }
137  template <typename T> std::istream& operator>>(std::istream& aStream, postFixedNumber<T>& aNumber) {
138  T n;
139  aStream >> n;
140  if (!aStream.eof()) {
141  auto c = aStream.peek();
142  static std::string gMultipliers("kMGTPEZY");
143  auto m = gMultipliers.find(c);
144  if (m != std::string::npos) {
145  aStream.get();
146  n = n << ((m + 1) * 10);
147  }
148  }
149  aNumber = n;
150  return aStream;
151  };
152 
153 
154 
155  template <typename T> std::ostream& operator<<(std::ostream& aStream, const fundamental_wrapper<T>& aWrapper) {
156  const T& oerks = aWrapper;
157  aStream << oerks;
158  return aStream;
159  };
160  template <typename T> std::istream& operator>>(std::istream& aStream, fundamental_wrapper<T>& aWrapper) {
161  T& oerks = aWrapper;
162  using escapedIO::operator>>;
163  aStream >> oerks;
164  return aStream;
165  };
166 
167  namespace escapedIO {
168  std::ostream& operator<<(std::ostream& aStream, const std::string& aString);
169  std::istream& operator>>(std::istream& aStream, std::string& aString);
170  } // end of namespace escapedIO
171 
173 
174  template <typename T> class valuePrinter {
175  public:
176  typedef void (*valuePrinterType)(std::ostream&, const T&);
177  protected:
179  public:
180  valuePrinter(): lValuePrinter(nullptr) {};
181  valuePrinter(valuePrinterType aValuePrinter): lValuePrinter(aValuePrinter) {};
182  virtual void fSetValuePrinter(valuePrinterType aValuePrinter) {
183  lValuePrinter = aValuePrinter;
184  };
185  };
186 
187 
189 
193  class base {
194  friend class parser;
195  protected:
196  static std::map<std::string, base*>& fGetOptionMap() {
197  static std::map<std::string, base*> gOptions;
198  return gOptions;
199  };
200  static std::map<char, base*>& fGetShortOptionMap() {
201  static std::map<char, base*> gShortOptions;
202  return gShortOptions;
203  };
204  protected:
205  char lShortName;
206  const std::string lLongName;
207  const std::string lExplanation;
209  short lNargs;
210  bool lHidden;
211  std::vector<std::string>* lPreserveWorthyStuff;
212 
213  std::vector<const base*> lRequiredOptions;
214  std::vector<const base*> lForbiddenOptions;
215 
217  virtual void fSetMe(std::istream& aStream, const internal::sourceItem& aSource) = 0;
218  virtual void fSetMeNoarg(const internal::sourceItem& /*aSource*/) {};
219  virtual void fSetSource(const internal::sourceItem& aSource);
220  private:
221  virtual void fHandleOption(int argc, const char *argv[], int *i);
222 
223  protected:
224  virtual void fWriteCfgLines(std::ostream& aStream, const char *aPrefix) const;
225  virtual void fCheckRange() const = 0;
226  virtual void fWriteRange(std::ostream &/*aStream*/) const {};
227  void fSetPreserveWorthyStuff(std::vector<std::string>* aStuff);
228  void fHide();
229  bool fIsHidden() const;
230  void fDisable();
231  public:
232  base(char aShortName, const std::string& aLongName, const std::string& aExplanation, short aNargs);
233  virtual ~base();
234 
236  virtual void fAddToRangeFromStream(std::istream& aStream) = 0;
237  virtual void fAddDefaultFromStream(std::istream& aStream) = 0;
239  virtual void fWriteValue(std::ostream& aStream) const = 0;
242  virtual void fRequire(const base* aOtherOption);
244  virtual void fRequire(std::vector<const base*> aOtherOptions);
245 
247  template <typename InputIt> void fRequire(InputIt aBegin, InputIt aEnd) {
248  for (auto it = aBegin; it != aEnd; ++it) {
249  fRequire(*it);
250  }
251  }
253  virtual void fForbid(const base* aOtherOption);
255  virtual void fForbid(std::vector<const base*> aOtherOptions);
257  template <typename InputIt> void fForbid(InputIt aBegin, InputIt aEnd) {
258  for (auto it = aBegin; it != aEnd; ++it) {
259  fForbid(*it);
260  }
261  }
263  virtual bool fIsSet() const {
264  return ! lSource.fIsUnset();
265  };
266 
267  virtual bool fIsContainer() const {
268  return false;
269  };
270 
271 
273  const std::string& fGetLongName() const {
274  return lLongName;
275  };
276  };
277 
278  namespace internal {
279  class optionError: public std::runtime_error {
280  protected:
282  public:
283  optionError(const base* aOffendingOption, const std::string& aWhat);
284  optionError(const base* aOffendingOption, const char* aWhat);
285  ~optionError() override = default;
286  const base& fGetOption() const;
287  };
288  class rangeError: public optionError {
289  protected:
290  std::string badValue;
291  public:
292  rangeError(const base* aOffendingOption) :
293  optionError(aOffendingOption, "value out of range") {}
294  ~rangeError() override = default;
295  const std::string& fGetBadValue() const {
296  return badValue;
297  };
298  };
299  template <typename T> class typedRangeError: public rangeError {
300  public:
301  typedRangeError(const base* aOffendingOption, const T& aBadValue) :
302  rangeError(aOffendingOption) {
303  using escapedIO::operator<<;
304  std::ostringstream valueString;
305  valueString << aBadValue;
306  badValue = valueString.str();
307  };
308  ~typedRangeError() override = default;
309  };
310  class conversionError: public optionError {
311  protected:
312  std::string badArgument;
313  const std::type_info& type;
314  public:
315  conversionError(const base* aOffendingOption, const std::string& aBadArgument, const std::type_info& aType) :
316  optionError(aOffendingOption, "conversion failed"),
317  badArgument(aBadArgument),
318  type(aType) {};
319  ~conversionError() override = default;
320  const std::string& fGetArgument() const {
321  return badArgument;
322  };
323  const std::type_info& fGetType() const {
324  return type;
325  };
326  };
327  template <typename T> void conCatStr(std::ostringstream& msg, const T& begin) {
328  msg << begin;
329  }
330  template <typename T, typename ... Args> inline void conCatStr(std::ostringstream& msg,
331  const T& begin,
332  const Args& ... args) {
333  msg << begin;
334  if (sizeof...(args)) {
335  conCatStr(msg, args...);
336  }
337  }
338  template <typename ... Args> inline std::string conCat(const Args& ... args) {
339  std::ostringstream msg;
340  conCatStr(msg, args...);
341  return msg.str();
342  }
343 
344 
346  public:
347  positional_base(int aOrderingNumber,
348  base* aAsBase);
349  static std::map<int, base*>& fGetPositonalArgs() {
350  static std::map<int, base*> gPositinalArgs;
351  return gPositinalArgs;
352  }
353  };
354  } // end of namespace internal
355 
356 
358 
362 
363  class parser {
364  protected:
365  static parser* gParser;
366  const std::string lDescription;
367  const std::string lTrailer;
368  const std::vector<std::string> lSearchPaths;
369  std::vector<std::string> lUnusedOptions;
370  std::vector<std::string> lStuffAfterMinusMinus;
371 
372  std::set<const base*> lRequiredOptions;
373 
375  std::ostream *lMessageStream;
376  std::ostream *lErrorStream;
377  std::string lProgName;
378  std::string lExecutableName;
382 
384 
385  void fReadConfigFiles();
386  void fPrintOptionHelp(std::ostream& aMessageStream, const base& aOption, std::size_t aMaxName, std::size_t aMaxExplain, size_t lineLenght) const;
387  void fCheckConsistency();
388  public:
389  parser(const std::string& aDescription = "", const std::string& aTrailer = "", const std::vector<std::string>& aSearchPaths = {"/etc/", "~/.", "~/.config/", "./."});
390  ~parser();
391 
392  bool fIsParsingDone() const;
393 
394  void fSetMessageStream(std::ostream* aStream);
395  void fSetErrorStream(std::ostream* aStream);
396  std::ostream& fGetErrorStream() const;
397  void fSetHelpReturnValue(int aValue);
398  int fGetHelpReturnValue() const {
399  return lHelpReturnValue;
400  };
401  [[noreturn]] virtual void fComplainAndLeave(bool aWithHelp = true);
402  void fSetAssignmentChars(char aPrimary = '=', char aSecondary = ':');
403  char fGetSecondaryAssignment() const {
404  return lSecondaryAssignment;
405  }
406  virtual void fRequire(const base* aOtherOption);
407  virtual void fRequire(std::vector<const base*> aOtherOptions);
408 
409 
411 
415  const std::vector<std::string>& fParse(int argc, const char *argv[]);
416 
418  const std::vector<std::string>& fParse(int argc, char *argv[]);
419 
420 
422  static parser* fGetInstance();
423 
425  void fHelp();
426  void fWriteCfgFile(const std::string& aFileName);
427  void fReadCfgFile(const std::string& aFileName, const options::internal::sourceItem& aSource, bool aMayBeAbsent = false);
428  void fSetExecutableName(const char *aName);
429 
433  const std::vector<std::string>& fGetStuffAfterMinusMinus() {
434  return lStuffAfterMinusMinus;
435  };
436  const std::string& fGetProgName() const {
437  return lProgName;
438  }
439  static void fPrintEscapedString(std::ostream &aStream, const std::string& aString);
440  static void fReCaptureEscapedString(std::string& aDest, const std::string& aSource);
441  };
442 
443 
444  namespace internal {
445  template <typename T, bool forceRangeValueTypeString = false> class typed_base: public base {
446  public:
447  typedef T valueType;
448  typedef typename std::conditional < std::is_same<T, const char *>::value || forceRangeValueTypeString, std::string, T >::type rangeValueType;
449  typedef typename std::conditional<forceRangeValueTypeString, std::string, T>::type compareValueType;
450  protected:
451  std::multiset<rangeValueType> lRange;
452  public:
453 
454  template <class ... Types> typed_base(Types ... args) :
455  base(args...) {
456  };
458  virtual void fAddToRange(rangeValueType aValue) {
459  lRange.emplace(aValue);
460  };
461  template <typename TT = std::string> typename std::enable_if < (!std::is_same<rangeValueType, std::string>::value) && std::is_same<TT, std::string>::value, void >::type fAddToRange(const TT& aString) {
462  std::stringstream buf(aString);
463  rangeValueType value;
464  buf >> std::setbase(0);
465  using escapedIO::operator>>;
466  buf >> value;
467  fAddToRange(value);
468  };
470  template <typename InputIt> void fAddToRange(InputIt aBegin, InputIt aEnd) {
471  for (auto it = aBegin; it != aEnd; ++it) {
472  fAddToRange(*it);
473  }
474  };
476  template <typename TT> void fAddToRange(const std::vector<TT>& aRange) {
477  fAddToRange(aRange.cbegin(), aRange.cend());
478  }
480  void fAddToRangeFromStream(std::istream& aStream) override {
481  std::string buf;
482  std::getline(aStream, buf);
483  std::stringstream sbuf(buf);
484  while (!sbuf.eof()) {
485  rangeValueType value;
486  using escapedIO::operator>>;
487  sbuf >> std::setbase(0) >> value;
488  fAddToRange(value);
489  }
490  };
491  void fWriteRange(std::ostream &aStream) const override {
492  using escapedIO::operator<<;
493  if (! lRange.empty()) {
494  aStream << "# allowed range is";
495  if (lRange.size() == 2) {
496  aStream << " [" << *(lRange.cbegin()) << "," << *(lRange.crbegin()) << "]\n";
497  } else {
498  aStream << ":";
499  for (const auto& it : lRange) {
500  aStream << " " << it;
501  }
502  aStream << "\n";
503  }
504  }
505  };
506  virtual void fCheckValueForRange(const compareValueType& aValue) const {
507  using escapedIO::operator<<;
508  if (lRange.empty()) {
509  return;
510  } else if (lRange.size() == 2) {
511  if (*(lRange.cbegin()) <= aValue && aValue <= *(lRange.crbegin())) {
512  return;
513  } else {
514  throw typedRangeError<compareValueType>(this, aValue);
515  }
516  } else {
517  for (const auto& it : lRange) {
518  if (it == aValue) {
519  return;
520  }
521  }
522  throw typedRangeError<compareValueType>(this, aValue);
523  }
524  }
525  };
526  } // end of namespace internal
527 
528 
530 
533  template <typename T> class single :
534  public std::conditional < std::is_fundamental<T>::value || std::is_same<T, const char*>::value,
535  fundamental_wrapper<T>,
536  T >::type,
537  public internal::typed_base<T> {
538  public:
539  typedef typename std::conditional < std::is_fundamental<T>::value || std::is_same<T, const char*>::value,
541  T >::type deriveFromType;
546  single(char aShortName, const std::string& aLongName, const std::string& aExplanation, T aDefault, const std::vector<T>& aRange = {}) :
547  deriveFromType(aDefault),
548  internal::typed_base<T>(aShortName, aLongName, aExplanation, 1) {
549  if (!aRange.empty()) {
550  this->fAddToRange(aRange);
551  }
552  };
553  single(char aShortName, const std::string& aLongName, const std::string& aExplanation) :
554  internal::typed_base<T>(aShortName, aLongName, aExplanation, 1) {
555  };
556  single(const single&) = delete;
557 
558  T operator=(const T& aValue) {
559  T& thisAsReference(*this);
560  return thisAsReference = aValue;
561  }
562 
563 
564  void fAddDefaultFromStream(std::istream& aStream) override {
565  using escapedIO::operator>>;
566  aStream >> std::setbase(0) >> *this;
567  }
568 
569  void fWriteValue(std::ostream& aStream) const override {
570  using escapedIO::operator<<;
571  aStream << *this;
572  }
573  void fCheckRange() const override {
574  this->fCheckValueForRange(*this);
575  }
576 
577 
578  void fSetMe(std::istream& aStream, const internal::sourceItem& aSource) override {
579  using escapedIO::operator>>;
580  aStream >> std::setbase(0) >> std::noskipws >> *this;
581  if (aStream.fail()) {
582  std::string arg;
583  aStream.clear();
584  aStream >> arg;
585  throw internal::conversionError(this, arg, typeid(T));
586  }
587  this->fSetSource(aSource);
588  }
589  const T &fGetValue() const {
590  return *this;
591  }
592  };
593 
595  template <> class single<bool> : public fundamental_wrapper<bool>, public base {
596  private:
597  bool lDefault;
598  public:
599  single(char aShortName, const std::string& aLongName, const std::string& aExplanation, bool aDefault = false) :
600  fundamental_wrapper(aDefault),
601  base(aShortName, aLongName, aExplanation, 0),
602  lDefault(aDefault) {
603  }
604  single(const single&) = delete;
605  bool operator=(const bool& aValue) {
606  lValue = aValue;
607  return lValue;
608  }
609 
610  void fWriteValue(std::ostream& aStream) const override;
611  void fSetMeNoarg(const internal::sourceItem& aSource) override;
612  void fSetMe(std::istream& aStream, const internal::sourceItem& aSource) override;
613  void fCheckRange() const override {
614  };
615  void fAddToRangeFromStream(std::istream& /*aStream*/) override {};
616  void fAddDefaultFromStream(std::istream& aStream) override;
617 
618  bool fGetValue() const {
619  return lValue;
620  }
621  };
622 
623  namespace escapedIO {
624  std::istream& operator>> (std::istream &aStream, const char*& aCstring);
625  } // end of namespace escapedIO
626 
629 
630  namespace internal {
633  template <typename T> class baseForMap: public typed_base<T> {
634  protected:
635  std::map<const T*, const internal::sourceItem> lSources;
636  public:
637  baseForMap(char aShortName, std::string aLongName, std::string aExplanation, short aNargs) :
638  typed_base<T>(aShortName, aLongName, aExplanation, aNargs) {};
639  void fAddSource(const T* aValueLocation, const internal::sourceItem& aSource) {
640  lSources.insert(std::make_pair(aValueLocation, aSource));
641  };
642  const internal::sourceItem fGetSource(const T* aValueLocation) const {
643  auto it = lSources.find(aValueLocation);
644  if (it != lSources.end()) {
645  return it->second;
646  } else {
647  return internal::sourceItem();
648  }
649  };
650  bool fIsSet() const override {
651  return ! lSources.empty();
652  };
653  bool fIsContainer() const override {
654  return true;
655  };
656  void fAddDefaultFromStream(std::istream& aStream) override {
657  aStream.ignore(std::numeric_limits<std::streamsize>::max(), ' ');
658  this->fSetMe(aStream, internal::sourceItem());
659  };
660 
661  };
662  } // end of namespace internal
663 
665 
671  template <typename T, typename Container = std::map<std::string, T>> class map: public internal::baseForMap<T>, public Container {
672  public:
673  map(char aShortName, const std::string& aLongName, const std::string& aExplanation,
674  std::initializer_list<typename Container::value_type> aDefault = {}) :
675  internal::baseForMap<T>(aShortName, aLongName, aExplanation, 1) {
676  for (const auto& defaultValue : aDefault) {
677  this->insert(this->end(), defaultValue);
678  }
679  }
680  map(const map&) = delete;
681  void fWriteCfgLines(std::ostream& aStream, const char *aPrefix) const override {
682  if (this->empty()) {
683  aStream << aPrefix << this->lLongName << "=key" << parser::fGetInstance()->fGetSecondaryAssignment() << "value\n";
684  }
685  for (const auto& it : *this) {
686  auto source = this->fGetSource(&(it.second));
687  aStream << (source.fIsUnset() ? aPrefix : "") << this->lLongName << "=" << it.first << parser::fGetInstance()->fGetSecondaryAssignment();
688  {
689  using escapedIO::operator<<;
690  aStream << it.second << "\n";
691  }
692  if (!source.fIsUnset()) {
693  aStream << "# set from " << source << "\n";
694  }
695  }
696  }
697 
698  void fWriteValue(std::ostream& aStream) const override {
699  using escapedIO::operator<<;
700  if (this->empty()) {
701  aStream << "\"\"";
702  } else {
703  for (const auto& it : *this) {
704  aStream << it.first << parser::fGetInstance()->fGetSecondaryAssignment() << it.second << " ";
705  }
706  }
707  }
708  template <typename C = Container>
709  typename std::enable_if<std::is_same<std::map<typename std::remove_const<typename Container::value_type::first_type>::type,
710  typename Container::value_type::second_type>,
711  C>::value,
712  typename C::iterator>::type
713  insertOrUpdate(typename C::value_type aPair) {
714  (*this)[aPair.first] = aPair.second;
715  return this->find(aPair.first);
716  }
717  template <typename C = Container>
718  typename std::enable_if < !std::is_same<std::map<typename std::remove_const<typename Container::value_type::first_type>::type,
719  typename Container::value_type::second_type>,
720  C>::value,
721  typename Container::iterator >::type
722  insertOrUpdate(typename C::value_type aPair) {
723  return this->insert(this->end(), aPair);
724  }
725 
726  void fSetMe(std::istream& aStream, const internal::sourceItem& aSource) override {
727  std::string name;
728  std::getline(aStream, name, parser::fGetInstance()->fGetSecondaryAssignment());
729  if (aStream.eof()) { // not found, complain!
730  throw internal::optionError(this, internal::conCat(" a '", parser::fGetInstance()->fGetSecondaryAssignment(), "' separator is required, none given"));
731  }
732  T value;
733  using escapedIO::operator>>;
734  aStream >> std::setbase(0) >> value;
735  if (aStream.fail()) {
736  std::string arg;
737  aStream.clear();
738  aStream >> arg;
739  throw internal::conversionError(this, arg, typeid(value));
740  }
741  typename std::remove_const<typename Container::value_type::first_type>::type key;
742  std::istringstream conversionStream(name);
743  conversionStream >> key;
744  if (conversionStream.fail()) {
745  throw internal::conversionError(this, name, typeid(key));
746  }
747  auto result = (*this).insertOrUpdate(std::make_pair(key, value));
748  this->fAddSource(&(result->second), aSource);
749  };
750 
751  void fCheckRange() const override {
752  for (const auto& pair : *this) {
753  this->fCheckValueForRange(pair.second);
754  }
755  };
756 
757  typename std::add_rvalue_reference<std::add_const<Container>>::type fGetValue() const {
758  return *static_cast<typename std::add_pointer<std::add_const<Container>>::type>(this);
759  }
760  };
761 
763  namespace internal {
766  template <typename T> class baseForContainer: public typed_base<T> {
767  protected:
768  std::vector<internal::sourceItem> lSources;
769  public:
770  baseForContainer(char aShortName, std::string aLongName, std::string aExplanation, short aNargs) :
771  typed_base<T>(aShortName, aLongName, aExplanation, aNargs) {};
772  bool fIsSet() const override {
773  return ! lSources.empty();
774  };
775  bool fIsContainer() const override {
776  return true;
777  };
778  void fAddDefaultFromStream(std::istream& aStream) override {
779  aStream.ignore(std::numeric_limits<std::streamsize>::max(), ' ');
780  this->fSetMe(aStream, internal::sourceItem());
781  };
782  };
783  } // end of namespace internal
784 
786 
789  template <typename T, typename Container = std::vector<T>> class container: public internal::baseForContainer<T>, public Container {
790  public:
791  container(char aShortName, const std::string& aLongName, const std::string& aExplanation,
792  std::initializer_list<typename Container::value_type> aDefault = {}) :
793  internal::baseForContainer<T>(aShortName, aLongName, aExplanation, 1) {
794  for (const auto& defaultValue : aDefault) {
795  this->push_back(defaultValue);
796  }
797  }
798  container(const container&) = delete;
799  void fWriteCfgLines(std::ostream& aStream, const char *aPrefix) const override {
800  if (this->empty()) {
801  aStream << aPrefix << this->lLongName << "=value\n";
802  }
803  auto it2 = this->lSources.begin();
804  for (auto it = this->begin(); it != this->end(); ++it, ++it2) {
805  aStream << (it2->fIsUnset() ? aPrefix : "") << this->lLongName << "=";
806  {
807  using escapedIO::operator<<;
808  aStream << *it << "\n";
809  }
810  if (!it2->fIsUnset()) {
811  aStream << "# set from " << *it2 << "\n";
812  }
813  }
814  }
815 
816 
817  void fWriteValue(std::ostream& aStream) const override {
818  if (this->empty()) {
819  aStream << "\"\"";
820  } else {
821  aStream << "\"";
822  for (auto it = this->begin(); it != this->end(); ++it) {
823  using escapedIO::operator<<;
824  aStream << *it << " ";
825  }
826  aStream << "\"";
827  }
828  }
829  void fSetMe(std::istream& aStream, const internal::sourceItem& aSource) override {
830  T value;
831  aStream >> std::setbase(0);
832  {
833  using namespace escapedIO;
834  aStream >> value;
835  }
836  if (aStream.fail()) {
837  std::string arg;
838  aStream.clear();
839  aStream >> arg;
840  throw internal::conversionError(this, arg, typeid(value));
841  }
842  this->push_back(value);
843  this->lSources.push_back(aSource);
844  }
845 
846  void fCheckRange() const override {
847  for (const auto& value : *this) {
848  this->fCheckValueForRange(value);
849  }
850  };
851 
852 
853 
854  };
855 
856 
857 
858 
861 
865  protected:
866  std::string lOriginalString;
867  public:
868  void fWriteOriginalString(std::ostream& aStream) const;
869  const std::string& fGetOriginalString() const {
870  return lOriginalString;
871  };
872  };
873 
874 
875 
876  template <class T> class positional: public T, public internal::positional_base {
877  public:
878  template <class ... Types> positional(int aOrderingNumber, Types ... args) :
879  T('\0', args...),
880  internal::positional_base(aOrderingNumber, this) {
881  };
882  typename T::valueType operator=(const typename T::valueType& aValue) {
883  return *this = aValue;
884  }
885  };
886 
887  template <class T> class withAction: public T {
888  std::function<void(T&)> action;
889  public:
890  template<class ... Types> withAction(std::function<void(T&)> aAction, Types ... args) :
891  T(args...),
892  action(aAction) {
893  }
894  void fSetMe(std::istream& aStream, const internal::sourceItem& aSource) override {
895  T::fSetMe(aStream, aSource);
896  this->fCheckRange();
897  action(*this);
898  }
899  void fSetMeNoarg(const internal::sourceItem& aSource) override {
900  T::fSetMeNoarg(aSource);
901  this->fCheckRange();
902  action(*this);
903  }
904  };
905 
906 } // end of namespace options
907 #endif
options::internal::rangeError::~rangeError
~rangeError() override=default
options::parser::fHelp
void fHelp()
print help, normally automatically called by the –help option or in case of problems.
Definition: Options.cpp:724
options::positional::operator=
T::valueType operator=(const typename T::valueType &aValue)
Definition: Options.h:882
options::internal::typedRangeError
Definition: Options.h:299
options::parser::lMinusMinusJustEndsOptions
bool lMinusMinusJustEndsOptions
Definition: Options.h:374
options::parser::fPrintEscapedString
static void fPrintEscapedString(std::ostream &aStream, const std::string &aString)
Definition: Options.cpp:376
options::base::fSetPreserveWorthyStuff
void fSetPreserveWorthyStuff(std::vector< std::string > *aStuff)
Definition: Options.cpp:591
options::base::fSetMeNoarg
virtual void fSetMeNoarg(const internal::sourceItem &)
Definition: Options.h:218
options::parser::lMessageStream
std::ostream * lMessageStream
Definition: Options.h:375
options::parser
class that contains the parser, i.e. does that option handling
Definition: Options.h:363
options::single
generic option class with any type that can be used with std::istream and std::ostream
Definition: Options.h:533
options::parser::fWriteCfgFile
void fWriteCfgFile(const std::string &aFileName)
Definition: Options.cpp:771
options::parser::lUnusedOptions
std::vector< std::string > lUnusedOptions
Definition: Options.h:369
options::parser::fIsParsingDone
bool fIsParsingDone() const
Definition: Options.cpp:110
options::fundamental_wrapper::fundamental_wrapper
fundamental_wrapper()
Definition: Options.h:86
options::internal::optionError::~optionError
~optionError() override=default
options::map::insertOrUpdate
std::enable_if< std::is_same< std::map< typename std::remove_const< typename Container::value_type::first_type >::type, typename Container::value_type::second_type >, C >::value, typename C::iterator >::type insertOrUpdate(typename C::value_type aPair)
Definition: Options.h:713
options::internal::rangeError::fGetBadValue
const std::string & fGetBadValue() const
Definition: Options.h:295
options::postFixedNumber::operator=
postFixedNumber & operator=(const T aValue)
Definition: Options.h:110
options::parser::lExecutableName
std::string lExecutableName
Definition: Options.h:378
options::postFixedNumber::postFixedNumber
postFixedNumber(T aValue)
Definition: Options.h:109
options::internal::conversionError::badArgument
std::string badArgument
Definition: Options.h:312
options::internal::rangeError::rangeError
rangeError(const base *aOffendingOption)
Definition: Options.h:292
options::parser::fGetHelpReturnValue
int fGetHelpReturnValue() const
Definition: Options.h:398
options::internal::rangeError
Definition: Options.h:288
options::internal::conversionError
Definition: Options.h:310
options::fundamental_wrapper::fundamental_wrapper
fundamental_wrapper(T aValue)
Definition: Options.h:87
options::internal::typed_base::fAddToRange
virtual void fAddToRange(rangeValueType aValue)
add a value to the range of allowed values
Definition: Options.h:458
options::base::fGetLongName
const std::string & fGetLongName() const
returns long name of option, usually only for internal use.
Definition: Options.h:273
options::originalStringKeeper
interface class that is used for options where the original string rather than the streamed value is ...
Definition: Options.h:864
options::internal::sourceItem::sourceItem
sourceItem()
Definition: Options.h:58
options::parser::fParse
const std::vector< std::string > & fParse(int argc, const char *argv[])
parse the options on the command line
Definition: Options.cpp:168
options::single::fCheckRange
void fCheckRange() const override
Definition: Options.h:573
options::internal::sourceItem::fGetFile
decltype(lFile) fGetFile() const
Definition: Options.h:64
options::internal::rangeError::badValue
std::string badValue
Definition: Options.h:290
options::map::fCheckRange
void fCheckRange() const override
Definition: Options.h:751
options::parser::lStuffAfterMinusMinus
std::vector< std::string > lStuffAfterMinusMinus
Definition: Options.h:370
options::valuePrinter::valuePrinter
valuePrinter()
Definition: Options.h:180
options::internal::baseForMap
This class is an intermediate helper class for options that are map-based.
Definition: Options.h:633
options::internal::baseForContainer::baseForContainer
baseForContainer(char aShortName, std::string aLongName, std::string aExplanation, short aNargs)
Definition: Options.h:770
options::parser::lHelpReturnValue
int lHelpReturnValue
Definition: Options.h:379
options::internal::conversionError::conversionError
conversionError(const base *aOffendingOption, const std::string &aBadArgument, const std::type_info &aType)
Definition: Options.h:315
options::internal::typed_base::rangeValueType
std::conditional< std::is_same< T, const char * >::value||forceRangeValueTypeString, std::string, T >::type rangeValueType
Definition: Options.h:448
options::internal::sourceFile::lName
std::string lName
Definition: Options.h:38
options::internal::typed_base::fCheckValueForRange
virtual void fCheckValueForRange(const compareValueType &aValue) const
Definition: Options.h:506
options::base::fIsSet
virtual bool fIsSet() const
check if this option was set, regardless of from command line or config file
Definition: Options.h:263
options::parser::lSearchPaths
const std::vector< std::string > lSearchPaths
Definition: Options.h:368
options::fundamental_wrapper::lValue
T lValue
Definition: Options.h:84
options::parser::gParser
static parser * gParser
Definition: Options.h:365
options::originalStringKeeper::lOriginalString
std::string lOriginalString
Definition: Options.h:866
options::internal::typedRangeError::typedRangeError
typedRangeError(const base *aOffendingOption, const T &aBadValue)
Definition: Options.h:301
options::internal::typed_base::fAddToRange
void fAddToRange(InputIt aBegin, InputIt aEnd)
add values from the iterator range [aBegin,aEnd) to the range of allowed values
Definition: Options.h:470
options::base::fForbid
void fForbid(InputIt aBegin, InputIt aEnd)
add all options from the pair of iterators [aBegin,aEnd) to the list of forbidden options
Definition: Options.h:257
options::container::fSetMe
void fSetMe(std::istream &aStream, const internal::sourceItem &aSource) override
function to set the value from a string, remembering the source
Definition: Options.h:829
options::parser::lPrimaryAssignment
char lPrimaryAssignment
Definition: Options.h:380
options::internal::typed_base
Definition: Options.h:445
options::base::lLongName
const std::string lLongName
Definition: Options.h:206
options::container::container
container(char aShortName, const std::string &aLongName, const std::string &aExplanation, std::initializer_list< typename Container::value_type > aDefault={})
Definition: Options.h:791
options::internal::positional_base::positional_base
positional_base(int aOrderingNumber, base *aAsBase)
Definition: Options.cpp:70
options::originalStringKeeper::fGetOriginalString
const std::string & fGetOriginalString() const
Definition: Options.h:869
options::internal::typed_base::fAddToRange
void fAddToRange(const std::vector< TT > &aRange)
add values from a vector (may be given as initializer list) to the range of allowed values
Definition: Options.h:476
options::map::insertOrUpdate
std::enable_if< !std::is_same< std::map< typename std::remove_const< typename Container::value_type::first_type >::type, typename Container::value_type::second_type >, C >::value, typename Container::iterator >::type insertOrUpdate(typename C::value_type aPair)
Definition: Options.h:722
options::parser::fReadConfigFiles
void fReadConfigFiles()
read config files if present
Definition: Options.cpp:153
options::internal::sourceItem::lFile
const sourceFile * lFile
Definition: Options.h:55
options::parser::fPrintOptionHelp
void fPrintOptionHelp(std::ostream &aMessageStream, const base &aOption, std::size_t aMaxName, std::size_t aMaxExplain, size_t lineLenght) const
Definition: Options.cpp:646
options::base::lPreserveWorthyStuff
std::vector< std::string > * lPreserveWorthyStuff
Definition: Options.h:211
options::internal::baseForContainer::fIsSet
bool fIsSet() const override
check if this option was set, regardless of from command line or config file
Definition: Options.h:772
options::base
base class for options
Definition: Options.h:193
options::internal::typed_base::typed_base
typed_base(Types ... args)
Definition: Options.h:454
options::parser::lProgName
std::string lProgName
Definition: Options.h:377
options::fundamental_wrapper::operator=
T operator=(const T &aValue)
Definition: Options.h:98
options::internal::baseForContainer::lSources
std::vector< internal::sourceItem > lSources
Definition: Options.h:768
options::base::fAddDefaultFromStream
virtual void fAddDefaultFromStream(std::istream &aStream)=0
special for use in the shellScriptOptionParser
options::positional::positional
positional(int aOrderingNumber, Types ... args)
Definition: Options.h:878
options::internal::conversionError::fGetArgument
const std::string & fGetArgument() const
Definition: Options.h:320
options::base::lSource
internal::sourceItem lSource
Definition: Options.h:208
options::internal::baseForMap::fIsContainer
bool fIsContainer() const override
Definition: Options.h:653
options::postFixedNumber::postFixedNumber
postFixedNumber()
Definition: Options.h:108
options
Definition: Options.h:33
options::withAction::withAction
withAction(std::function< void(T &)> aAction, Types ... args)
Definition: Options.h:890
options::base::~base
virtual ~base()
Definition: Options.cpp:554
options::internal::conCatStr
void conCatStr(std::ostringstream &msg, const T &begin)
Definition: Options.h:327
options::map
template for map-based options.
Definition: Options.h:671
options::parser::fSetErrorStream
void fSetErrorStream(std::ostream *aStream)
Definition: Options.cpp:118
options::base::fWriteCfgLines
virtual void fWriteCfgLines(std::ostream &aStream, const char *aPrefix) const
Definition: Options.cpp:580
options::parser::fGetSecondaryAssignment
char fGetSecondaryAssignment() const
Definition: Options.h:403
options::single::fSetMe
void fSetMe(std::istream &aStream, const internal::sourceItem &aSource) override
function to set the value from a string, remembering the source
Definition: Options.h:578
options::base::fForbid
virtual void fForbid(const base *aOtherOption)
forbid aOtherOption when this option is set
Definition: Options.cpp:617
options::base::fDisable
void fDisable()
disable option by removing it from the maps
Definition: Options.cpp:605
options::base::fHide
void fHide()
hide option, will be respected by help
Definition: Options.cpp:596
options::parser::fReadCfgFile
void fReadCfgFile(const std::string &aFileName, const options::internal::sourceItem &aSource, bool aMayBeAbsent=false)
Definition: Options.cpp:819
options::parser::lDescription
const std::string lDescription
Definition: Options.h:366
options::parser::fGetStuffAfterMinusMinus
const std::vector< std::string > & fGetStuffAfterMinusMinus()
get trailong part of command line as a vector od strings, requires that fSetMinusMinusStartsExtraList...
Definition: Options.h:433
options::single::deriveFromType
std::conditional< std::is_fundamental< T >::value||std::is_same< T, const char * >::value, fundamental_wrapper< T >, T >::type deriveFromType
Definition: Options.h:541
options::parser::lSecondaryAssignment
char lSecondaryAssignment
Definition: Options.h:381
options::escapedIO::operator>>
std::istream & operator>>(std::istream &aStream, const char *&aCstring)
Definition: Options.cpp:435
options::internal::baseForMap::fGetSource
const internal::sourceItem fGetSource(const T *aValueLocation) const
Definition: Options.h:642
options::base::lRequiredOptions
std::vector< const base * > lRequiredOptions
Definition: Options.h:213
options::valuePrinter::valuePrinterType
void(* valuePrinterType)(std::ostream &, const T &)
Definition: Options.h:176
options::valuePrinter::fSetValuePrinter
virtual void fSetValuePrinter(valuePrinterType aValuePrinter)
Definition: Options.h:182
options::base::fRequire
virtual void fRequire(const base *aOtherOption)
require aOtherOption when this option is set
Definition: Options.cpp:611
options::base::fWriteRange
virtual void fWriteRange(std::ostream &) const
Definition: Options.h:226
options::base::base
base(char aShortName, const std::string &aLongName, const std::string &aExplanation, short aNargs)
construct an object of type base
Definition: Options.cpp:529
options::internal::baseForMap::fAddDefaultFromStream
void fAddDefaultFromStream(std::istream &aStream) override
special for use in the shellScriptOptionParser
Definition: Options.h:656
options::container
template for container-based options.
Definition: Options.h:789
options::internal::conversionError::fGetType
const std::type_info & fGetType() const
Definition: Options.h:323
options::withAction::fSetMe
void fSetMe(std::istream &aStream, const internal::sourceItem &aSource) override
Definition: Options.h:894
options::internal::sourceFile::gUnsetSource
static const sourceFile gUnsetSource
Definition: Options.h:41
options::internal::baseForMap::fIsSet
bool fIsSet() const override
check if this option was set, regardless of from command line or config file
Definition: Options.h:650
options::parser::fReCaptureEscapedString
static void fReCaptureEscapedString(std::string &aDest, const std::string &aSource)
Definition: Options.cpp:429
options::valuePrinter
template interface class for options that provide a value printer
Definition: Options.h:174
options::escapedIO::operator<<
std::ostream & operator<<(std::ostream &aStream, const std::string &aString)
Definition: Options.cpp:447
options::single< bool >::single
single(char aShortName, const std::string &aLongName, const std::string &aExplanation, bool aDefault=false)
Definition: Options.h:599
options::parser::fSetAssignmentChars
void fSetAssignmentChars(char aPrimary='=', char aSecondary=':')
Definition: Options.cpp:127
options::single::fWriteValue
void fWriteValue(std::ostream &aStream) const override
write textual representation of value to a std::ostream
Definition: Options.h:569
options::single::single
single(char aShortName, const std::string &aLongName, const std::string &aExplanation, T aDefault, const std::vector< T > &aRange={})
construct an object of single<T>
Definition: Options.h:546
options::fundamental_wrapper::operator=
fundamental_wrapper & operator=(const T aValue)
Definition: Options.h:88
options::single::fGetValue
const T & fGetValue() const
Definition: Options.h:589
options::base::lExplanation
const std::string lExplanation
Definition: Options.h:207
options::parser::lErrorStream
std::ostream * lErrorStream
Definition: Options.h:376
options::single< bool >::operator=
bool operator=(const bool &aValue)
Definition: Options.h:605
options::internal::sourceFile::gCmdLine
static const sourceFile gCmdLine
Definition: Options.h:42
options::base::fWriteValue
virtual void fWriteValue(std::ostream &aStream) const =0
write textual representation of value to a std::ostream
options::internal::optionError
Definition: Options.h:279
options::parser::fGetErrorStream
std::ostream & fGetErrorStream() const
Definition: Options.cpp:121
options::single::single
single(char aShortName, const std::string &aLongName, const std::string &aExplanation)
Definition: Options.h:553
options::base::fSetMe
virtual void fSetMe(std::istream &aStream, const internal::sourceItem &aSource)=0
function to set the value from a string, remembering the source
options::internal::positional_base
Definition: Options.h:345
options::valuePrinter::valuePrinter
valuePrinter(valuePrinterType aValuePrinter)
Definition: Options.h:181
options::parser::fSetHelpReturnValue
void fSetHelpReturnValue(int aValue)
Definition: Options.cpp:124
options::operator<<
std::ostream & operator<<(std::ostream &aStream, const internal::sourceItem &aItem)
operator to write sourceItems to a stream
Definition: Options.cpp:57
options::base::fIsContainer
virtual bool fIsContainer() const
Definition: Options.h:267
options::fundamental_wrapper
wrapper class for fundamental types
Definition: Options.h:82
options::internal::baseForMap::lSources
std::map< const T *, const internal::sourceItem > lSources
Definition: Options.h:635
options::parser::~parser
~parser()
Definition: Options.cpp:106
options::parser::fGetProgName
const std::string & fGetProgName() const
Definition: Options.h:436
options::map::map
map(char aShortName, const std::string &aLongName, const std::string &aExplanation, std::initializer_list< typename Container::value_type > aDefault={})
Definition: Options.h:673
options::base::lShortName
char lShortName
Definition: Options.h:203
options::withAction::action
std::function< void(T &)> action
Definition: Options.h:888
options::internal::typed_base::fAddToRange
std::enable_if<(!std::is_same< rangeValueType, std::string >::value) &&std::is_same< TT, std::string >::value, void >::type fAddToRange(const TT &aString)
Definition: Options.h:461
options::parser::fSetMinusMinusStartsExtraList
void fSetMinusMinusStartsExtraList()
switch on use of – to separate a trailer on the command line that is not to be parsed
Definition: Options.cpp:372
options::single< bool >::lDefault
bool lDefault
Definition: Options.h:597
options::internal::conCat
std::string conCat(const Args &... args)
Definition: Options.h:338
options::base::fRequire
void fRequire(InputIt aBegin, InputIt aEnd)
add all options from the pair of iterators [aBegin,aEnd) to the list of required options
Definition: Options.h:247
options::internal::optionError::offendingOption
const base & offendingOption
Definition: Options.h:281
options::internal::positional_base::fGetPositonalArgs
static std::map< int, base * > & fGetPositonalArgs()
Definition: Options.h:349
options::base::fGetOptionMap
static std::map< std::string, base * > & fGetOptionMap()
Definition: Options.h:196
options::internal::baseForContainer::fAddDefaultFromStream
void fAddDefaultFromStream(std::istream &aStream) override
special for use in the shellScriptOptionParser
Definition: Options.h:778
options::parser::fCheckConsistency
void fCheckConsistency()
Definition: Options.cpp:323
options::internal::typed_base::fWriteRange
void fWriteRange(std::ostream &aStream) const override
Definition: Options.h:491
options::container::fWriteCfgLines
void fWriteCfgLines(std::ostream &aStream, const char *aPrefix) const override
Definition: Options.h:799
options::map::fGetValue
std::add_rvalue_reference< std::add_const< Container > >::type fGetValue() const
Definition: Options.h:757
options::single::operator=
T operator=(const T &aValue)
Definition: Options.h:558
options::internal::sourceFile::lParent
const sourceFile & lParent
Definition: Options.h:39
options::internal::sourceItem
class to remember from which line (or item) of a file/line an option was set from
Definition: Options.h:53
options::parser::lTrailer
const std::string lTrailer
Definition: Options.h:367
options::internal::sourceItem::fGetLineNumber
decltype(lLineNumber) fGetLineNumber() const
Definition: Options.h:67
options::internal::typedRangeError::~typedRangeError
~typedRangeError() override=default
options::parser::fGetInstance
static parser * fGetInstance()
get the only allwed instance of the option parser.
Definition: Options.cpp:144
options::single< bool >::fGetValue
bool fGetValue() const
Definition: Options.h:618
options::parser::lParsingIsDone
bool lParsingIsDone
Definition: Options.h:383
options::positional
Definition: Options.h:876
options::internal::optionError::fGetOption
const base & fGetOption() const
Definition: Options.cpp:50
options::single< bool >::fAddToRangeFromStream
void fAddToRangeFromStream(std::istream &) override
special for use in the shellScriptOptionParser
Definition: Options.h:615
options::internal::typed_base::fAddToRangeFromStream
void fAddToRangeFromStream(std::istream &aStream) override
Definition: Options.h:480
options::internal::sourceItem::fIsUnset
bool fIsUnset() const
Definition: Options.h:70
options::internal::baseForContainer
This class is an intermediate helper class for options that are container-based.
Definition: Options.h:766
options::internal::typed_base::valueType
T valueType
Definition: Options.h:447
options::internal::baseForMap::baseForMap
baseForMap(char aShortName, std::string aLongName, std::string aExplanation, short aNargs)
Definition: Options.h:637
options::base::fGetShortOptionMap
static std::map< char, base * > & fGetShortOptionMap()
Definition: Options.h:200
options::container::fWriteValue
void fWriteValue(std::ostream &aStream) const override
write textual representation of value to a std::ostream
Definition: Options.h:817
options::withAction
Definition: Options.h:887
options::postFixedNumber::lValue
T lValue
Definition: Options.h:106
options::internal::sourceItem::lLineNumber
int lLineNumber
Definition: Options.h:56
options::map::fSetMe
void fSetMe(std::istream &aStream, const internal::sourceItem &aSource) override
function to set the value from a string, remembering the source
Definition: Options.h:726
options::internal::optionError::optionError
optionError(const base *aOffendingOption, const std::string &aWhat)
Definition: Options.cpp:44
options::single< bool >::fCheckRange
void fCheckRange() const override
Definition: Options.h:613
options::map::fWriteCfgLines
void fWriteCfgLines(std::ostream &aStream, const char *aPrefix) const override
Definition: Options.h:681
options::parser::fComplainAndLeave
virtual void fComplainAndLeave(bool aWithHelp=true)
print help (if required) and exit.
Definition: Options.cpp:365
options::parser::lRequiredOptions
std::set< const base * > lRequiredOptions
Definition: Options.h:372
options::parser::parser
parser(const std::string &aDescription="", const std::string &aTrailer="", const std::vector< std::string > &aSearchPaths={"/etc/", "~/.", "~/.config/", "./."})
Definition: Options.cpp:90
options::container::fCheckRange
void fCheckRange() const override
Definition: Options.h:846
options::internal::baseForContainer::fIsContainer
bool fIsContainer() const override
Definition: Options.h:775
options::base::fCheckRange
virtual void fCheckRange() const =0
options::base::fAddToRangeFromStream
virtual void fAddToRangeFromStream(std::istream &aStream)=0
special for use in the shellScriptOptionParser
options::single::fAddDefaultFromStream
void fAddDefaultFromStream(std::istream &aStream) override
special for use in the shellScriptOptionParser
Definition: Options.h:564
options::base::lNargs
short lNargs
Definition: Options.h:209
options::parser::fSetMessageStream
void fSetMessageStream(std::ostream *aStream)
Definition: Options.cpp:115
options::internal::conversionError::type
const std::type_info & type
Definition: Options.h:313
options::base::fIsHidden
bool fIsHidden() const
Definition: Options.cpp:600
options::internal::baseForMap::fAddSource
void fAddSource(const T *aValueLocation, const internal::sourceItem &aSource)
Definition: Options.h:639
options::base::fSetSource
virtual void fSetSource(const internal::sourceItem &aSource)
remember the source that provided the value, e.g. commandline or a config file
Definition: Options.cpp:561
options::postFixedNumber
Definition: Options.h:104
options::internal::sourceFile
class to remember the file (or cmd line) an option was set from
Definition: Options.h:36
options::internal::sourceFile::sourceFile
sourceFile(const std::string &aName, decltype(lParent) aParent)
Definition: Options.h:43
options::parser::fSetExecutableName
void fSetExecutableName(const char *aName)
Definition: Options.cpp:131
options::operator>>
std::istream & operator>>(std::istream &aStream, postFixedNumber< T > &aNumber)
Definition: Options.h:137
options::internal::sourceItem::sourceItem
sourceItem(decltype(lFile) aFile, decltype(lLineNumber) aLineNumber)
Definition: Options.h:60
options::map::fWriteValue
void fWriteValue(std::ostream &aStream) const override
write textual representation of value to a std::ostream
Definition: Options.h:698
options::internal::typed_base::lRange
std::multiset< rangeValueType > lRange
Definition: Options.h:451
options::base::lForbiddenOptions
std::vector< const base * > lForbiddenOptions
Definition: Options.h:214
options::internal::conversionError::~conversionError
~conversionError() override=default
options::withAction::fSetMeNoarg
void fSetMeNoarg(const internal::sourceItem &aSource) override
Definition: Options.h:899
options::valuePrinter::lValuePrinter
valuePrinterType lValuePrinter
Definition: Options.h:178
options::internal::sourceFile::fGetName
const std::string & fGetName() const
Definition: Options.h:47
options::internal::typed_base::compareValueType
std::conditional< forceRangeValueTypeString, std::string, T >::type compareValueType
Definition: Options.h:449
options::base::lHidden
bool lHidden
Definition: Options.h:210
options::base::fHandleOption
virtual void fHandleOption(int argc, const char *argv[], int *i)
Definition: Options.cpp:566
options::parser::fRequire
virtual void fRequire(const base *aOtherOption)
Definition: Options.cpp:135