60inline int my_max(
int a,
int b ) {
return a > b ? a : b; }
63std::string remove_quotes(
const std::string& str )
67 return str.substr(1,str.size()-2);
71std::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;
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;
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 ) {
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;
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;
Templated array class derived from the STL std::vector.
Basic command line parser for input from (argc,argv[])
A MPI utilities class, providing methods for initializing, finalizing, and querying the global MPI se...
Definition of Teuchos::as, for conversions between types.
Replacement for std::vector that is compatible with the Teuchos Memory Management classes.
void resize(size_type new_size, const value_type &x=value_type())
Thrown if –help was specified and throwExceptions==true.
Thrown if a parse std::exception occurs and throwExceptions==true.
Thrown if an unrecognized option was found and throwExceptions==true.
Class that helps parse command line input arguments from (argc,argv[]) and set options.
bool output_show_proc_rank_
bool get_opt_val(const char str[], std::string *opt_name, std::string *opt_val_str) const
static const bool output_all_front_matter_default_
bool output_show_tab_count_
static const bool show_timer_summary_on_exit_default_
void add_extra_output_setup_options() const
bool show_timer_summary_on_exit_
bool throwExceptions() const
Returns true if an std::exception is thrown, there is a parse error, or help is printed.
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)
void setOption(const char option_true[], const char option_false[], bool *option_val, const char documentation[]=NULL)
Set a boolean option.
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
bool output_all_front_matter_
EParseCommandLineReturn
Return value for CommandLineProcessor::parse(). Note: These enums are all given non-negative values s...
@ PARSE_UNRECOGNIZED_OPTION
void print_bad_opt(int argv_i, char *argv[], std::ostream *errout) const
enum_opt_data_list_t enum_opt_data_list_
options_documentation_list_t options_documentation_list_
void print_enum_opt_names(const int enum_id, std::ostream &out) const
int output_to_root_rank_only_
static RCP< TimeMonitorSurrogate > & getRawTimeMonitorSurrogate()
static const bool output_show_line_prefix_default_
static const int output_to_root_rank_only_default_
static const bool output_show_tab_count_default_
std::string enum_opt_default_val_name(const std::string &enum_name, const int enum_id, std::ostream *errout) const
static const bool print_rcpnode_statistics_on_exit_default_
static RCP< TimeMonitorSurrogate > getTimeMonitorSurrogate()
EParseCommandLineReturn parse(int argc, char *argv[], std::ostream *errout=&std::cerr) const
Parse a command line.
bool added_extra_output_setup_options_
void printHelpMessage(const char program_name[], std::ostream &out) const
Print the help message.
void printFinalTimerSummary(const Ptr< std::ostream > &out=null)
Call to print timers so that they don't get printed in the destructor.
static const bool output_show_proc_rank_default_
static void setTimeMonitorSurrogate(const RCP< TimeMonitorSurrogate > &timeMonitorSurrogate)
void setDocString(const char doc_string[])
Set a documentation sting for the entire program printed when –help is specified.
bool addOutputSetupOptions_
~CommandLineProcessor()
Destructor.
bool output_show_line_prefix_
bool printed_timer_summary_
bool print_rcpnode_statistics_on_exit_
options_list_t options_list_
CommandLineProcessor(bool throwExceptions=true, bool recogniseAllOptions=true, bool addOutputSetupOptions=false)
Default Constructor.
std::string opt_type_str(EOptType) const
bool recogniseAllOptions() const
Returns true if all options must be recognized by the parser.
bool in_add_extra_output_setup_options_
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
static void barrier()
Call MPI_Barrier() on MPI_COMM_WORLD.
static int getRank()
The rank of the calling process in MPI_COMM_WORLD.
static int getNProc()
The number of processes in MPI_COMM_WORLD.
static void allGather(int localVal, const ArrayView< int > &allVals)
Global all-to-all of a set of integers across processes.
Simple wrapper class for raw pointers to single objects where no persisting relationship exists.
static void setPrintRCPNodeStatisticsOnExit(bool printRCPNodeStatisticsOnExit)
Set if RCPNode usage statistics will be printed when the program ends or not.
Smart reference counting pointer class for automatic garbage collection.
T * get() const
Get the raw C++ pointer to the underlying object.
static RCP< FancyOStream > getDefaultOStream()
Get the default output stream object.
Modified boost::any class, which is a container for a templated value.
#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.
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
Macro for throwing an exception with breakpointing to ease debugging.
bool nonnull(const std::shared_ptr< T > &p)
Returns true if p.get()!=NULL.
std::vector< std::string > enum_opt_names
std::vector< int > enum_opt_values