29 #ifndef INCLUDE_OLA_BASE_FLAGSPRIVATE_H_ 30 #define INCLUDE_OLA_BASE_FLAGSPRIVATE_H_ 59 virtual const char*
name()
const = 0;
69 virtual bool has_arg()
const = 0;
74 virtual const char*
arg_type()
const = 0;
79 virtual std::string
help()
const = 0;
86 virtual bool present()
const = 0;
93 virtual bool SetValue(
const std::string &input) = 0;
108 : m_arg_type(arg_type),
109 m_short_opt(short_opt[0]),
115 const char*
arg_type()
const {
return m_arg_type; }
116 std::string
help()
const {
return m_help; }
125 void ReplaceUnderscoreWithHyphen(
char *input);
126 const char* NewCanonicalName(
const char *
name);
129 const char *m_arg_type;
139 template <
typename T>
153 T default_value,
const char *
help,
155 :
BaseFlag(arg_type, short_opt, help),
157 m_default(default_value),
158 m_value(default_value) {
159 m_name = NewCanonicalName(name);
166 const char *
name()
const {
return m_name; }
168 bool default_value()
const {
return m_default; }
170 operator T()
const {
return m_value; }
172 Flag &operator=(T v) {
177 bool SetValue(
const std::string &input);
194 bool default_value,
const char *
help,
const bool has_arg)
195 :
BaseFlag(arg_type, short_opt, help),
197 m_default(default_value),
198 m_value(default_value),
200 if (!has_arg && default_value) {
202 size_t prefix_size = strlen(NO_PREFIX);
203 size_t name_size = strlen(name);
204 char* new_name =
new char[prefix_size + name_size + 1];
205 memcpy(new_name, NO_PREFIX, prefix_size);
206 memcpy(new_name + prefix_size, name, name_size);
207 new_name[prefix_size + name_size] = 0;
208 ReplaceUnderscoreWithHyphen(new_name);
211 m_name = NewCanonicalName(name);
219 const char *
name()
const {
return m_name; }
221 bool default_value()
const {
return m_default; }
223 operator bool()
const {
return m_value; }
225 Flag &operator=(
bool v) {
235 m_value = !m_default;
246 static const char NO_PREFIX[];
258 std::string default_value,
const char *
help,
260 :
BaseFlag(arg_type, short_opt, help),
262 m_default(default_value),
263 m_value(default_value) {
264 m_name = NewCanonicalName(name);
271 const char *
name()
const {
return m_name; }
273 std::string default_value()
const {
return m_default; }
276 operator const char*()
const {
return m_value.c_str(); }
277 operator std::string()
const {
return m_value; }
278 std::string str()
const {
return m_value; }
280 Flag &operator=(
const std::string &v) {
293 std::string m_default;
302 template <
typename T>
320 void SetFirstLine(
const std::string &
help);
321 void SetDescription(
const std::string &help);
327 typedef std::map<std::string, FlagInterface*> LongOpts;
328 typedef std::map<char, FlagInterface*> ShortOpts;
329 typedef std::map<int, FlagInterface*> FlagMap;
331 typedef std::pair<std::string, std::string> OptionPair;
333 LongOpts m_long_opts;
334 ShortOpts m_short_opts;
336 std::string m_first_line;
337 std::string m_description;
339 std::string GetShortOptsString()
const;
340 struct option *GetLongOpts(FlagMap *flag_map);
341 void PrintFlags(std::vector<std::string> *lines);
342 void PrintManPageFlags(std::vector<OptionPair> *lines);
381 #define DECLARE_flag(type, name) \ 382 namespace ola_flags { extern ola::Flag<type> FLAGS_##name; } \ 383 using ola_flags::FLAGS_##name; 388 #define DEFINE_flag(type, name, short_opt, default_value, help_str, \ 390 namespace ola_flags { \ 391 ola::Flag<type> FLAGS_##name(#name, #type, #short_opt, default_value, \ 392 help_str, has_arg); \ 393 ola::FlagRegisterer flag_registerer_##name(&FLAGS_##name); \ 395 using ola_flags::FLAGS_##name 400 #define DEFINE_flag_with_short(type, name, short_opt, default_value, help_str, \ 402 namespace ola_flags { char flag_short_##short_opt = 0; } \ 403 namespace ola_flags { \ 404 ola::Flag<type> FLAGS_##name(#name, #type, #short_opt, default_value, \ 405 help_str, has_arg); \ 406 ola::FlagRegisterer flag_registerer_##name( \ 407 &FLAGS_##name, &flag_short_##short_opt); \ 409 using ola_flags::FLAGS_##name 416 #endif // INCLUDE_OLA_BASE_FLAGSPRIVATE_H_ The common implementation.
Definition: FlagsPrivate.h:99
char short_opt() const
Get the flag short option.
Definition: FlagsPrivate.h:114
const char * arg_type() const
Get the flag argument type.
Definition: FlagsPrivate.h:274
virtual bool has_arg() const =0
Whether the flag requires an argument.
virtual char short_opt() const =0
Get the flag short option.
This class is responsible for registering a flag.
Definition: FlagsPrivate.h:355
bool present() const
Check if the flag was present on the command line. Good for switching behaviour when a flag is used...
Definition: FlagsPrivate.h:117
#define DISALLOW_COPY_AND_ASSIGN(TypeName)
Creates dummy copy constructor and assignment operator declarations.
Definition: Macro.h:44
virtual const char * arg_type() const =0
Get the flag argument type.
virtual bool SetValue(const std::string &input)=0
Set the flag value.
bool has_arg() const
Whether the flag requires an argument.
Definition: FlagsPrivate.h:220
const char * name() const
Get the flag name.
Definition: FlagsPrivate.h:166
void MarkAsPresent()
Set that the flag was present on the command line.
Definition: FlagsPrivate.h:122
void ParseFlags(int *argc, char **argv)
Parses the command line flags up to the first non-flag value. argv is re-arranged so that it only con...
Definition: Flags.cpp:99
Flag(const char *name, const char *arg_type, const char *short_opt, T default_value, const char *help, const bool has_arg)
Create a new Flag.
Definition: FlagsPrivate.h:152
FlagRegistry * GetRegistry()
Get the global FlagRegistry.
std::string help() const
Get the flag help string.
Definition: FlagsPrivate.h:116
#define OLA_UNUSED
Mark unused arguments & types.
Definition: Macro.h:62
const char * name() const
Get the flag name.
Definition: FlagsPrivate.h:219
void DisplayUsage()
Print the usage text to stdout.
Definition: Flags.cpp:82
A templated Flag class.
Definition: FlagsPrivate.h:140
BaseFlag(const char *arg_type, const char *short_opt, const char *help)
Create a new BaseFlag.
Definition: FlagsPrivate.h:107
bool StringToBoolTolerant(const string &value, bool *output)
Convert a string to a bool in a tolerant way.
Definition: StringUtils.cpp:136
void DisplayVersion()
Print the version text to stdout.
Definition: Flags.cpp:91
bool has_arg() const
Whether the flag requires an argument.
Definition: FlagsPrivate.h:167
bool SetValue(const std::string &input)
Set the flag value.
Definition: FlagsPrivate.h:285
Various string utility functions.
bool SetValue(const std::string &input)
Set the flag value.
Definition: FlagsPrivate.h:230
bool has_arg() const
Whether the flag requires an argument.
Definition: FlagsPrivate.h:272
The namespace containing all OLA symbols.
Definition: Credentials.cpp:44
virtual std::string help() const =0
Get the flag help string.
bool SetValue(const std::string &input)
Used to set the value of a flag.
Definition: FlagsPrivate.h:303
The interface for the Flag classes.
Definition: FlagsPrivate.h:52
bool StringToInt(const string &value, unsigned int *output, bool strict)
Convert a string to a unsigned int.
Definition: StringUtils.cpp:155
virtual const char * name() const =0
Get the flag name.
const char * name() const
Get the flag name.
Definition: FlagsPrivate.h:271
virtual bool present() const =0
Check if the flag was present on the command line. Good for switching behaviour when a flag is used...
const char * arg_type() const
Get the flag argument type.
Definition: FlagsPrivate.h:115
This class holds all the flags, and is responsible for parsing the command line.
Definition: FlagsPrivate.h:313