42 #ifndef TEUCHOS_TABULAR_OUTPUTTER_HPP 
   43 #define TEUCHOS_TABULAR_OUTPUTTER_HPP 
   46 #include "Teuchos_FancyOStream.hpp" 
   48 #include "Teuchos_Tuple.hpp" 
   51 #include "Teuchos_Exceptions.hpp" 
   69   enum { numFieldTypes = 3 };
 
   73   enum { numFieldJustifications = 2 };
 
   77   enum { numFloatingOutputTypes = 2 };
 
  107   void pushFieldSpec( 
const std::string &fieldName,
 
  118   void setFieldTypePrecision( 
const EFieldType fieldType, 
const int prec );
 
  125   void outputField( 
const T& t );
 
  128   void nextRow(
const bool allowRemainingFields = 
false);
 
  135     FieldSpec(std::string fieldName_in, 
EFieldType fieldType_in,
 
  138       const int outputWidth_in
 
  140       :fieldName(fieldName_in), fieldType(fieldType_in),
 
  141        fieldJustification(fieldJustification_in),
 
  142        floatingOutputType(floatingOutputType_in),
 
  143        outputWidth(outputWidth_in),
 
  146     std::string fieldName;
 
  147     EFieldType fieldType;
 
  148     EFieldJustification fieldJustification;
 
  149     EFloatingOutputType floatingOutputType;
 
  156   static const std::string fieldSpacer_;
 
  160 #pragma warning(push) 
  161 #pragma warning(disable:4251) 
  163   Array<FieldSpec> fieldSpecs_;
 
  164   RCP<FancyOStream> out_;
 
  165   Tuple<int,numFieldTypes> fieldTypePrecision_;
 
  179   double adjustTime( 
const double &time_in )
 
  181       return ( time_in > 0.0 ? time_in : -1.0 );
 
  186   void startTimer(
const int numLoops)
 
  190       numLoops_ = numLoops;
 
  199       const double relTime =
 
  200         adjustTime(timer_.totalElapsedTime()) / numLoops_;
 
  214 #define TEUCHOS_START_PERF_OUTPUT_TIMER(OUTPUTTER, NUMLOOPS) \ 
  215   (OUTPUTTER).startTimer(NUMLOOPS); \ 
  216   for ( int k = 0; k < (NUMLOOPS); ++k ) 
  220 #define TEUCHOS_START_PERF_OUTPUT_TIMER_INNERLOOP(OUTPUTTER, NUMLOOPS, NUMINNERLOOPS) \ 
  221   (OUTPUTTER).startTimer((NUMLOOPS)*(NUMINNERLOOPS)); \ 
  222   for ( int k = 0; k < (NUMLOOPS); ++k ) 
  226 #define TEUCHOS_START_PERF_OUTPUT_TIMER_INNERLOOP(OUTPUTTER, NUMLOOPS, NUMINNERLOOPS) \ 
  227   (OUTPUTTER).startTimer((NUMLOOPS)*(NUMINNERLOOPS)); \ 
  228   for ( int k = 0; k < (NUMLOOPS); ++k ) 
  234 #define TEUCHOS_END_PERF_OUTPUT_TIMER(OUTPUTTER, VARNAME) \ 
  235   const double VARNAME = (OUTPUTTER).stopTimer(); \ 
  236   (OUTPUTTER).outputField(VARNAME) 
  254     "Error, you can not output a field until you print the header with" 
  258     !(currFieldIdx_ < as<int>(fieldSpecs_.
size())),
 
  260     "Error, you have already output all of the " 
  261     << fieldSpecs_.
size() << 
" fields for this tabular output." 
  262     "  You must call nextRow() before outputting to the next row." 
  266   FieldSpec &fieldSpec = fieldSpecs_[currFieldIdx_];
 
  268   *out_ << fieldSpacer_ << std::setprecision(fieldSpec.precision);
 
  270   switch(fieldSpec.fieldJustification) {
 
  282   switch(fieldSpec.floatingOutputType) {
 
  284       *out_ << std::scientific;
 
  294   *out_ << setw(fieldSpec.outputWidth) << t;
 
  305 #endif // TEUCHOS_TABULAR_OUTPUTTER_HPP 
void outputField(const T &t)
Output to the next field. 
Basic wall-clock timer class. 
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
Macro for throwing an exception with breakpointing to ease debugging. 
Utility class that makes it easy to create formatted tables of output. 
Templated array class derived from the STL std::vector. 
Base exception class for Teuchos. 
Reference-counted pointer class and non-member templated function implementations. 
#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...