60 inline int my_max(
int a,
int b ) {
return a > b ? a : b; }
63 std::string remove_quotes(
const std::string& str )
67 return str.substr(1,str.size()-2);
71 std::string add_quotes(
const std::string& str )
75 return "\"" + str +
"\"";
95 bool throwExceptions_in
96 ,
bool recogniseAllOptions_in
97 ,
bool addOutputSetupOptions_in
99 :throwExceptions_(throwExceptions_in)
100 ,recogniseAllOptions_(recogniseAllOptions_in)
101 ,addOutputSetupOptions_(addOutputSetupOptions_in)
102 ,output_all_front_matter_(output_all_front_matter_default_)
103 ,output_show_line_prefix_(output_show_line_prefix_default_)
104 ,output_show_tab_count_(output_show_tab_count_default_)
105 ,output_show_proc_rank_(output_show_proc_rank_default_)
106 ,output_to_root_rank_only_(output_to_root_rank_only_default_)
107 ,print_rcpnode_statistics_on_exit_(print_rcpnode_statistics_on_exit_default_)
108 ,show_timer_summary_on_exit_(show_timer_summary_on_exit_default_)
109 ,printed_timer_summary_(false)
110 ,added_extra_output_setup_options_(false)
111 ,in_add_extra_output_setup_options_(false)
131 const char option_true[]
132 ,
const char option_false[]
134 ,
const char documentation[]
145 std::string(documentation?documentation:
""),
any(option_val))
151 const char option_name[]
153 ,
const char documentation[]
162 opt_doc_t(
OPT_INT, option_name,
"", std::string(documentation?documentation:
""),
169 const char option_name[]
170 ,
long int *option_val
171 ,
const char documentation[]
187 const char option_name[]
189 ,
const char documentation[]
204 const char option_name[]
205 ,
long long int *option_val
206 ,
const char documentation[]
221 const char option_name[]
223 ,
const char documentation[]
238 const char option_name[]
240 ,
const char documentation[]
255 const char option_name[]
256 ,std::string *option_val
257 ,
const char documentation[]
279 ,std::ostream *errout
283 std::string opt_name;
284 std::string opt_val_str;
285 const std::string echo_cl_opt =
"echo-command-line";
286 const std::string help_opt =
"help";
287 const std::string pause_opt =
"pause-for-debugging";
292 for(
int i = 1; i < argc; ++i ) {
293 bool gov_return =
get_opt_val( argv[i], &opt_name, &opt_val_str );
294 if( gov_return && opt_name == help_opt ) {
300 for(
int i = 1; i < argc; ++i ) {
301 bool gov_return =
get_opt_val( argv[i], &opt_name, &opt_val_str );
311 if( opt_name == echo_cl_opt ) {
312 if(errout && procRank == 0) {
313 *errout <<
"\nEchoing the command-line:\n\n";
314 for(
int j = 0; j < argc; ++j )
315 *errout << argv[j] <<
" ";
320 if( opt_name == pause_opt ) {
324 int rank_pid = getpid();
328 std::cerr <<
"Rank " << k <<
" has PID " << pids[k] << std::endl;
331 std::cerr <<
"\nType 0 and press enter to continue : ";
333 std::cin >> dummy_int;
354 *(any_cast<
bool*>(opt_val_val.
opt_val)) =
true;
357 *(any_cast<
bool*>(opt_val_val.
opt_val)) =
false;
360 *(any_cast<
int*>(opt_val_val.
opt_val)) = asSafe<int> (opt_val_str);
363 *(any_cast<
long int*>(opt_val_val.
opt_val)) = asSafe<long int> (opt_val_str);
366 *(any_cast<
size_t *>(opt_val_val.
opt_val)) = asSafe<size_t> (opt_val_str);
369 *(any_cast<
long long int*>(opt_val_val.
opt_val)) = asSafe<long long int> (opt_val_str);
372 *(any_cast<
double*>(opt_val_val.
opt_val)) = asSafe<double> (opt_val_str);
375 *(any_cast<
float*>(opt_val_val.
opt_val)) = asSafe<float> (opt_val_str);
378 *(any_cast<std::string*>(opt_val_val.
opt_val)) = remove_quotes(opt_val_str);
382 remove_quotes(opt_val_str), errout ) )
400 const std::string &opt_val_name = (*itr).first;
401 #define CLP_ERR_MSG \ 402 "Error, the option --"<<opt_val_name<<" was required but was not set!" 404 *errout << std::endl << argv[0] <<
" : " <<
CLP_ERR_MSG << std::endl;
433 std::ostream &out )
const 441 const int opt_type_w = 14;
442 const char spc_chars[] =
" ";
446 options_documentation_list_t::const_iterator itr;
453 opt_name_w = my_max(opt_name_w,static_cast<int>(itr->opt_name.length()));
455 opt_name_w = my_max(opt_name_w,static_cast<int>(itr->opt_name_false.length()));
461 <<
"Usage: " << program_name <<
" [options]\n" 462 << spc_chars <<
"options:\n" 465 #ifdef HAVE_STD_IOS_BASE_FMTFLAGS 466 << std::left << setw(opt_name_w) <<
"help" 467 << std::left << setw(opt_type_w) <<
" " 469 << std::setiosflags(std::ios::left) << setw(opt_name_w) <<
"help" 470 << std::setiosflags(std::ios::left) << setw(opt_type_w) <<
" " 472 <<
"Prints this help message" 476 #ifdef HAVE_STD_IOS_BASE_FMTFLAGS 477 << std::left << setw(opt_name_w) <<
"pause-for-debugging" 478 << std::left << setw(opt_type_w) <<
" " 480 << std::setiosflags(std::ios::left) << setw(opt_name_w) <<
"pause-for-debugging" 481 << std::setiosflags(std::ios::left) << setw(opt_type_w) <<
" " 483 <<
"Pauses for user input to allow attaching a debugger" 487 #ifdef HAVE_STD_IOS_BASE_FMTFLAGS 488 << std::left << setw(opt_name_w) <<
"echo-command-line" 489 << std::left << setw(opt_type_w) <<
" " 491 << std::setiosflags(std::ios::left) << setw(opt_name_w) <<
"echo-command-line" 492 << std::setiosflags(std::ios::left) << setw(opt_type_w) <<
" " 494 <<
"Echo the command-line but continue as normal" 505 #ifdef HAVE_STD_IOS_BASE_FMTFLAGS 506 << std::left << setw(opt_name_w) << itr->opt_name
507 << std::left << setw(opt_type_w) <<
opt_type_str(itr->opt_type)
509 << std::setiosflags(std::ios::left) << setw(opt_name_w) << itr->opt_name
510 << std::setiosflags(std::ios::left) << setw(opt_type_w) <<
opt_type_str(itr->opt_type)
512 << ( itr->documentation.length() ? itr->documentation.c_str() :
"No documentation" )
519 << setw(opt_name_w) <<
"" 520 << setw(opt_type_w) <<
"";
530 << setw(opt_name_w) << itr->opt_name_false;
536 << setw(opt_name_w) <<
" ";
539 << setw(opt_type_w) <<
" " 541 switch( itr->opt_type ) {
543 out <<
"--" << ( (*(any_cast<
bool*>(itr->default_val))) ?
544 itr->opt_name : itr->opt_name_false );
554 out <<
"--" << itr->opt_name;
559 switch( itr->opt_type ) {
563 out <<
"=" << (*(any_cast<
int*>(itr->default_val)));
566 out <<
"=" << (*(any_cast<
long int*>(itr->default_val)));
569 out <<
"=" << (*(any_cast<
size_t*>(itr->default_val)));
572 out <<
"=" << (*(any_cast<
long long int*>(itr->default_val)));
575 out <<
"=" << (*(any_cast<
double*>(itr->default_val)));
578 out <<
"=" << (*(any_cast<
float*>(itr->default_val)));
581 out <<
"=" << add_quotes(*(any_cast<std::string*>(itr->default_val)));
584 out <<
"=" << add_quotes(
593 out <<
"\nDETAILED DOCUMENTATION:\n\n" <<
doc_string_ << std::endl << std::endl;
608 out = rcpFromPtr(out_inout);
643 ,
"Set if all front matter is printed to the default FancyOStream or not" 647 ,
"Set if the line prefix matter is printed to the default FancyOStream or not" 651 ,
"Set if the tab count is printed to the default FancyOStream or not" 655 ,
"Set if the processor rank is printed to the default FancyOStream or not" 659 ,
"Set which processor (the root) gets the output. If < 0, then all processors get output." 662 "print-rcpnode-statistics-on-exit",
"no-print-rcpnode-statistics-on-exit",
664 "Set if the RCPNode usage statistics will be printed on exit or not. Warning," 665 " this prints to std::cerr or every process so do not turn this on for very large" 671 "If true, then Teuchos::TimeMonitor::summarize() is called in" 672 " CommandLineProcessor's destructor (usually at the end of main)." 682 const char enum_option_name[]
683 ,
int *enum_option_val
684 ,
const int num_enum_opt_values
685 ,
const int enum_opt_values[]
686 ,
const char* enum_opt_names[]
687 ,
const char documentation[]
699 enum_opt_data_t(enum_option_val,num_enum_opt_values,enum_opt_values,enum_opt_names)
706 std::string(documentation?documentation:
""),
any(opt_id))
714 ,
const std::string &enum_opt_name
716 ,
const std::string &enum_str_val
717 ,std::ostream *errout
722 std::vector<std::string>::const_iterator
725 itr = std::find( itr_begin, itr_end, enum_str_val );
726 if( itr == itr_end ) {
727 const int j = argv_i;
728 #define CLP_ERR_MSG \ 729 "Error, the value \"" << enum_str_val << "\" for the " \ 730 << j<<(j==1?"st":(j==2?"nd":(j==3?"rd":"th"))) << " option --" \ 731 << enum_opt_name << " was not recognized (use --help)!" 733 *errout << std::endl << argv[0] <<
" : " <<
CLP_ERR_MSG << std::endl;
742 const int enum_opt_val_index =
static_cast<int>(itr - itr_begin);
755 typedef std::vector<std::string>::const_iterator itr_t;
756 out <<
"Valid options:";
764 out <<
" " << add_quotes(*itr);
771 const std::string &enum_name
773 ,std::ostream *errout
787 const std::string &enum_opt_name
790 ,std::ostream *errout
793 std::vector<int>::const_iterator
796 itr = std::find( itr_begin, itr_end, opt_value );
797 if( itr == itr_end ) {
798 #define CLP_ERR_MSG \ 799 ( recogniseAllOptions() ? "Error" : "Warning" ) \ 800 << ", option --" << enum_opt_name << " was given an invalid " \ 801 "initial option value of " << opt_value << "!" 808 return static_cast<int>(itr - itr_begin);
814 ,std::string *opt_name
815 ,std::string *opt_val_str
818 const int len =
static_cast<int>(std::strlen(str));
821 if( str[0] !=
'-' || str[1] !=
'-' )
825 for( equ_i = 2; equ_i < len && str[equ_i] !=
'='; ++equ_i );
827 opt_name->assign( str + 2, equ_i-2 );
833 opt_val_str->assign( str + equ_i + 1, len - equ_i - 1 );
841 ,std::ostream *errout
844 const int j = argv_i;
845 #define CLP_ERR_MSG \ 846 ( recogniseAllOptions() ? "Error" : "Warning" ) \ 847 << ", the " << j<<(j==1?"st":(j==2?"nd":(j==3?"rd":"th"))) \ 848 << " option \'" << argv[argv_i] << "\' was not recognized (use --help)!" 850 *errout << std::endl << argv[0] <<
" : " <<
CLP_ERR_MSG << std::endl;
878 return timeMonitorSurrogate;
bool output_show_proc_rank_
static const bool output_all_front_matter_default_
static int getRank()
The rank of the calling process in MPI_COMM_WORLD.
Thrown if –help was specified and throwExceptions==true.
int output_to_root_rank_only_
void setEnumOption(const char enum_option_name[], int *enum_option_val, const int num_enum_opt_values, const int enum_opt_values[], const char *enum_opt_names[], const char documentation[], const bool required)
static int getNProc()
The number of processes in MPI_COMM_WORLD.
static const bool show_timer_summary_on_exit_default_
int find_enum_opt_index(const std::string &enum_opt_name, const int opt_value, const enum_opt_data_t &enum_data, std::ostream *errout) const
std::string opt_type_str(EOptType) const
bool nonnull(const std::shared_ptr< T > &p)
Returns true if p.get()!=NULL.
bool in_add_extra_output_setup_options_
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
Macro for throwing an exception with breakpointing to ease debugging.
bool recogniseAllOptions() const
Returns true if all options must be recognized by the parser.
static void setPrintRCPNodeStatisticsOnExit(bool printRCPNodeStatisticsOnExit)
Set if RCPNode usage statistics will be printed when the program ends or not.
CommandLineProcessor(bool throwExceptions=true, bool recogniseAllOptions=true, bool addOutputSetupOptions=false)
Default Constructor.
Modified boost::any class, which is a container for a templated value.
T * get() const
Get the raw C++ pointer to the underlying object.
enum_opt_data_list_t enum_opt_data_list_
~CommandLineProcessor()
Destructor.
static void setTimeMonitorSurrogate(const RCP< TimeMonitorSurrogate > &timeMonitorSurrogate)
Thrown if an unrecognized option was found and throwExceptions==true.
options_documentation_list_t options_documentation_list_
static const bool output_show_tab_count_default_
static const bool output_show_proc_rank_default_
static const bool output_show_line_prefix_default_
void setOption(const char option_true[], const char option_false[], bool *option_val, const char documentation[]=NULL)
Set a boolean option.
static const int output_to_root_rank_only_default_
bool get_opt_val(const char str[], std::string *opt_name, std::string *opt_val_str) const
EParseCommandLineReturn parse(int argc, char *argv[], std::ostream *errout=&std::cerr) const
Parse a command line.
static RCP< FancyOStream > getDefaultOStream()
Get the default output stream object.
bool output_show_tab_count_
bool output_all_front_matter_
static RCP< TimeMonitorSurrogate > getTimeMonitorSurrogate()
void print_bad_opt(int argv_i, char *argv[], std::ostream *errout) const
bool set_enum_value(int argv_i, char *argv[], const std::string &enum_opt_name, const int enum_id, const std::string &enum_str_val, std::ostream *errout) const
void resize(size_type new_size, const value_type &x=value_type())
static const bool print_rcpnode_statistics_on_exit_default_
std::string enum_opt_default_val_name(const std::string &enum_name, const int enum_id, std::ostream *errout) const
std::vector< std::string > enum_opt_names
EParseCommandLineReturn
Return value for CommandLineProcessor::parse(). Note: These enums are all given non-negative values s...
Templated array class derived from the STL std::vector.
bool printed_timer_summary_
options_list_t options_list_
bool addOutputSetupOptions_
A MPI utilities class, providing methods for initializing, finalizing, and querying the global MPI se...
bool show_timer_summary_on_exit_
Basic command line parser for input from (argc,argv[])
void setDocString(const char doc_string[])
Set a documentation sting for the entire program printed when –help is specified.
bool throwExceptions() const
Returns true if an std::exception is thrown, there is a parse error, or help is printed.
bool print_rcpnode_statistics_on_exit_
void printHelpMessage(const char program_name[], std::ostream &out) const
Print the help message.
static void barrier()
Call MPI_Barrier() on MPI_COMM_WORLD.
void print_enum_opt_names(const int enum_id, std::ostream &out) const
bool output_show_line_prefix_
static void allGather(int localVal, const ArrayView< int > &allVals)
Global all-to-all of a set of integers across processes.
Smart reference counting pointer class for automatic garbage collection.
void printFinalTimerSummary(const Ptr< std::ostream > &out=null)
Call to print timers so that they don't get printed in the destructor.
static RCP< TimeMonitorSurrogate > & getRawTimeMonitorSurrogate()
void add_extra_output_setup_options() const
bool added_extra_output_setup_options_
Definition of Teuchos::as, for conversions between types.
Thrown if a parse std::exception occurs and throwExceptions==true.
Class that helps parse command line input arguments from (argc,argv[]) and set options.
std::vector< int > enum_opt_values
#define TEUCHOS_TEST_FOR_EXCEPT(throw_exception_test)
This macro is designed to be a short version of TEUCHOS_TEST_FOR_EXCEPTION() that is easier to call...
Simple wrapper class for raw pointers to single objects where no persisting relationship exists...