PlayaTabs.hpp
Go to the documentation of this file.
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

Site Contact