omega_h
Reliable mesh adaptation
Omega_h_cmdline.hpp
1 #ifndef OMEGA_H_CMDLINE_HPP
2 #define OMEGA_H_CMDLINE_HPP
3 
4 #include <memory>
5 #include <string>
6 #include <vector>
7 
8 #include <Omega_h_comm.hpp>
9 
10 namespace Omega_h {
11 
12 class CmdLineItem {
13  public:
14  CmdLineItem(std::string const& name_in);
15  virtual ~CmdLineItem();
16  bool parse(int* p_argc, char** argv, int i, bool should_print);
17  virtual bool parse_impl(
18  int* p_argc, char** argv, int i, bool should_print) = 0;
19  std::string const& name() const;
20  bool parsed() const;
21 
22  protected:
23  std::string name_;
24  bool parsed_;
25 };
26 
27 template <typename T>
28 class CmdLineArg : public CmdLineItem {
29  public:
30  CmdLineArg(std::string const& name_in, T const& defval);
31  ~CmdLineArg() override;
32  bool parse_impl(int* p_argc, char** argv, int i, bool should_print) override;
33  T get() const;
34 
35  private:
36  T value_;
37 };
38 
39 class CmdLineFlag : public CmdLineItem {
40  public:
41  CmdLineFlag(std::string const& name_in, std::string const& desc_in);
42  virtual bool parse_impl(
43  int* p_argc, char** argv, int i, bool should_print) override;
44  template <typename T>
45  void add_arg(std::string const& arg_name, T const& defval = T());
46  std::string const& desc() const;
47  CmdLineItem* arg(std::size_t i);
48  CmdLineItem* arg(std::string const& arg_name);
49  std::size_t nargs() const;
50 
51  private:
52  CmdLineFlag(CmdLineFlag const& other) = delete;
53  std::string desc_;
54  std::vector<std::unique_ptr<CmdLineItem>> args_;
55 };
56 
57 class CmdLine {
58  public:
59  CmdLine();
60  OMEGA_H_NODISCARD
61  bool parse_final(CommPtr comm, int* p_argc, char** argv);
62  OMEGA_H_NODISCARD
63  bool parse(CommPtr comm, int* p_argc, char** argv);
64  CmdLineFlag& add_flag(std::string const& name, std::string const& desc);
65  template <typename T>
66  void add_arg(std::string const& name, T const& defval = T());
67  bool parsed(std::string const& flag_name) const;
68  template <typename T>
69  T get(std::string const& flag_name, std::string const& arg_name) const;
70  bool parsed(std::string const& flag_name, std::size_t i) const;
71  template <typename T>
72  T get(std::string const& arg_name) const;
73  bool parsed(std::size_t i) const;
74  static bool check_empty(CommPtr comm, int argc, char** argv);
75  static bool check_empty(int argc, char** argv, bool should_print);
76  void show_help(CommPtr comm, char** argv) const;
77  void show_help(char** argv) const;
78 
79  private:
80  bool parse(int* p_argc, char** argv, bool should_print);
81  std::vector<std::unique_ptr<CmdLineItem>> args_;
82  std::vector<std::unique_ptr<CmdLineFlag>> flags_;
83  std::size_t nargs_parsed_;
84  bool parsed_help_;
85 };
86 
87 #define OMEGA_H_EXPL_INST_DECL(T) \
88  extern template class CmdLineArg<T>; \
89  extern template void CmdLineFlag::add_arg<T>( \
90  std::string const& name, T const& defval); \
91  extern template void CmdLine::add_arg<T>( \
92  std::string const& name, T const& defval); \
93  extern template T CmdLine::get<T>( \
94  std::string const& flag_name, std::string const& arg_name) const; \
95  extern template T CmdLine::get<T>(std::string const& arg_name) const;
96 OMEGA_H_EXPL_INST_DECL(int)
97 OMEGA_H_EXPL_INST_DECL(double)
98 OMEGA_H_EXPL_INST_DECL(std::string)
99 #undef OMEGA_H_EXPL_INST_DECL
100 
101 } // end namespace Omega_h
102 
103 #endif
Definition: Omega_h_cmdline.hpp:28
Definition: Omega_h_cmdline.hpp:39
Definition: Omega_h_cmdline.hpp:12
Definition: Omega_h_cmdline.hpp:57
Definition: amr_mpi_test.cpp:6