Loading [MathJax]/extensions/tex2jax.js
Darwin  1.0
Event loop based prototype framework
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
Options.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <functional>
4 #include <vector>
5 #include <filesystem>
6 #include <iostream>
7 #include <optional>
8 
9 #include <boost/program_options/options_description.hpp>
10 #include <boost/program_options/positional_options.hpp>
11 #include <boost/property_tree/ptree.hpp>
12 
13 #ifndef DARWIN_GIT_COMMIT
14 # define DARWIN_GIT_COMMIT nullptr
15 #endif
16 
17 #ifndef DARWIN_EXAMPLE
18 # define DARWIN_EXAMPLE nullptr
19 #endif
20 
21 namespace Darwin::Tools {
22 
23 enum {
24  none = 0b000000,
25  config = 0b000001,
26  split = 0b000010,
27  fill = 0b000100,
28  Friend = 0b001100,
29  syst = 0b010000,
30  verbose = 0b100000
31 };
32 
56 class Options {
57 
58  // internal parsing
59  boost::program_options::options_description
64  boost::program_options::positional_options_description
66  boost::property_tree::ptree
68 
69  const std::filesystem::path example;
70 
75  void parse_helper (int, const char * const []);
76 
80  void parse_common (int, const char * const []);
81 
86  void parse_custom (int, const char * const []);
87 
88  std::filesystem::path config_file;
89 
90  // for helper
91  const std::string tutorial;
92  std::string synopsis;
93  std::vector<std::string>
96 
100  static void check_input (const std::filesystem::path&
101  );
102 
109  static void check_output (const std::filesystem::path&
110  );
111 
117  Options& set (const char *,
118  const boost::program_options::value_semantic *,
119  const char *
120  );
121 
126  template<typename T
127  > std::function<void(T)> put (const char * configpath
128  )
129  {
130  return [configpath,this](T value) { pt_conf.put<T>(configpath, value); };
131  }
132 
133  std::optional<unsigned> registered;
134 
137  inline bool allow_unregistered () const { return bool(registered); }
138 
141  std::string exec (const std::string&
142  );
143 
144  enum Stage {
147  Arg,
148  Args
149  };
150 
152 
153  const int params;
154  const std::string m_commit;
155  int steer;
156  static std::filesystem::path prefix;
157  unsigned j,
158  k;
159 
160  std::vector<std::vector<std::string>>
163 
164 public:
165 
172  Options (const std::string&,
173  int = none,
174  const char* commit = DARWIN_GIT_COMMIT,
175  const char* example = DARWIN_EXAMPLE
176  );
177 
180  Options () = delete;
181 
188  Options& input (const char *,
189  std::filesystem::path *,
190  const char *,
191  const std::vector<std::string>& = {".root", ".xml"});
192 
199  Options& inputs (const char *,
200  std::vector<std::filesystem::path> *,
201  const char *,
202  const std::vector<std::string>& = {".root", ".xml"});
203 
210  Options& output (const char *,
211  std::filesystem::path *,
212  const char *,
213  const std::vector<std::string>& = {".root", ".xml"});
214 
220  template<typename T> Options& arg (
221  const char * name,
222  const char * configpath,
223  const char * desc)
224  {
225  if (stage > Stage::Arg)
226  BOOST_THROW_EXCEPTION(std::runtime_error(
227  "Not possible to add another argument at this stage"));
228  stage = Stage::Arg;
229 
230  names.push_back(name);
231  configpaths.push_back(configpath);
232  const boost::program_options::value_semantic * s =
233  boost::program_options::value<T>()->notifier(put<T>(configpath));
234  return set(name, s, desc);
235  }
236 
241  Options& args (const char * name,
242  const char * configpath,
243  const char * desc
244  );
245 
249  const boost::property_tree::ptree& operator() (int, const char * const []);
250 
256  static std::string parse_env_var (std::string);
257 
260  static inline const char * parse_env_var (const char * p)
261  { return parse_env_var(std::string(p)).c_str(); }
262 
265  static inline std::filesystem::path parse_env_var (const std::filesystem::path& p)
266  { return std::filesystem::path(parse_env_var(p.string())); }
267 
270  static void parse_config
271  (boost::property_tree::ptree&,
272  std::string = "");
273 
274  // result of parsing
275  static std::string full_cmd;
276 
279  auto commit () const { return m_commit; }
280 
283  inline int steering () const { return steer; }
284 
287  inline std::pair<unsigned, unsigned> slice () const
288  {
289  using namespace std;
290  if (!(params & split))
291  BOOST_THROW_EXCEPTION(invalid_argument("No splitting of the input file."));
292  return make_pair(j,k);
293  }
294 };
295 
296 } // end of Darwin::Tools namespace
Darwin::Tools::Options::parse_env_var
static std::string parse_env_var(std::string)
Definition: Options.cc:75
Darwin::Tools::Options::steering
int steering() const
Steering information for running of executable.
Definition: Options.h:283
Darwin::Tools::Options::check_input
static void check_input(const std::filesystem::path &)
Definition: Options.cc:37
Darwin::Tools::Options::tutorial
const std::string tutorial
define in constructor, shown with option -t
Definition: Options.h:91
Darwin::Tools::Options::Options
Options()=delete
No default constructor is allowed.
Darwin::Tools::Options::custom
boost::program_options::options_description custom
for positional arguments, depending on the actual command
Definition: Options.h:63
Darwin::Tools::Options::Arg
@ Arg
then the registered arguments (inputs and outputs no longer allowed)
Definition: Options.h:147
Darwin::Tools::Options::prefix
static std::filesystem::path prefix
prefix command to steer -j and -k
Definition: Options.h:156
Darwin::Tools::Options::configpaths
std::vector< std::string > configpaths
path to the options in config (except for I/O)
Definition: Options.h:95
Darwin::Tools::Options::allow_unregistered
bool allow_unregistered() const
Definition: Options.h:137
Darwin::Tools::Options::inputs
Options & inputs(const char *, std::vector< std::filesystem::path > *, const char *, const std::vector< std::string > &={".root", ".xml"})
expected file extension
Definition: Options.cc:456
Darwin::Tools::Options::Output
@ Output
then the outputs (inputs are no longer allowed)
Definition: Options.h:146
Darwin::Tools::Options::args
Options & args(const char *name, const char *configpath, const char *desc)
Definition: Options.cc:517
Darwin::Tools::Options::check_output
static void check_output(const std::filesystem::path &)
Definition: Options.cc:50
Darwin::Tools::Options::hidden
boost::program_options::options_description hidden
hidden interface (not for lambda user)
Definition: Options.h:60
Darwin::Tools::Options::params
const int params
input parameters to interpret explicit options
Definition: Options.h:153
Darwin::Tools::Options::operator()
const boost::property_tree::ptree & operator()(int, const char *const [])
Definition: Options.cc:389
Darwin::Tools::Options::synopsis
std::string synopsis
stores a clean version of the command, displayed w. -h
Definition: Options.h:92
Darwin::Tools::Options::pos_hide
boost::program_options::positional_options_description pos_hide
parser for positional arguments
Definition: Options.h:65
Darwin::Tools::Options::inputExt
std::vector< std::vector< std::string > > inputExt
expected extensions of input files
Definition: Options.h:161
Darwin::Tools::Options::steer
int steer
output parameters for code executation
Definition: Options.h:155
Darwin::Tools::Options::commit
auto commit() const
Git commit information.
Definition: Options.h:279
Darwin::Tools::Options::parse_common
void parse_common(int, const char *const [])
Definition: Options.cc:265
Darwin::Tools::Options::outputExt
std::vector< std::vector< std::string > > outputExt
expected extensions of output files
Definition: Options.h:162
Darwin::Tools::Options::parse_helper
void parse_helper(int, const char *const [])
Definition: Options.cc:182
Darwin::Tools::Options::parse_config
static void parse_config(boost::property_tree::ptree &, std::string="")
Parse config if given. This method calls itself to parse the tree structure.
Definition: Options.cc:372
Darwin::Tools::syst
@ syst
activate -s to systematic uncertainties
Definition: Options.h:29
Darwin::Tools::none
@ none
default (for simple executables)
Definition: Options.h:24
Darwin::Tools::Options::slice
std::pair< unsigned, unsigned > slice() const
Compactify slice information into a pair.
Definition: Options.h:287
Darwin::Tools::Options::k
unsigned k
slice index
Definition: Options.h:158
Darwin::Tools::Options::set
Options & set(const char *, const boost::program_options::value_semantic *, const char *)
Definition: Options.cc:416
Darwin::Tools::Options
Common class to interpret the command line, based on Boost Program Options.
Definition: Options.h:56
Darwin::Tools::verbose
@ verbose
bit for debug mode (-v is always available)
Definition: Options.h:30
Darwin::Tools::split
@ split
activate -k and -j to define slice
Definition: Options.h:26
Darwin::Tools::Options::arg
Options & arg(const char *name, const char *configpath, const char *desc)
Definition: Options.h:220
Darwin::Tools::Options::stage
Stage stage
internal stage
Definition: Options.h:151
Darwin::Tools::Options::parse_env_var
static std::filesystem::path parse_env_var(const std::filesystem::path &p)
Parse environment variable in a path.
Definition: Options.h:265
DARWIN_EXAMPLE
#define DARWIN_EXAMPLE
Definition: Options.h:18
Darwin::Tools::fill
@ fill
activate -f to fill the tree
Definition: Options.h:27
Darwin::Tools::Options::Stage
Stage
Definition: Options.h:144
Darwin::Tools
Classes and functions related to the framework.
Definition: forceMetaInfo.cc:28
Darwin::Tools::Options::m_commit
const std::string m_commit
Commit SHA for –git.
Definition: Options.h:154
Darwin::Tools::Options::helper
boost::program_options::options_description helper
to display the helper
Definition: Options.h:61
Darwin::Tools::Options::j
unsigned j
Definition: Options.h:157
DARWIN_GIT_COMMIT
#define DARWIN_GIT_COMMIT
Definition: Options.h:14
Darwin::Tools::Options::parse_custom
void parse_custom(int, const char *const [])
Definition: Options.cc:299
Darwin::Tools::Options::config_file
std::filesystem::path config_file
path to INFO, JSON, or XML config file
Definition: Options.h:88
Darwin::Tools::Options::names
std::vector< std::string > names
names of the different options (shown in synopsis)
Definition: Options.h:94
Darwin::Tools::Options::output
Options & output(const char *, std::filesystem::path *, const char *, const std::vector< std::string > &={".root", ".xml"})
expected file extension
Definition: Options.cc:500
Darwin::Tools::config
@ config
activate -c option to provide config file
Definition: Options.h:25
Darwin::Tools::Options::parse_env_var
static const char * parse_env_var(const char *p)
Parse environment variable in C-style string.
Definition: Options.h:260
Darwin::Tools::Options::input
Options & input(const char *, std::filesystem::path *, const char *, const std::vector< std::string > &={".root", ".xml"})
expected file extension
Definition: Options.cc:429
Darwin::Tools::Options::exec
std::string exec(const std::string &)
Definition: Options.cc:442
Darwin::Tools::Options::Input
@ Input
first the inputs
Definition: Options.h:145
Darwin::Tools::Options::Args
@ Args
finally the remaining arguments / garbage collector (must be very last)
Definition: Options.h:148
Darwin::Tools::Options::put
std::function< void(T)> put(const char *configpath)
Definition: Options.h:127
Darwin::Tools::Friend
@ Friend
activate -F to only fill the new branches
Definition: Options.h:28
Darwin::Tools::Options::full_cmd
static std::string full_cmd
extended version of the command for reproducibility
Definition: Options.h:275
Darwin::Tools::Options::registered
std::optional< unsigned > registered
collect the number of registered options (only if Options::args has been called before)
Definition: Options.h:133
Darwin::Tools::Options::pt_conf
boost::property_tree::ptree pt_conf
internal config obtained from arugments and input config
Definition: Options.h:67
Darwin::Tools::Options::common
boost::program_options::options_description common
generic + explicit options like --verbose
Definition: Options.h:62
Darwin::Tools::Options::example
const std::filesystem::path example
path to example config
Definition: Options.h:69