1#ifndef YAZE_UTIL_FLAG_H_
2#define YAZE_UTIL_FLAG_H_
8#include <unordered_map>
20 virtual const std::string&
name()
const = 0;
23 virtual const std::string&
help()
const = 0;
32 Flag(
const std::string&
name,
const T& default_value,
33 const std::string& help_text)
39 const std::string&
name()
const override {
return name_; }
40 const std::string&
help()
const override {
return help_; }
44 std::stringstream ss(text);
46 if (!(ss >> parsed)) {
47 throw std::runtime_error(
"Failed to parse flag: " +
name_);
68 if (text ==
"true" || text ==
"1" || text ==
"yes" || text ==
"on") {
70 }
else if (text ==
"false" || text ==
"0" || text ==
"no" || text ==
"off") {
73 throw std::runtime_error(
"Failed to parse boolean flag: " + name() +
74 " (expected true/false/1/0/yes/no/on/off, got: " + text +
")");
84 const std::string& help_text) {
85 auto flag = std::make_unique<Flag<T>>(name, default_value, help_text);
88 flags_[name] = std::move(flag);
94 auto it =
flags_.find(name);
98 return it->second.get();
103 std::vector<IFlag*> result;
104 result.reserve(
flags_.size());
105 for (
auto const& kv :
flags_) {
106 result.push_back(kv.second.get());
112 std::unordered_map<std::string, std::unique_ptr<IFlag>>
flags_;
122#define DEFINE_FLAG(type, name, default_val, help_text) \
123 yaze::util::Flag<type>* FLAGS_##name = \
124 yaze::util::global_flag_registry()->RegisterFlag<type>( \
125 "--" #name, (default_val), (help_text))
128#define FLAG_VALUE(name) (FLAGS_##name->Get())
136 std::vector<std::string> tokens;
137 for (
int i = 0; i < argc; i++) {
138 tokens.push_back(argv[i]);
146 void Parse(std::vector<std::string>* tokens);
155 std::string* value_string);
158 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
FlagRegistry * global_flag_registry()
Main namespace for the application.