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 const std::string& help_text) {
69 auto flag = std::make_unique<Flag<T>>(name, default_value, help_text);
72 flags_[name] = std::move(flag);
78 auto it =
flags_.find(name);
82 return it->second.get();
87 std::vector<IFlag*> result;
88 result.reserve(
flags_.size());
89 for (
auto const& kv :
flags_) {
90 result.push_back(kv.second.get());
96 std::unordered_map<std::string, std::unique_ptr<IFlag>>
flags_;
105#define DECLARE_FLAG(type, name) extern yaze::util::Flag<type>* FLAGS_##name
108#define DEFINE_FLAG(type, name, default_val, help_text) \
109 yaze::util::Flag<type>* FLAGS_##name = \
110 yaze::util::global_flag_registry()->RegisterFlag<type>( \
111 "--" #name, (default_val), (help_text))
114#define FLAG_VALUE(name) (FLAGS_##name->Get())
122 std::vector<std::string> tokens;
123 for (
int i = 0; i < argc; i++) {
124 tokens.push_back(argv[i]);
132 void Parse(std::vector<std::string>* tokens);
141 std::string* value_string) {
142 const size_t eq_pos = token.find(
'=');
143 if (eq_pos == std::string::npos) {
146 *flag_name = token.substr(0, eq_pos);
147 *value_string = token.substr(eq_pos + 1);
bool ExtractFlagAndValue(const std::string &token, std::string *flag_name, std::string *value_string)
void Parse(int argc, char **argv)
FlagParser(FlagRegistry *registry)
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
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.