pism_options.hh (4075B)
1 // Copyright (C) 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 PISM Authors 2 // 3 // This file is part of PISM. 4 // 5 // PISM is free software; you can redistribute it and/or modify it under the 6 // terms of the GNU General Public License as published by the Free Software 7 // Foundation; either version 3 of the License, or (at your option) any later 8 // version. 9 // 10 // PISM is distributed in the hope that it will be useful, but WITHOUT ANY 11 // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 12 // FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 13 // details. 14 // 15 // You should have received a copy of the GNU General Public License 16 // along with PISM; if not, write to the Free Software 17 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 18 19 #ifndef _PISM_OPTIONS_H_ 20 #define _PISM_OPTIONS_H_ 21 22 #include <string> 23 #include <vector> 24 #include <set> 25 26 #include "pism_utilities.hh" 27 28 #include "options.hh" 29 30 namespace pism { 31 32 class Config; 33 class Logger; 34 35 void show_usage(const Logger &log, const std::string &execname, const std::string &usage); 36 37 //! @brief Returns true if PISM should terminate after printing some 38 //! messages to stdout. 39 bool show_usage_check_req_opts(const Logger &log, 40 const std::string &execname, 41 const std::vector<std::string> &required_options, 42 const std::string &usage); 43 44 45 //! Utilities for processing command-line options. 46 namespace options { 47 48 typedef enum {ALLOW_EMPTY, DONT_ALLOW_EMPTY} ArgumentFlag; 49 50 class String : public Option<std::string> { 51 public: 52 // there is no reasonable default; if the option is set, it has to 53 // have a non-empty argument 54 String(const std::string& option, 55 const std::string& description); 56 // there is a reasonable default 57 String(const std::string& option, 58 const std::string& description, 59 const std::string& default_value, 60 ArgumentFlag flag = DONT_ALLOW_EMPTY); 61 private: 62 int process(const std::string& option, 63 const std::string& description, 64 const std::string& default_value, 65 ArgumentFlag flag); 66 }; 67 68 class StringList : public Option<std::vector<std::string> > { 69 public: 70 StringList(const std::string& option, 71 const std::string& description, 72 const std::string& default_value); 73 std::string to_string(); 74 const std::string& operator[](size_t index) const; 75 }; 76 77 class StringSet : public Option<std::set<std::string> > { 78 public: 79 StringSet(const std::string& option, 80 const std::string& description, 81 const std::string& default_value); 82 std::string to_string(); 83 }; 84 85 class Keyword : public Option<std::string> { 86 public: 87 Keyword(const std::string& option, 88 const std::string& description, 89 const std::string& choices, 90 const std::string& default_value); 91 }; 92 93 class Integer : public Option<int> { 94 public: 95 Integer(const std::string& option, 96 const std::string& description, 97 int default_value); 98 }; 99 100 class IntegerList : public Option<std::vector<int> > { 101 public: 102 IntegerList(const std::string& option, 103 const std::string& description, 104 const std::vector<int> &defaults); 105 const int& operator[](size_t index) const; 106 }; 107 108 class Real : public Option<double> { 109 public: 110 Real(const std::string& option, 111 const std::string& description, 112 double default_value); 113 }; 114 115 class RealList : public Option<std::vector<double> > { 116 public: 117 RealList(const std::string& option, 118 const std::string& description, 119 const std::vector<double> &default_value); 120 const double& operator[](size_t index) const; 121 }; 122 123 bool Bool(const std::string& option, 124 const std::string& description); 125 126 void deprecated(const std::string &old_name, const std::string &new_name); 127 void ignored(const Logger &log, const std::string &name); 128 void forbidden(const std::string &name); 129 } // end of namespace options 130 131 } // end of namespace pism 132 133 #endif /* _PISM_OPTIONS_H_ */