HAL
program_options.h
Go to the documentation of this file.
1 // MIT License
2 //
3 // Copyright (c) 2019 Ruhr University Bochum, Chair for Embedded Security. All Rights reserved.
4 // Copyright (c) 2019 Marc Fyrbiak, Sebastian Wallat, Max Hoffmann ("ORIGINAL AUTHORS"). All rights reserved.
5 // Copyright (c) 2021 Max Planck Institute for Security and Privacy. All Rights reserved.
6 // Copyright (c) 2021 Jörn Langheinrich, Julian Speith, Nils Albartus, René Walendy, Simon Klix ("ORIGINAL AUTHORS"). All Rights reserved.
7 //
8 // Permission is hereby granted, free of charge, to any person obtaining a copy
9 // of this software and associated documentation files (the "Software"), to deal
10 // in the Software without restriction, including without limitation the rights
11 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 // copies of the Software, and to permit persons to whom the Software is
13 // furnished to do so, subject to the following conditions:
14 //
15 // The above copyright notice and this permission notice shall be included in all
16 // copies or substantial portions of the Software.
17 //
18 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24 // SOFTWARE.
25 
26 #pragma once
27 
28 #include "hal_core/defines.h"
29 
30 #include <initializer_list>
31 #include <map>
32 #include <memory>
33 #include <set>
34 #include <string>
35 #include <tuple>
36 #include <vector>
37 
38 namespace hal
39 {
40  class ProgramArguments;
41 
48  {
49  public:
51  static const std::string A_REQUIRED_PARAMETER;
52 
58  ProgramOptions(const std::string& name = "");
59 
60  ~ProgramOptions() = default;
61 
69  ProgramArguments parse(int argc, const char* argv[]);
70 
77  std::vector<std::string> get_unknown_arguments();
78 
86  bool is_registered(const std::string& flag) const;
87 
100  bool add(const std::string& flag, const std::string& description, const std::initializer_list<std::string>& parameters = {});
101 
114  bool add(const std::initializer_list<std::string>& flags, const std::string& description, const std::initializer_list<std::string>& parameters = {});
115 
124  bool add(const ProgramOptions& other_options, const std::string& category = "");
125 
133  bool remove(const std::string& flag);
134 
142  std::string get_options_string() const;
143 
149  std::vector<std::tuple<std::set<std::string>, std::string>> get_options() const;
150 
151  private:
152  struct Option
153  {
154  std::string description;
155  std::vector<std::string> parameters;
156  std::set<std::string> flags;
157  };
158 
159  std::string m_name;
160 
161  std::vector<Option> m_options;
162 
163  std::map<std::string, std::vector<ProgramOptions>> m_suboptions;
164 
165  std::vector<std::string> m_unknown_options;
166 
167  // returns all options, including those of added ProgramOptions objects
168  std::vector<const Option*> get_all_options() const;
169 
170  // resets all options, including those of added ProgramOptions objects
171  void reset_all_options();
172 
173  // resets a single option
174  void reset_option(Option*);
175 
176  // returns the length of the longest formatted string containing the flags
177  size_t get_flag_length() const;
178 
179  // returns the formatted string and starts the always after fill_length characters (space filled)
180  std::string get_options_string_internal(size_t fill_length, size_t max_line_width) const;
181  };
182 } // namespace hal
#define CORE_API
Definition: arch_linux.h:28
~ProgramOptions()=default
static const std::string A_REQUIRED_PARAMETER
constant to specify that a parameter is required and does not have a default value.
void remove(std::filesystem::path file_path)
std::unique_ptr< GateLibrary > parse(std::filesystem::path file_path)
std::string name