blob: 5a17a39006e7c68b9317d4e4cec1e24eaf9b6a42 [file] [log] [blame]
//#####################################################################
// Copyright 2004, Eran Guendelman, Geoffrey Irving, Andrew Selle.
// This file is part of PhysBAM whose distribution is governed by the license contained in the accompanying file PHYSBAM_COPYRIGHT.txt.
//#####################################################################
// Class PARSE_ARGS
//#####################################################################
#ifndef __PARSE_ARGS__
#define __PARSE_ARGS__
#include "../Arrays/LIST_ARRAY.h"
#include "../Matrices_And_Vectors/VECTOR_2D.h"
#include "../Matrices_And_Vectors/VECTOR_3D.h"
#include "ARG_DATA.h"
namespace PhysBAM
{
class PARSE_ARGS
{
private:
LIST_ARRAY<ARG_DATA> arg_data_list;
LIST_ARRAY<std::string> extra_arg_list;
int num_expected_extra_args;
std::string extra_args_synopsis, extra_args_desc, program_name;
bool use_help_option;
void (*extra_usage_callback) ();
public:
PARSE_ARGS()
: num_expected_extra_args (0), use_help_option (true), extra_usage_callback (0)
{}
//#####################################################################
void Use_Help_Option (bool use_it);
void Add_Option_Argument (const std::string& arg_str, const std::string& desc = "");
void Add_Integer_Argument (const std::string& arg_str, int default_value, const std::string& val_name = "", const std::string& desc = "");
void Add_Double_Argument (const std::string& arg_str, double default_value, const std::string& val_name = "", const std::string& desc = "");
void Add_Vector2_Argument (const std::string& arg_str, double default_value[2], const std::string& val_name = "", const std::string& desc = "");
void Add_Vector_2D_Argument (const std::string& arg_str, const VECTOR_2D<double>& default_value, const std::string& val_name = "", const std::string& desc = "");
void Add_Vector3_Argument (const std::string& arg_str, double default_value[3], const std::string& val_name = "", const std::string& desc = "");
void Add_Vector_3D_Argument (const std::string& arg_str, const VECTOR_3D<double>& default_value, const std::string& val_name = "", const std::string& desc = "");
void Add_String_Argument (const std::string& arg_str, const std::string& default_value, const std::string& val_name = "", const std::string& desc = "");
void Set_Extra_Arguments (int num, const std::string& synopsis = "", const std::string& desc = "");
void Set_Extra_Usage_Callback (void (*extra_usage_callback_input) ());
int Parse (int argc, char* argv[]);
int Parse (int argc, const char* argv[]); // for backwards compatibility
bool Get_Option_Value (const std::string& arg_str) const;
int Get_Integer_Value (const std::string& arg_str) const;
double Get_Double_Value (const std::string& arg_str) const;
const double* Get_Vector2_Value (const std::string& arg_str) const;
void Get_Vector2_Value (const std::string& arg_str, double* value) const;
VECTOR_2D<double> Get_Vector_2D_Value (const std::string& arg_str) const;
const double* Get_Vector3_Value (const std::string& arg_str) const;
void Get_Vector3_Value (const std::string& arg_str, double* value) const;
VECTOR_3D<double> Get_Vector_3D_Value (const std::string& arg_str) const;
const std::string& Get_String_Value (const std::string& arg_str) const;
bool Is_Value_Set (const std::string& arg_str) const;
int Num_Extra_Args() const;
const std::string& Extra_Arg (int i) const; // 1-based indexing
const std::string& Get_Program_Name() const;
void Print_Usage (bool do_exit = false) const;
int Find_Match (const std::string& str) const;
static bool Find_And_Remove (const char *str, int& argc, char** argv);
//#####################################################################
};
}
#endif