10 #ifndef TEUCHOS_FANCY_O_STREAM_HPP
11 #define TEUCHOS_FANCY_O_STREAM_HPP
30 template<
typename CharT,
typename Traits>
40 typedef typename traits_type::int_type
int_type;
42 typedef typename traits_type::pos_type
pos_type;
44 typedef typename traits_type::off_type
off_type;
48 const RCP<std::basic_ostream<char_type,traits_type> > &oStream
49 ,
const std::basic_string<char_type,traits_type> &tabIndentStr
50 ,
const int startingTab
51 ,
const bool showLinePrefix
52 ,
const int maxLenLinePrefix
53 ,
const bool showTabCount
54 ,
const bool showProcRank
59 const RCP<std::basic_ostream<char_type,traits_type> > &oStream
60 ,
const std::basic_string<char_type,traits_type> &tabIndentStr
61 ,
const int startingTab
62 ,
const bool showLinePrefix
63 ,
const int maxLenLinePrefix
64 ,
const bool showTabCount
65 ,
const bool showProcRank
72 void setTabIndentStr(
const std::basic_string<char_type,traits_type> &tabIndentStr);
75 const std::basic_string<char_type,traits_type>&
getTabIndentStr()
const;
164 const std::basic_string<char_type,traits_type> &linePrefix
190 #ifdef TEUCHOS_FANCY_OSTREAM_SHOW_ALL_CALLS
192 void imbue(
const locale& l)
194 std::cerr <<
"\ncalled imbue()\n";
195 std::basic_streambuf<CharT,Traits>::imbue(l);
198 basic_streambuf<char_type,Traits>*
201 std::cerr <<
"\ncalled setbuf()\n";
202 return std::basic_streambuf<CharT,Traits>::setbuf(s,n);
206 seekoff(
off_type a, ios_base::seekdir b,ios_base::openmode c)
208 std::cerr <<
"\ncalled seekoff()\n";
209 return std::basic_streambuf<CharT,Traits>::seekoff(a,b,c);
213 seekpos(
pos_type a, ios_base::openmode b)
215 std::cerr <<
"\ncalled seekpos()\n";
216 return std::basic_streambuf<CharT,Traits>::seekpos(a,b);
222 std::cerr <<
"\ncalled sync()\n";
223 return std::basic_streambuf<CharT,Traits>::sync();
229 std::cerr <<
"\ncalled showmanyc()\n";
230 return std::basic_streambuf<CharT,Traits>::showmanyc();
236 std::cerr <<
"\ncalled xsgetn()\n";
237 return std::basic_streambuf<CharT,Traits>::xsgetn(s,n);
243 std::cerr <<
"\ncalled underflow()\n";
244 return std::basic_streambuf<CharT,Traits>::underflow();
250 std::cerr <<
"\ncalled uflow()\n";
251 return std::basic_streambuf<CharT,Traits>::uflow();
255 pbackfail(
int_type c = traits_type::eof())
257 std::cerr <<
"\ncalled pbackfail()\n";
258 return std::basic_streambuf<CharT,Traits>::pbackfail(c);
261 #endif // TEUCHOS_FANCY_OSTREAM_SHOW_ALL_CALLS
270 typedef std::basic_string<char_type,traits_type>
string_t;
348 template <
typename CharT,
typename Traits = std::
char_traits<CharT> >
371 typedef std::basic_ostream<char_type, traits_type>
ostream_t;
409 const RCP< std::basic_ostream<char_type,traits_type> > &oStream
410 ,
const std::basic_string<char_type,traits_type> &tabIndentStr =
" "
411 ,
const int startingTab = 0
412 ,
const bool showLinePrefix =
false
413 ,
const int maxLenLinePrefix = 10
414 ,
const bool showTabCount =
false
415 ,
const bool showProcRank =
false
422 const RCP< std::basic_ostream<char_type,traits_type> > &oStream
423 ,
const std::basic_string<char_type,traits_type> &tabIndentStr =
" "
424 ,
const int startingTab = 0
425 ,
const bool showLinePrefix =
false
426 ,
const int maxLenLinePrefix = 10
427 ,
const bool showTabCount =
false
428 ,
const bool showProcRank =
false
436 const std::basic_string<char_type,traits_type> &tabIndentStr
440 const std::basic_string<char_type,traits_type>&
getTabIndentStr()
const;
513 void pushTab(
const int tabs = 1);
528 void pushLinePrefix(
const std::basic_string<char_type,traits_type> &linePrefix);
566 const RCP< std::basic_ostream<char> >& oStream,
567 const std::basic_string<char>& tabIndentStr =
" ",
568 const int startingTab = 0,
569 const bool showLinePrefix =
false,
570 const int maxLenLinePrefix = 10,
571 const bool showTabCount =
false,
572 const bool showProcRank =
false
578 oStream,tabIndentStr,startingTab,showLinePrefix,
579 maxLenLinePrefix,showTabCount,showProcRank
620 template <
typename CharT,
typename Traits = std::
char_traits<CharT> >
631 ,
const std::basic_string<CharT,Traits> linePrefix =
""
641 const RCP<std::basic_ostream<CharT,Traits> > &oStream
643 ,
const std::basic_string<CharT,Traits> linePrefix =
""
655 ,
const std::basic_string<CharT,Traits> linePrefix =
""
665 std::basic_ostream<CharT,Traits> &oStream
667 ,
const std::basic_string<CharT,Traits> linePrefix =
""
757 template <
typename CharT,
typename Traits>
758 RCP<basic_FancyOStream<CharT,Traits> >
762 const std::basic_string<CharT,Traits> linePrefix =
""
794 template <
typename CharT,
typename Traits>
797 const RCP<std::basic_ostream<CharT,Traits> > &out
799 ,
const std::basic_string<CharT,Traits> linePrefix =
""
802 return tab(getFancyOStream(out),tabs,linePrefix);
825 #define TEUCHOS_OSTAB ::Teuchos::OSTab __localThisTab = this->getOSTab()
830 #define TEUCHOS_OSTAB_DIFF( DIFF ) ::Teuchos::OSTab DIFF ## __localThisTab = this->getOSTab()
842 template<
typename CharT,
typename Traits>
844 const RCP<std::basic_ostream<char_type,traits_type> > &oStream
845 ,
const std::basic_string<char_type,traits_type> &tabIndentStr
846 ,
const int startingTab
847 ,
const bool showLinePrefix
848 ,
const int maxLenLinePrefix
849 ,
const bool showTabCount
850 ,
const bool showProcRank
853 this->initialize(oStream,tabIndentStr,startingTab,showLinePrefix,
854 maxLenLinePrefix,showTabCount,showProcRank);
858 template<
typename CharT,
typename Traits>
860 const RCP<std::basic_ostream<char_type,traits_type> > &oStream
861 ,
const std::basic_string<char_type,traits_type> &tabIndentStr
862 ,
const int startingTab
863 ,
const bool showLinePrefix
864 ,
const int maxLenLinePrefix
865 ,
const bool showTabCount
866 ,
const bool showProcRank
869 oStreamSet_ = oStream;
871 tabIndentStr_ = tabIndentStr;
872 showLinePrefix_ = showLinePrefix;
873 maxLenLinePrefix_ = maxLenLinePrefix;
874 showTabCount_ = showTabCount;
875 showProcRank_ = showProcRank;
879 rankPrintWidth_ = int(std::log10(
float(numProcs_)))+1;
880 tabIndent_ = startingTab;
881 tabIndentStack_.clear();
882 linePrefixStack_.clear();
883 wroteNewline_ =
true;
884 enableTabbingStack_ = 0;
888 template<
typename CharT,
typename Traits>
896 template<
typename CharT,
typename Traits>
898 const std::basic_string<char_type,traits_type> &tabIndentStr
901 tabIndentStr_ = tabIndentStr;
905 template<
typename CharT,
typename Traits>
906 const std::basic_string<CharT,Traits>&
909 return tabIndentStr_;
913 template<
typename CharT,
typename Traits>
916 showLinePrefix_ = showLinePrefix;
920 template<
typename CharT,
typename Traits>
923 return showLinePrefix_;
927 template<
typename CharT,
typename Traits>
931 maxLenLinePrefix_ = maxLenLinePrefix;
935 template<
typename CharT,
typename Traits>
938 return maxLenLinePrefix_;
942 template<
typename CharT,
typename Traits>
945 showTabCount_ = showTabCount;
949 template<
typename CharT,
typename Traits>
952 return showTabCount_;
956 template<
typename CharT,
typename Traits>
959 showProcRank_ = showProcRank;
963 template<
typename CharT,
typename Traits>
966 return showProcRank_;
970 template<
typename CharT,
typename Traits>
972 const int procRank,
const int numProcs
975 procRank_ = procRank;
976 numProcs_ = numProcs;
980 template<
typename CharT,
typename Traits>
987 template<
typename CharT,
typename Traits>
994 template<
typename CharT,
typename Traits>
999 rootRank_ = rootRank;
1001 if(rootRank == procRank_)
1002 oStream_ = oStreamSet_;
1010 oStream_ = oStreamSet_;
1013 lineOut_ =
rcp(
new std::ostringstream());
1018 template<
typename CharT,
typename Traits>
1025 template<
typename CharT,
typename Traits>
1028 if( tabIndent_ + tabs < 0 ) {
1029 tabIndentStack_.push_back(-tabIndent_);
1033 tabIndentStack_.push_back(tabs);
1039 template<
typename CharT,
typename Traits>
1046 template<
typename CharT,
typename Traits>
1049 tabIndent_ -= tabIndentStack_.back();
1050 tabIndentStack_.pop_back();
1054 template<
typename CharT,
typename Traits>
1056 const std::basic_string<char_type,traits_type> &linePrefix
1059 linePrefixStack_.push_back(linePrefix);
1063 template<
typename CharT,
typename Traits>
1066 linePrefixStack_.pop_back();
1070 template<
typename CharT,
typename Traits>
1071 const std::basic_string<CharT,Traits>&
1074 return linePrefixStack_.back();
1078 template<
typename CharT,
typename Traits>
1081 ++enableTabbingStack_;
1085 template<
typename CharT,
typename Traits>
1088 --enableTabbingStack_;
1095 template<
typename CharT,
typename Traits>
1100 #ifdef TEUCHOS_FANCY_OSTREAM_SHOW_ALL_CALLS
1101 std::cerr <<
"\ncalled xsputn()\n";
1108 template<
typename CharT,
typename Traits>
1112 #ifdef TEUCHOS_FANCY_OSTREAM_SHOW_ALL_CALLS
1113 std::cerr <<
"\ncalled overflow()\n";
1115 if(c != traits_type::eof()) {
1116 const char_type cc[] = { traits_type::to_char_type(c) };
1117 this->writeChars(cc,1);
1119 return traits_type::not_eof(c);
1127 template<
typename CharT,
typename Traits>
1136 template<
typename CharT,
typename Traits>
1142 std::streamsize p = 0, first_p = 0;
1143 bool done_outputting =
false;
1145 while( !done_outputting ) {
1147 for( p = first_p; p <
n; ++p ) {
1148 if(s[p] == newline) {
1155 done_outputting =
true;
1157 else if( p == n-1 && s[p] == newline ) {
1159 done_outputting =
true;
1164 wroteNewline_ =
false;
1167 out().write(s+first_p,p-first_p+1);
1168 if(s[p] == newline) {
1169 wroteNewline_ =
true;
1170 if(lineOut_.get()) {
1171 *oStream_ << lineOut_->str() << std::flush;
1176 if(!done_outputting)
1182 template<
typename CharT,
typename Traits>
1185 bool didOutput =
false;
1186 std::ostream &o = this->out();
1188 o <<
"p=" << std::right << std::setw(rankPrintWidth_) << procRank_;
1191 if(showLinePrefix_) {
1194 std::string currLinePrefix =
"";
1195 if ( linePrefixStack_.size() )
1196 currLinePrefix = this->getTopLinePrefix();
1197 const int localMaxLenLinePrefix =
1198 TEUCHOS_MAX( as<int>(currLinePrefix.length()), maxLenLinePrefix_ );
1199 o << std::left << std::setw(localMaxLenLinePrefix);
1200 o << currLinePrefix;
1206 o <<
"tabs=" << std::right << std::setw(2) << tabIndent_;
1213 o <<
" |" << tabIndentStr_;
1215 if(enableTabbingStack_==0) {
1216 for(
int i = 0; i < tabIndent_; ++i )
1227 template<
typename CharT,
typename Traits>
1229 const RCP< std::basic_ostream<char_type,traits_type> > &oStream
1230 ,
const std::basic_string<char_type,traits_type> &tabIndentStr
1231 ,
const int startingTab
1232 ,
const bool showLinePrefix
1233 ,
const int maxLenLinePrefix
1234 ,
const bool showTabCount
1235 ,
const bool showProcRank
1238 streambuf_(oStream,tabIndentStr,startingTab,showLinePrefix,
1239 maxLenLinePrefix,showTabCount,showProcRank)
1245 template<
typename CharT,
typename Traits>
1247 const RCP< std::basic_ostream<char_type,traits_type> > &oStream
1248 ,
const std::basic_string<char_type,traits_type> &tabIndentStr
1249 ,
const int startingTab
1250 ,
const bool showLinePrefix
1251 ,
const int maxLenLinePrefix
1252 ,
const bool showTabCount
1253 ,
const bool showProcRank
1256 streambuf_.initialize(oStream,tabIndentStr,startingTab,
1257 showLinePrefix,maxLenLinePrefix,showTabCount,showProcRank);
1258 this->init(&streambuf_);
1262 template<
typename CharT,
typename Traits>
1266 return streambuf_.getOStream();
1270 template<
typename CharT,
typename Traits>
1273 const std::basic_string<char_type,traits_type> &tabIndentStr
1281 template<
typename CharT,
typename Traits>
1282 const std::basic_string<CharT,Traits>&
1285 return streambuf_.getTabIndentStr();
1289 template<
typename CharT,
typename Traits>
1292 const bool showAllFrontMatter
1302 template<
typename CharT,
typename Traits>
1311 template<
typename CharT,
typename Traits>
1320 template<
typename CharT,
typename Traits>
1329 template<
typename CharT,
typename Traits>
1338 template<
typename CharT,
typename Traits>
1347 template<
typename CharT,
typename Traits>
1356 template<
typename CharT,
typename Traits>
1359 return streambuf_.getOutputToRootOnly();
1363 template<
typename CharT,
typename Traits>
1368 streambuf_.setShowLinePrefix(oStream.
streambuf_.getShowLinePrefix());
1369 streambuf_.setMaxLenLinePrefix(oStream.
streambuf_.getMaxLenLinePrefix());
1370 streambuf_.setShowTabCount(oStream.
streambuf_.getShowTabCount());
1371 streambuf_.setShowProcRank(oStream.
streambuf_.getShowProcRank());
1372 streambuf_.setProcRankAndSize(oStream.
streambuf_.getProcRank(),
1374 streambuf_.setOutputToRootOnly(oStream.
streambuf_.getOutputToRootOnly());
1378 template<
typename CharT,
typename Traits>
1381 streambuf_.pushTab(tabs);
1385 template<
typename CharT,
typename Traits>
1388 return streambuf_.getNumCurrTabs();
1392 template<
typename CharT,
typename Traits>
1395 streambuf_.popTab();
1399 template<
typename CharT,
typename Traits>
1401 const std::basic_string<char_type,traits_type> &linePrefix
1404 streambuf_.pushLinePrefix(linePrefix);
1408 template<
typename CharT,
typename Traits>
1411 streambuf_.popLinePrefix();
1415 template<
typename CharT,
typename Traits>
1416 const std::basic_string<CharT,Traits>&
1419 return streambuf_.getTopLinePrefix();
1423 template<
typename CharT,
typename Traits>
1426 streambuf_.pushDisableTabbing();
1430 template<
typename CharT,
typename Traits>
1433 return streambuf_.popDisableTabbing();
1440 #endif // TEUCHOS_FANCY_O_STREAM_HPP
int getNumProcs() const
Get the number of processes in the communicator.
basic_FancyOStream & setProcRankAndSize(const int procRank, const int numProcs)
Set the (MPI) process rank and the number of processes in the communicator.
void writeChars(const char_type s[], std::streamsize n)
static int getRank()
The rank of the calling process in MPI_COMM_WORLD.
basic_FancyOStream & setShowLinePrefix(const bool showLinePrefix)
int getProcRank() const
Get the rank of the calling (MPI) process.
bool getShowLinePrefix() const
RCP< std::ostringstream > lineOut_
static int getNProc()
The number of processes in MPI_COMM_WORLD.
std::deque< int > tabIndentStack_t
const std::basic_string< char_type, traits_type > & getTabIndentStr() const
RCP< basic_FancyOStream< char > > fancyOStream(const RCP< std::basic_ostream< char > > &oStream, const std::basic_string< char > &tabIndentStr=" ", const int startingTab=0, const bool showLinePrefix=false, const int maxLenLinePrefix=10, const bool showTabCount=false, const bool showProcRank=false)
Dynamically allocate a FancyOStream and return it wrapped in an RCP object.
basic_FancyOStream & setMaxLenLinePrefix(const int maxLenLinePrefix)
basic_OSTab(const RCP< std::basic_ostream< CharT, Traits > > &oStream, const int tabs=1, const std::basic_string< CharT, Traits > linePrefix="")
basic_FancyOStream & setShowProcRank(const bool showProcRank)
Stream buffering class that performs the magic of indenting data sent to an std::ostream object...
const std::basic_string< char_type, traits_type > & getTopLinePrefix() const
basic_FancyOStream< CharT, Traits > & o() const
bool nonnull(const std::shared_ptr< T > &p)
Returns true if p.get()!=NULL.
bool is_null(const std::shared_ptr< T > &p)
Returns true if p.get()==NULL.
std::basic_ostream< char_type, traits_type > ostream_t
linePrefixStack_t linePrefixStack_
void initialize(const RCP< std::basic_ostream< char_type, traits_type > > &oStream, const std::basic_string< char_type, traits_type > &tabIndentStr, const int startingTab, const bool showLinePrefix, const int maxLenLinePrefix, const bool showTabCount, const bool showProcRank)
void setOutputToRootOnly(const int rootRank)
Set the stream to print only on the (MPI) process with the given rank.
void setShowProcRank(const bool showProcRank)
static const int DISABLE_TABBING
basic_OSTab< CharT, Traits > & incrTab(const int tabs=1)
void setTabIndentStr(const std::basic_string< char_type, traits_type > &tabIndentStr)
RCP< basic_FancyOStream< CharT, Traits > > fancyOStream_
void pushTab(const int tabs=1)
Push one or more tabs.
void initialize(const RCP< std::basic_ostream< char_type, traits_type > > &oStream, const std::basic_string< char_type, traits_type > &tabIndentStr=" ", const int startingTab=0, const bool showLinePrefix=false, const int maxLenLinePrefix=10, const bool showTabCount=false, const bool showProcRank=false)
Initialize the output stream.
Tabbing class for helping to create formated, indented output for a basic_FancyOStream object...
basic_FancyOStream< CharT, Traits > operator=(const basic_FancyOStream< CharT, Traits > &)
basic_OSTab< char > OSTab
std::basic_string< char_type, traits_type > tabIndentStr_
basic_OSTab(basic_FancyOStream< CharT, Traits > &fancyOStream, const int tabs=1, const std::basic_string< CharT, Traits > linePrefix="")
Warning: Only call this constructor for stack-based object.
void pushLinePrefix(const std::basic_string< char_type, traits_type > &linePrefix)
traits_type::int_type int_type
basic_FancyOStream & setShowTabCount(const bool showTabCount)
bool getShowProcRank() const
const std::basic_string< char_type, traits_type > & getTabIndentStr() const
Get the tab indent string.
void pushDisableTabbing()
traits_type::off_type off_type
int getNumCurrTabs() const
traits_type::off_type off_type
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
Deprecated.
void pushTab(const int tabs)
Push one or more tabs.
std::ostream subclass that performs the magic of indenting data sent to an std::ostream object among ...
int_type overflow(int_type c)
basic_OSTab< CharT, Traits > & operator=(const basic_OSTab &osTab)
traits_type::pos_type pos_type
void popTab()
Pop the current tab.
void setShowTabCount(const bool showTabCount)
void popTab()
Pop the current tab.
void setShowLinePrefix(const bool showLinePrefix)
#define TEUCHOS_MAX(x, y)
basic_FancyOStream & setShowAllFrontMatter(const bool showAllFrontMatter)
Control whether this stream prints "front matter.".
basic_FancyOStream & setOutputToRootOnly(const int rootRank)
Set the stream to print only on the (MPI) process with the given rank.
int getOutputToRootOnly() const
basic_FancyOStream_buf< CharT, Traits > streambuf_t
bool getShowTabCount() const
std::deque< string_t > linePrefixStack_t
int getOutputToRootOnly() const
int getNumCurrTabs() const
basic_FancyOStream & setTabIndentStr(const std::basic_string< char_type, traits_type > &tabIndentStr)
Set the tab indent string.
RCP< std::basic_ostream< char_type, traits_type > > getOStream()
traits_type::pos_type pos_type
basic_FancyOStream< char > FancyOStream
std::streamsize xsputn(const char_type *s, std::streamsize n)
basic_OSTab(std::basic_ostream< CharT, Traits > &oStream, const int tabs=1, const std::basic_string< CharT, Traits > linePrefix="")
Warning: Only call this constructor for stack-based object.
basic_FancyOStream_buf< CharT, Traits > operator=(const basic_FancyOStream_buf< CharT, Traits > &)
RCP< std::basic_ostream< char_type, traits_type > > getOStream()
Get the output stream this object wraps.
int getMaxLenLinePrefix() const
void pushDisableTabbing()
A MPI utilities class, providing methods for initializing, finalizing, and querying the global MPI se...
std::basic_string< char_type, traits_type > string_t
void setMaxLenLinePrefix(const int maxLenLinePrefix)
RCP< std::basic_ostream< char_type, traits_type > > oStreamSet_
RCP< basic_FancyOStream< char > > getFancyOStream(const RCP< std::basic_ostream< char > > &out)
Get a FancyOStream from an std::ostream object.
RCP< std::basic_ostream< char_type, traits_type > > oStream_
RCP< basic_FancyOStream< CharT, Traits > > tab(const RCP< std::basic_ostream< CharT, Traits > > &out, const int tabs=1, const std::basic_string< CharT, Traits > linePrefix="")
Create a tab for an RCP-wrapped std:: std::ostream object to cause the indentation of all output auto...
basic_OSTab(const RCP< basic_FancyOStream< CharT, Traits > > &fancyOStream, const int tabs=1, const std::basic_string< CharT, Traits > linePrefix="")
std::basic_string< CharT, Traits > linePrefix_
Smart reference counting pointer class for automatic garbage collection.
void copyAllOutputOptions(const basic_FancyOStream< CharT, Traits > &oStream)
traits_type::int_type int_type
void pushLinePrefix(const std::basic_string< char_type, traits_type > &linePrefix)
RCP< basic_FancyOStream< CharT, Traits > > tab(const RCP< basic_FancyOStream< CharT, Traits > > &out, const int tabs=1, const std::basic_string< CharT, Traits > linePrefix="")
Create a tab for an RCP-wrapped basic_FancyOStream object to cause the indentation of all output auto...
const std::basic_string< char_type, traits_type > & getTopLinePrefix() const
Reference-counted pointer class and non-member templated function implementations.
Definition of Teuchos::as, for conversions between types.
basic_oblackholestream< char, std::char_traits< char > > oblackholestream
void setProcRankAndSize(const int procRank, const int numProcs)
Set the (MPI) process rank and the number of processes in the communicator.
#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...
tabIndentStack_t tabIndentStack_
basic_OSTab(const basic_OSTab &osTab)