#pragma once struct cfa_option { char short_name; const char * long_name; const char * help; void * variable; bool (*parse)(const char *, void * ); }; extern cfa_option last_option; static inline void ?{}( cfa_option & this ) {} forall(dtype T | { bool parse(const char *, T & ); }) static inline void ?{}( cfa_option & this, char short_name, const char * long_name, const char * help, T & variable ) { this.short_name = short_name; this.long_name = long_name; this.help = help; this.variable = (void*)&variable; this.parse = (bool (*)(const char *, void * ))parse; } forall(dtype T) static inline void ?{}( cfa_option & this, char short_name, const char * long_name, const char * help, T & variable, bool (*parse)(const char *, T & )) { this.short_name = short_name; this.long_name = long_name; this.help = help; this.variable = (void*)&variable; this.parse = (bool (*)(const char *, void * ))parse; } void parse_args( cfa_option options[], size_t opt_count, const char * usage, char ** & left ); void parse_args( int argc, char * argv[], cfa_option options[], size_t opt_count, const char * usage, char ** & left ); void print_args_usage(cfa_option options[], size_t opt_count, const char * usage, bool error) __attribute__ ((noreturn)); void print_args_usage(int argc, char * argv[], cfa_option options[], size_t opt_count, const char * usage, bool error) __attribute__ ((noreturn)); bool parse_yesno (const char *, bool & ); bool parse_settrue (const char *, bool & ); bool parse_setfalse(const char *, bool & ); bool parse(const char *, const char * & ); bool parse(const char *, int & ); bool parse(const char *, unsigned & ); bool parse(const char *, unsigned long & ); bool parse(const char *, unsigned long long & ); bool parse(const char *, double & );