deprecated and gone
This commit is contained in:
		@@ -1,192 +0,0 @@
 | 
				
			|||||||
/** @file
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    $Id$
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    $Date$
 | 
					 | 
				
			||||||
    $Author$
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @copy © Marc Wäckerlin
 | 
					 | 
				
			||||||
    @license LGPL, see file <a href="license.html">COPYING</a>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    $Log$
 | 
					 | 
				
			||||||
    Revision 1.2  2004/08/28 16:21:25  marc
 | 
					 | 
				
			||||||
    mrw-c++-0.92 (mrw)
 | 
					 | 
				
			||||||
    - new file: version.cpp
 | 
					 | 
				
			||||||
    - new file header for all sources
 | 
					 | 
				
			||||||
    - work around warning in mrw::auto<T>
 | 
					 | 
				
			||||||
    - possibility to compile without log4cxx
 | 
					 | 
				
			||||||
    - work around bugs in demangle.h and libiberty.h
 | 
					 | 
				
			||||||
    - corrections in documentation
 | 
					 | 
				
			||||||
    - added simple tracing mechanism
 | 
					 | 
				
			||||||
    - more warnings
 | 
					 | 
				
			||||||
    - small corrections in Auto<>::Free and a new test for it
 | 
					 | 
				
			||||||
    - possibility to compile without stack trace
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
#ifndef __MRW_SIMPLETRACE_HPP__
 | 
					 | 
				
			||||||
#define __MRW_SIMPLETRACE_HPP__
 | 
					 | 
				
			||||||
#include <iostream>
 | 
					 | 
				
			||||||
#include <iomanip>
 | 
					 | 
				
			||||||
#include <string>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/** @defgroup SimpleTrace Simple Tracing (for temporary debugging)
 | 
					 | 
				
			||||||
    @pre #include <mrw/simpletrace.hpp>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Here is a simple tracing to @c std::cout mechanism for temporary
 | 
					 | 
				
			||||||
    debugging and simple testing purposes. Might be useful when
 | 
					 | 
				
			||||||
    experimenting and exploring new C++ language constructs. Please
 | 
					 | 
				
			||||||
    note that you can only trace in methods and functions that start
 | 
					 | 
				
			||||||
    with @c METHOD respectively @c FUNCTION.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Please note that you should not use this simple mechanism for real
 | 
					 | 
				
			||||||
    projects, only for your experiments! For your work, use
 | 
					 | 
				
			||||||
    <a href="http://logging.apache.org/log4cxx">log4cxx</a>!
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    The trace of the following code:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @code
 | 
					 | 
				
			||||||
    #include <mrw/simpletrace.hpp>
 | 
					 | 
				
			||||||
    void fn(int i=0) {
 | 
					 | 
				
			||||||
      FUNCTION; // trace entry and exit
 | 
					 | 
				
			||||||
      if (!i) TRACE("Hello World, this is a nice text!");
 | 
					 | 
				
			||||||
      if (i<4) fn(++i);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    class A {
 | 
					 | 
				
			||||||
      public:
 | 
					 | 
				
			||||||
        A() {
 | 
					 | 
				
			||||||
          NO_TRACE; // don't trace in constructor
 | 
					 | 
				
			||||||
          method(); // not traced
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        void method() {
 | 
					 | 
				
			||||||
          METHOD; // trace entry and exit
 | 
					 | 
				
			||||||
          CALL(fn()); // trace before call
 | 
					 | 
				
			||||||
          fn();
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
    int main(int, char**) {
 | 
					 | 
				
			||||||
      FUNCTION;
 | 
					 | 
				
			||||||
      CALL(A().method());
 | 
					 | 
				
			||||||
      A().method();
 | 
					 | 
				
			||||||
      TRACE("No more trace:");
 | 
					 | 
				
			||||||
      TRACE_OFF;
 | 
					 | 
				
			||||||
      A().method();
 | 
					 | 
				
			||||||
      TRACE_ON;
 | 
					 | 
				
			||||||
      TRACE("Back again");
 | 
					 | 
				
			||||||
      return 0;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    @endcode
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Produces this output:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @verbatim
 | 
					 | 
				
			||||||
        tmp.cpp:20                  0: \ main
 | 
					 | 
				
			||||||
        tmp.cpp:21                  0:   -> A().method()
 | 
					 | 
				
			||||||
        tmp.cpp:14         0xbffff10f:  \ method
 | 
					 | 
				
			||||||
        tmp.cpp:15         0xbffff10f:    -> fn()
 | 
					 | 
				
			||||||
        tmp.cpp:3                   0:   \ fn
 | 
					 | 
				
			||||||
        tmp.cpp:4                   0:   **** Hello World, this is a nice text! ****
 | 
					 | 
				
			||||||
        tmp.cpp:3                   0:    \ fn
 | 
					 | 
				
			||||||
        tmp.cpp:3                   0:     \ fn
 | 
					 | 
				
			||||||
        tmp.cpp:3                   0:      \ fn
 | 
					 | 
				
			||||||
        tmp.cpp:3                   0:       \ fn
 | 
					 | 
				
			||||||
        tmp.cpp:3                   0:       / fn
 | 
					 | 
				
			||||||
        tmp.cpp:3                   0:      / fn
 | 
					 | 
				
			||||||
        tmp.cpp:3                   0:     / fn
 | 
					 | 
				
			||||||
        tmp.cpp:3                   0:    / fn
 | 
					 | 
				
			||||||
        tmp.cpp:3                   0:   / fn
 | 
					 | 
				
			||||||
        tmp.cpp:14         0xbffff10f:  / method
 | 
					 | 
				
			||||||
        tmp.cpp:23                  0:  **** No more trace: ****
 | 
					 | 
				
			||||||
        tmp.cpp:27                  0:  **** Back again ****
 | 
					 | 
				
			||||||
        tmp.cpp:20                  0: / main
 | 
					 | 
				
			||||||
    @endverbatim
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
//@{
 | 
					 | 
				
			||||||
#ifndef __GNUG__
 | 
					 | 
				
			||||||
/// Declare method entrance, place as first line in method.
 | 
					 | 
				
			||||||
#define METHOD(name) mrw::FnTrace fnTrace(this, #name, __FILE__, __LINE__)
 | 
					 | 
				
			||||||
/// Declare function entrance, place as first line in function.
 | 
					 | 
				
			||||||
#define FUNCTION(name) mrw::FnTrace fnTrace(0, #name, __FILE__, __LINE__)
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
/// Declare method entrance, place as first line in method.
 | 
					 | 
				
			||||||
/// GNU g++ knows the method name.
 | 
					 | 
				
			||||||
#define METHOD mrw::FnTrace fnTrace(this, __FUNCTION__, __FILE__, __LINE__)
 | 
					 | 
				
			||||||
/// Declare function entrance, place as first line in function.
 | 
					 | 
				
			||||||
/// GNU g++ knows the method name.
 | 
					 | 
				
			||||||
#define FUNCTION mrw::FnTrace fnTrace(0, __FUNCTION__, __FILE__, __LINE__)
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
/// Document the call of another method (before you call it).
 | 
					 | 
				
			||||||
#define CALL(name) fnTrace.call(#name, __FILE__, __LINE__)
 | 
					 | 
				
			||||||
/// Trace an arbitrary text.
 | 
					 | 
				
			||||||
#define TRACE(text) fnTrace.trace(text, __FILE__, __LINE__)
 | 
					 | 
				
			||||||
/// Turn all tracing off (from here on).
 | 
					 | 
				
			||||||
#define TRACE_OFF mrw::FnTrace::off()
 | 
					 | 
				
			||||||
/// Turn all tracing off (from here on).
 | 
					 | 
				
			||||||
#define TRACE_ON mrw::FnTrace::on()
 | 
					 | 
				
			||||||
/// Don't trace in this scope (from here on).
 | 
					 | 
				
			||||||
#define NO_TRACE mrw::NoTrace noTrace;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace mrw {
 | 
					 | 
				
			||||||
  class FnTrace {
 | 
					 | 
				
			||||||
  public:
 | 
					 | 
				
			||||||
    FnTrace(const void* addr, const std::string& name,
 | 
					 | 
				
			||||||
            const std::string& file, unsigned long line) throw():
 | 
					 | 
				
			||||||
      _addr(addr), _name(name), _file(file), _line(line) {
 | 
					 | 
				
			||||||
      if (_off==0)
 | 
					 | 
				
			||||||
        std::cout<<std::setw(15)<<_file<<':'<<std::setiosflags(std::ios::left)
 | 
					 | 
				
			||||||
                 <<std::setw(5)<<_line<<std::resetiosflags(std::ios::left)<<' '
 | 
					 | 
				
			||||||
                 <<std::hex<<std::setw(15)<<_addr<<": "<<std::dec
 | 
					 | 
				
			||||||
                 <<std::setw(2+_level)<<std::setfill(' ')<<"\\ "
 | 
					 | 
				
			||||||
                 <<_name<<std::endl;
 | 
					 | 
				
			||||||
      ++_level;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    ~FnTrace() throw() {
 | 
					 | 
				
			||||||
      --_level;
 | 
					 | 
				
			||||||
      if (_off==0)
 | 
					 | 
				
			||||||
        std::cout<<std::setw(15)<<_file<<':'<<std::setiosflags(std::ios::left)
 | 
					 | 
				
			||||||
                 <<std::setw(5)<<_line<<std::resetiosflags(std::ios::left)<<' '
 | 
					 | 
				
			||||||
                 <<std::hex<<std::setw(15)<<_addr<<": "<<std::dec
 | 
					 | 
				
			||||||
                 <<std::setw(2+_level)<<std::setfill(' ')<<"/ "<<_name
 | 
					 | 
				
			||||||
                 <<std::endl;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    void call(const std::string& name,
 | 
					 | 
				
			||||||
              const std::string& file, unsigned long line) throw() {
 | 
					 | 
				
			||||||
      if (_off==0)
 | 
					 | 
				
			||||||
        std::cout<<std::setw(15)<<file<<':'<<std::setiosflags(std::ios::left)
 | 
					 | 
				
			||||||
                 <<std::setw(5)<<line<<std::resetiosflags(std::ios::left)<<' '
 | 
					 | 
				
			||||||
                 <<std::hex<<std::setw(15)<<_addr<<": "<<std::dec
 | 
					 | 
				
			||||||
                 <<std::setw(4+_level)<<std::setfill(' ')<<" -> "<<name
 | 
					 | 
				
			||||||
                 <<std::endl;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    void trace(const std::string& text,
 | 
					 | 
				
			||||||
               const std::string& file, unsigned long line) throw() {
 | 
					 | 
				
			||||||
      if (_off==0)
 | 
					 | 
				
			||||||
        std::cout<<std::setw(15)<<file<<':'<<std::setiosflags(std::ios::left)
 | 
					 | 
				
			||||||
                 <<std::setw(5)<<line<<std::resetiosflags(std::ios::left)<<' '
 | 
					 | 
				
			||||||
                 <<std::hex<<std::setw(15)<<_addr<<": "<<std::dec
 | 
					 | 
				
			||||||
                 <<std::setw(4+_level)<<std::setfill(' ')<<" **** "<<text
 | 
					 | 
				
			||||||
                 <<" **** "<<std::endl;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    static void off() throw() {
 | 
					 | 
				
			||||||
      ++_off;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    static void on() throw() {
 | 
					 | 
				
			||||||
      if (_off>0) --_off;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  private:
 | 
					 | 
				
			||||||
    const void* _addr;
 | 
					 | 
				
			||||||
    const std::string _name;
 | 
					 | 
				
			||||||
    const std::string _file;
 | 
					 | 
				
			||||||
    unsigned long _line;
 | 
					 | 
				
			||||||
    static unsigned int _level;
 | 
					 | 
				
			||||||
    static unsigned int _off;
 | 
					 | 
				
			||||||
  };
 | 
					 | 
				
			||||||
  unsigned int FnTrace::_level(0);
 | 
					 | 
				
			||||||
  unsigned int FnTrace::_off(0);
 | 
					 | 
				
			||||||
  class NoTrace {
 | 
					 | 
				
			||||||
  public:
 | 
					 | 
				
			||||||
    NoTrace() throw() {TRACE_OFF;}
 | 
					 | 
				
			||||||
    ~NoTrace() throw() {TRACE_ON;}
 | 
					 | 
				
			||||||
  };
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
//@}
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
		Reference in New Issue
	
	Block a user