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);
184 DISALLOW_COPY_AND_ASSIGN(
Flag);
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[];
248 DISALLOW_COPY_AND_ASSIGN(
Flag);
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;
296 DISALLOW_COPY_AND_ASSIGN(
Flag);
302 template <
typename T>
318 void ParseFlags(
int *argc,
char **argv);
320 void SetFirstLine(
const std::string &help);
321 void SetDescription(
const std::string &help);
323 void DisplayVersion();
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_