00001 /* @HEADER@ */ 00002 // ************************************************************************ 00003 // 00004 // Playa: Programmable Linear Algebra 00005 // Copyright 2012 Sandia Corporation 00006 // 00007 // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, 00008 // the U.S. Government retains certain rights in this software. 00009 // 00010 // Redistribution and use in source and binary forms, with or without 00011 // modification, are permitted provided that the following conditions are 00012 // met: 00013 // 00014 // 1. Redistributions of source code must retain the above copyright 00015 // notice, this list of conditions and the following disclaimer. 00016 // 00017 // 2. Redistributions in binary form must reproduce the above copyright 00018 // notice, this list of conditions and the following disclaimer in the 00019 // documentation and/or other materials provided with the distribution. 00020 // 00021 // 3. Neither the name of the Corporation nor the names of the 00022 // contributors may be used to endorse or promote products derived from 00023 // this software without specific prior written permission. 00024 // 00025 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY 00026 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 00027 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 00028 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE 00029 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 00030 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 00031 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 00032 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 00033 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 00034 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 00035 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00036 // 00037 // Questions? Contact Kevin Long (kevin.long@ttu.edu) 00038 // 00039 00040 /* @HEADER@ */ 00041 00042 #ifndef PLAYA_TABS_H 00043 #define PLAYA_TABS_H 00044 00045 #include "PlayaDefs.hpp" 00046 00047 namespace Playa 00048 { 00049 /** 00050 * Tabbing utility for output. Constructing a new Tabs object automatically 00051 * increments the number of tabs to be written. When the Tabs object goes out 00052 * of scope, the original tabs level is restored. 00053 * 00054 * The tab size and character can be specified through the setTabSize() and 00055 * setTabChar() methods, for example, 00056 * \code 00057 * Tabs::setTabChar('*'); 00058 * Tabs::setTabSize(4); 00059 * \endcode 00060 * The tab character can be set on an object-by-object basis 00061 * through a constructor argument. 00062 * 00063 * By default, a header giving the depth of tabs is written to each line; this 00064 * can simplify scanning by eye for when a given tab level is reached. 00065 * This header can be turned off by calling 00066 * \code 00067 * Tabs::showDepth() = false; 00068 * \endcode 00069 * 00070 * Example: the code 00071 * \code 00072 * void f() 00073 * { 00074 * Tabs tab; 00075 * cout << tab << "in f()" << std::endl; 00076 * g(); 00077 * cout << tab << "leaving f()" << std::endl; 00078 * } 00079 * 00080 * void g() 00081 * { 00082 * Tabs tab0; 00083 * cout << tab0 << "in g()" << std::endl; 00084 * for (int i=0; i<3; i++) 00085 * { 00086 * Tabs tab1(); 00087 * cout << tab1 << "i=" << i << std::endl; 00088 * } 00089 * cout << tab0 << "leaving g()" << std::endl; 00090 * } 00091 * \endcode 00092 * writes the following output 00093 * \code 00094 * [0] in f() 00095 * [1] in g() 00096 * [2]------i=0 00097 * [2]------i=1 00098 * [2]------i=2 00099 * [1] leaving g() 00100 * [0] leaving f() 00101 * \endcode 00102 */ 00103 class Tabs 00104 { 00105 public: 00106 /** Constructor increments tab level */ 00107 Tabs(bool jump=true); 00108 00109 /** Destructor decrements tab level */ 00110 ~Tabs(); 00111 00112 /** 00113 * Print to stream. This method is usually not called directly, as 00114 * tabs will usually be written with the insertion operator 00115 */ 00116 void print(std::ostream& os) const ; 00117 00118 /** Change the tab size. Default is 2. */ 00119 static void setTabSize(int ts) {tabSize() = ts;} 00120 00121 /** Indicate whether to print the tab depth as a header for each line. */ 00122 static bool& showDepth() {static bool rtn = true; return rtn;} 00123 00124 private: 00125 /** */ 00126 static int& tabLevel() {static int rtn = 0; return rtn;} 00127 00128 /** */ 00129 static int& tabSize() {static int rtn = 2; return rtn;} 00130 00131 bool jump_; 00132 00133 int myLevel_; 00134 }; 00135 } 00136 00137 namespace Playa 00138 { 00139 /** \relates Tabs stream insertion operator for tab */ 00140 inline std::ostream& operator<<(std::ostream& os, const Tabs& t) 00141 { 00142 t.print(os); 00143 return os; 00144 } 00145 } 00146 00147 #endif