blob: 764f3c9fd106e12f426d385956c2e5d4e65aab5e [file] [log] [blame]
//#####################################################################
// Copyright 2004, Eran Guendelman, Geoffrey Irving, Igor Neverov, Andrew Selle.
// This file is part of PhysBAM whose distribution is governed by the license contained in the accompanying file PHYSBAM_COPYRIGHT.txt.
//#####################################################################
// Class ARG_DATA
//#####################################################################
#ifndef __ARG_DATA__
#define __ARG_DATA__
#include <string>
#include <cstring>
namespace PhysBAM
{
class ARG_DATA
{
public:
enum TYPE {OPTION, INTEGER, DOUBLE, VECTOR2, VECTOR3, STRING};
TYPE type;
std::string str, val_name, desc;
bool boolean_value;
int integer_default, integer_value;
double double_default, double_value;
int vector_dim;
double vector_default[3], vector_value[3];
std::string string_default, string_value;
bool value_set;
ARG_DATA()
{}
ARG_DATA (const std::string& input_str, const std::string& input_desc)
: type (OPTION), boolean_value (false)
{
Initialize (input_str, "", input_desc);
}
ARG_DATA (const std::string& input_str, const std::string& input_val_name, const std::string& input_desc, int default_value)
: type (INTEGER), integer_default (default_value), integer_value (default_value)
{
Initialize (input_str, input_val_name, input_desc, "int");
}
ARG_DATA (const std::string& input_str, const std::string& input_val_name, const std::string& input_desc, double default_value)
: type (DOUBLE), double_default (default_value), double_value (default_value)
{
Initialize (input_str, input_val_name, input_desc, "double");
}
ARG_DATA (const std::string& input_str, const std::string& input_val_name, const std::string& input_desc, double* default_value, int dim)
: vector_dim (dim)
{
type = (dim == 3) ? VECTOR3 : VECTOR2;
memcpy (vector_default, default_value, dim * sizeof (double));
memcpy (vector_value, default_value, dim * sizeof (double));
Initialize (input_str, input_val_name, input_desc, ( (dim == 3) ? "vector3" : "vector2"));
}
ARG_DATA (const std::string& input_str, const std::string& input_val_name, const std::string& input_desc, const std::string& default_value)
: type (STRING), string_default (default_value), string_value (default_value)
{
Initialize (input_str, input_val_name, input_desc, "string");
}
void Initialize (const std::string& input_str, const std::string& input_val_name, const std::string& input_desc, const std::string& default_val_name = "")
{
str = input_str;
value_set = false;
if (input_val_name.length()) val_name = input_val_name;
else if (default_val_name.length()) val_name = default_val_name;
if (!input_desc.length())
{
if (input_val_name.length()) desc = input_val_name;
else desc = "<no description available>";
}
else desc = input_desc;
}
bool Parse_Value (int argc, char* argv[], int& current_arg)
{
switch (type)
{
case OPTION:
boolean_value = true;
current_arg++;
return true;
case INTEGER:
if (current_arg + 1 < argc)
{
integer_value = atoi (argv[current_arg + 1]);
current_arg += 2;
return true;
}
else return false;
case DOUBLE:
if (current_arg + 1 < argc)
{
double_value = atof (argv[current_arg + 1]);
current_arg += 2;
return true;
}
else return false;
case VECTOR2:
if (current_arg + 2 < argc)
{
for (int i = 0; i < 2; i++) vector_value[i] = atof (argv[current_arg + 1 + i]);
current_arg += 3;
return true;
}
else return false;
case VECTOR3:
if (current_arg + 3 < argc)
{
for (int i = 0; i < 3; i++) vector_value[i] = atof (argv[current_arg + 1 + i]);
current_arg += 4;
return true;
}
else return false;
case STRING:
if (current_arg + 1 < argc)
{
string_value = argv[current_arg + 1];
current_arg += 2;
return true;
}
else return false;
}
return false;
}
void Print_Synopsis (std::ostream& os) const
{
if (type == OPTION) os << "[" << str << "]";
else os << "[" << str << " <" << val_name << ">]";
}
void Print_Description (std::ostream& os, int column_width) const
{
os.flags (std::ios::left);
os.width (column_width);
switch (type)
{
case OPTION:
os << str << desc;
break;
case INTEGER:
os << str << desc << " (default " << integer_default << ")";
break;
case DOUBLE:
os << str << desc << " (default " << double_default << ")";
break;
case VECTOR2:
os << str << desc << " (default <" << vector_default[0] << "," << vector_default[1] << ">)";
break;
case VECTOR3:
os << str << desc << " (default <" << vector_default[0] << "," << vector_default[1] << "," << vector_default[2] << ">)";
break;
case STRING:
os << str << desc;
if (string_default.length()) os << " (default " << string_default << ")";
break;
}
}
//#####################################################################
};
}
#endif