1#ifndef YAZE_UTIL_FLAG_H_
2#define YAZE_UTIL_FLAG_H_
7#include <unordered_map>
23 virtual const std::string&
name()
const = 0;
26 virtual const std::string&
help()
const = 0;
35 Flag(
const std::string&
name,
const T& default_value,
36 const std::string& help_text)
42 const std::string&
name()
const override {
return name_; }
43 const std::string&
help()
const override {
return help_; }
47 std::stringstream ss(text);
49 if (!(ss >> parsed)) {
71 if (text ==
"true" || text ==
"1" || text ==
"yes" || text ==
"on") {
73 }
else if (text ==
"false" || text ==
"0" || text ==
"no" || text ==
"off") {
77 "Failed to parse boolean flag: " + name() +
78 " (expected true/false/1/0/yes/no/on/off, got: " + text +
")");
88 const std::string& help_text) {
89 auto flag = std::make_unique<Flag<T>>(name, default_value, help_text);
92 flags_[name] = std::move(flag);
98 auto it =
flags_.find(name);
102 return it->second.get();
107 std::vector<IFlag*> result;
108 result.reserve(
flags_.size());
109 for (
auto const& kv :
flags_) {
110 result.push_back(kv.second.get());
116 std::unordered_map<std::string, std::unique_ptr<IFlag>>
flags_;
126#define DEFINE_FLAG(type, name, default_val, help_text) \
127 yaze::util::Flag<type>* FLAGS_##name = \
128 yaze::util::global_flag_registry()->RegisterFlag<type>( \
129 "--" #name, (default_val), (help_text))
132#define FLAG_VALUE(name) (FLAGS_##name->Get())
140 std::vector<std::string> tokens;
141 for (
int i = 0; i < argc; i++) {
142 tokens.push_back(argv[i]);
150 void Parse(std::vector<std::string>* tokens);
159 std::string* value_string);
162 bool ExtractFlag(
const std::string& token, std::string* flag_name);
bool ExtractFlagAndValue(const std::string &token, std::string *flag_name, std::string *value_string)
void Parse(int argc, char **argv)
FlagParser(FlagRegistry *registry)
bool ExtractFlag(const std::string &token, std::string *flag_name)
Flag< T > * RegisterFlag(const std::string &name, const T &default_value, const std::string &help_text)
IFlag * GetFlag(const std::string &name) const
std::vector< IFlag * > AllFlags() const
std::unordered_map< std::string, std::unique_ptr< IFlag > > flags_
Flag(const std::string &name, const T &default_value, const std::string &help_text)
const std::string & name() const override
void ParseValue(const std::string &text) override
const std::string & help() const override
void SetValue(const T &val)
virtual void ParseValue(const std::string &text)=0
virtual const std::string & name() const =0
virtual const std::string & help() const =0
void FlagParseFatal(const std::string &message)
FlagRegistry * global_flag_registry()