20#ifndef Glucose_Options_h
21#define Glucose_Options_h
23#define __STDC_FORMAT_MACROS
42extern void parseOptions (
int& argc,
char** argv,
bool strict =
false);
61 static const char*&
getUsageString() {
static const char* usage_str;
return usage_str; }
62 static const char*&
getHelpPrefixString() {
static const char* help_prefix_str =
"";
return help_prefix_str; }
86 virtual bool parse (
const char* str) = 0;
87 virtual void help (
bool verbose =
false) = 0;
137 operator double (
void)
const {
return value; }
138 operator double& (void) {
return value; }
141 virtual bool parse(
const char* str){
142 const char* span = str;
144 if (!match(span,
"-") || !match(span,
name) || !match(span,
"="))
148 double tmp = strtod(span, &end);
152 else if (tmp >=
range.end && (!
range.end_inclusive || tmp !=
range.end)){
153 fprintf(stderr,
"ERROR! value <%s> is too large for option \"%s\".\n", span,
name);
155 }
else if (tmp <=
range.begin && (!
range.begin_inclusive || tmp !=
range.begin)){
156 fprintf(stderr,
"ERROR! value <%s> is too small for option \"%s\".\n", span,
name);
165 virtual void help (
bool verbose =
false){
166 fprintf(stderr,
" -%-12s = %-8s %c%4.2g .. %4.2g%c (default: %g)\n",
168 range.begin_inclusive ?
'[' :
'(',
171 range.end_inclusive ?
']' :
')',
175 fprintf(stderr,
"\n");
195 operator int32_t (
void)
const {
return value; }
196 operator int32_t& (void) {
return value; }
199 virtual bool parse(
const char* str){
200 const char* span = str;
202 if (!match(span,
"-") || !match(span,
name) || !match(span,
"="))
206 int32_t tmp = strtol(span, &end, 10);
210 else if (tmp >
range.end){
211 fprintf(stderr,
"ERROR! value <%s> is too large for option \"%s\".\n", span,
name);
213 }
else if (tmp <
range.begin){
214 fprintf(stderr,
"ERROR! value <%s> is too small for option \"%s\".\n", span,
name);
222 virtual void help (
bool verbose =
false){
225 fprintf(stderr,
"imin");
227 fprintf(stderr,
"%4d",
range.begin);
229 fprintf(stderr,
" .. ");
231 fprintf(stderr,
"imax");
233 fprintf(stderr,
"%4d",
range.end);
235 fprintf(stderr,
"] (default: %d)\n",
value);
238 fprintf(stderr,
"\n");
257 operator int64_t (
void)
const {
return value; }
258 operator int64_t& (void) {
return value; }
261 virtual bool parse(
const char* str){
262 const char* span = str;
264 if (!match(span,
"-") || !match(span,
name) || !match(span,
"="))
268 int64_t tmp = strtoll(span, &end, 10);
272 else if (tmp >
range.end){
273 fprintf(stderr,
"ERROR! value <%s> is too large for option \"%s\".\n", span,
name);
275 }
else if (tmp <
range.begin){
276 fprintf(stderr,
"ERROR! value <%s> is too small for option \"%s\".\n", span,
name);
284 virtual void help (
bool verbose =
false){
286 if (
range.begin == INT64_MIN)
287 fprintf(stderr,
"imin");
289 fprintf(stderr,
"%4d", (
int)
range.begin);
291 fprintf(stderr,
" .. ");
292 if (
range.end == INT64_MAX)
293 fprintf(stderr,
"imax");
295 fprintf(stderr,
"%4d", (
int)
range.end);
297 fprintf(stderr,
"] (default: %d)\n", (
int)
value);
300 fprintf(stderr,
"\n");
314 StringOption(
const char* c,
const char* n,
const char* d,
const char* def = NULL)
315 :
Option(n, d, c,
"<string>"), value(def) {}
317 operator const char* (void)
const {
return value; }
318 operator const char*& (void) {
return value; }
321 virtual bool parse(
const char* str){
322 const char* span = str;
324 if (!match(span,
"-") || !match(span,
name) || !match(span,
"="))
331 virtual void help (
bool verbose =
false){
335 fprintf(stderr,
"\n");
350 BoolOption(
const char* c,
const char* n,
const char* d,
bool v)
351 :
Option(n, d, c,
"<bool>"), value(v) {}
353 operator bool (
void)
const {
return value; }
354 operator bool& (void) {
return value; }
357 virtual bool parse(
const char* str){
358 const char* span = str;
360 if (match(span,
"-")){
361 bool b = !match(span,
"no-");
371 virtual void help (
bool verbose =
false){
373 fprintf(stderr,
" -%s, -no-%s",
name,
name);
376 fprintf(stderr,
" ");
378 fprintf(stderr,
" ");
379 fprintf(stderr,
"(default: %s)\n", value ?
"on" :
"off");
382 fprintf(stderr,
"\n");
#define ABC_NAMESPACE_CXX_HEADER_START
#define ABC_NAMESPACE_CXX_HEADER_END
BoolOption(const char *c, const char *n, const char *d, bool v)
BoolOption & operator=(bool b)
virtual void help(bool verbose=false)
virtual bool parse(const char *str)
virtual bool parse(const char *str)
virtual void help(bool verbose=false)
DoubleOption & operator=(double x)
DoubleOption(const char *c, const char *n, const char *d, double def=double(), DoubleRange r=DoubleRange(-HUGE_VAL, false, HUGE_VAL, false))
Int64Option & operator=(int64_t x)
virtual void help(bool verbose=false)
virtual bool parse(const char *str)
Int64Option(const char *c, const char *n, const char *d, int64_t def=int64_t(), Int64Range r=Int64Range(INT64_MIN, INT64_MAX))
virtual bool parse(const char *str)
IntOption & operator=(int32_t x)
virtual void help(bool verbose=false)
IntOption(const char *c, const char *n, const char *d, int32_t def=int32_t(), IntRange r=IntRange(INT32_MIN, INT32_MAX))
Option(const char *name_, const char *desc_, const char *cate_, const char *type_)
virtual void help(bool verbose=false)=0
friend void printUsageAndExit(int argc, char **argv, bool verbose)
friend void parseOptions(int &argc, char **argv, bool strict)
static vec< Option * > & getOptionList()
static const char *& getUsageString()
virtual bool parse(const char *str)=0
static const char *& getHelpPrefixString()
friend void setHelpPrefixStr(const char *str)
friend void setUsageHelp(const char *str)
virtual void help(bool verbose=false)
virtual bool parse(const char *str)
StringOption & operator=(const char *x)
StringOption(const char *c, const char *n, const char *d, const char *def=NULL)
void printUsageAndExit(int argc, char **argv, bool verbose=false)
void setHelpPrefixStr(const char *str)
void parseOptions(int &argc, char **argv, bool strict=false)
void setUsageHelp(const char *str)
DoubleRange(double b, bool binc, double e, bool einc)
Int64Range(int64_t b, int64_t e)
bool operator()(const Option *x, const Option *y)