ddumpable.hpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:13k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: ddumpable.hpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/02/12 21:43:57  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [CORE_001] Dev-tree R1.9
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef DDUMPABLE__HPP
  10. #define DDUMPABLE__HPP
  11. /*  $Id: ddumpable.hpp,v 1000.2 2004/02/12 21:43:57 gouriano Exp $
  12.  * ===========================================================================
  13.  *
  14.  *                            PUBLIC DOMAIN NOTICE
  15.  *               National Center for Biotechnology Information
  16.  *
  17.  *  This software/database is a "United States Government Work" under the
  18.  *  terms of the United States Copyright Act.  It was written as part of
  19.  *  the author's official duties as a United States Government employee and
  20.  *  thus cannot be copyrighted.  This software/database is freely available
  21.  *  to the public for use. The National Library of Medicine and the U.S.
  22.  *  Government have not placed any restriction on its use or reproduction.
  23.  *
  24.  *  Although all reasonable efforts have been taken to ensure the accuracy
  25.  *  and reliability of the software and data, the NLM and the U.S.
  26.  *  Government do not and cannot warrant the performance or results that
  27.  *  may be obtained by using this software or data. The NLM and the U.S.
  28.  *  Government disclaim all warranties, express or implied, including
  29.  *  warranties of performance, merchantability or fitness for any particular
  30.  *  purpose.
  31.  *
  32.  *  Please cite the author in any work or product based on this material.
  33.  *
  34.  * ===========================================================================
  35.  *
  36.  * Author:  Andrei Gourianov
  37.  *
  38.  * File Description:
  39.  *      Debug Dump functionality
  40.  *
  41.  */
  42. #include <corelib/ncbistd.hpp>
  43. BEGIN_NCBI_SCOPE
  44. //---------------------------------------------------------------------------
  45. //  CDebugDumpFormatter defines debug dump formatter interface
  46.  
  47. class NCBI_XNCBI_EXPORT CDebugDumpFormatter
  48. {
  49. public:
  50.     enum EValueType {
  51.         eValue,
  52.         eString,
  53.         ePointer
  54.     };
  55. public:
  56.     virtual bool StartBundle(unsigned int level, const string& bundle) = 0;
  57.     virtual void EndBundle(  unsigned int level, const string& bundle) = 0;
  58.     virtual bool StartFrame( unsigned int level, const string& frame) = 0;
  59.     virtual void EndFrame(   unsigned int level, const string& frame) = 0;
  60.     virtual void PutValue(   unsigned int level, const string& name,
  61.                              const string& value, EValueType type,
  62.                              const string& comment) = 0;
  63. };
  64. //---------------------------------------------------------------------------
  65. //  CDebugDumpContext provides client interface in the form [name=value]
  66. class CDebugDumpable;
  67. class NCBI_XNCBI_EXPORT CDebugDumpContext
  68. {
  69. public:
  70.     CDebugDumpContext(CDebugDumpFormatter& formatter, const string& bundle);
  71.     // This is not exactly a copy constructor -
  72.     // this mechanism is used internally to find out
  73.     // where are we on the Dump tree
  74.     CDebugDumpContext(CDebugDumpContext& ddc);
  75.     CDebugDumpContext(CDebugDumpContext& ddc, const string& bundle);
  76.     virtual ~CDebugDumpContext(void);
  77. public:
  78.     // First thing in DebugDump() function - call this function
  79.     // providing class type as the frame name
  80.     void SetFrame(const string& frame);
  81.     // Log data in the form [name, data, comment]
  82.     // All data is passed to a formatter as string, still sometimes
  83.     // it is probably worth to emphasize that the data is REALLY a string
  84.     void Log(const string& name, const char* value, 
  85.              CDebugDumpFormatter::EValueType type=CDebugDumpFormatter::eValue,
  86.              const string& comment = kEmptyStr);
  87.     void Log(const string& name, const string& value, 
  88.              CDebugDumpFormatter::EValueType type=CDebugDumpFormatter::eValue,
  89.              const string& comment = kEmptyStr);
  90.     void Log(const string& name, bool value,
  91.              const string& comment = kEmptyStr);
  92.     void Log(const string& name, short value,
  93.              const string& comment = kEmptyStr);
  94.     void Log(const string& name, unsigned short value,
  95.              const string& comment = kEmptyStr);
  96.     void Log(const string& name, int value,
  97.              const string& comment = kEmptyStr);
  98.     void Log(const string& name, unsigned int value,
  99.              const string& comment = kEmptyStr);
  100.     void Log(const string& name, long value,
  101.              const string& comment = kEmptyStr);
  102.     void Log(const string& name, unsigned long value,
  103.              const string& comment = kEmptyStr);
  104. #if (SIZEOF_LONG < 8)
  105.     void Log(const string& name, Int8 value,
  106.              const string& comment = kEmptyStr);
  107.     void Log(const string& name, Uint8 value,
  108.              const string& comment = kEmptyStr);
  109. #endif
  110.     void Log(const string& name, double value,
  111.              const string& comment = kEmptyStr);
  112.     void Log(const string& name, const void* value,
  113.              const string& comment = kEmptyStr);
  114.     void Log(const string& name, const CDebugDumpable* value,
  115.              unsigned int depth);
  116. private:
  117.     void x_VerifyFrameStarted(void);
  118.     void x_VerifyFrameEnded(void);
  119.     CDebugDumpContext&   m_Parent;
  120.     CDebugDumpFormatter& m_Formatter;
  121.     unsigned int         m_Level;
  122.     bool                 m_Start_Bundle;
  123.     string               m_Title; 
  124.     bool                 m_Started;
  125. };
  126. //---------------------------------------------------------------------------
  127. //  CDebugDumpable defines DebugDump() functionality (abstract base class)
  128. class NCBI_XNCBI_EXPORT CDebugDumpable
  129. {
  130. public:
  131.     CDebugDumpable(void) {}
  132.     virtual ~CDebugDumpable(void);
  133.     // Enable/disable debug dump
  134.     static void EnableDebugDump(bool on);
  135.     // Dump using text formatter
  136.     void DebugDumpText(ostream& out,
  137.                        const string& bundle, unsigned int depth) const;
  138.     // Dump using external dump formatter
  139.     void DebugDumpFormat(CDebugDumpFormatter& ddf, 
  140.                    const string& bundle, unsigned int depth) const;
  141.     // Function that does the dump - to be overloaded
  142.     virtual void DebugDump(CDebugDumpContext ddc, unsigned int depth) const = 0;
  143. private:
  144.     static bool sm_DumpEnabled;
  145. };
  146. //---------------------------------------------------------------------------
  147. //  CDebugDumpFormatterText defines text debug dump formatter class
  148. class NCBI_XNCBI_EXPORT CDebugDumpFormatterText : public CDebugDumpFormatter
  149. {
  150. public:
  151.     CDebugDumpFormatterText(ostream& out);
  152.     virtual ~CDebugDumpFormatterText(void);
  153. public:
  154.     virtual bool StartBundle(unsigned int level, const string& bundle);
  155.     virtual void EndBundle(  unsigned int level, const string& bundle);
  156.     virtual bool StartFrame( unsigned int level, const string& frame);
  157.     virtual void EndFrame(   unsigned int level, const string& frame);
  158.     virtual void PutValue(   unsigned int level, const string& name,
  159.                              const string& value, EValueType type,
  160.                              const string& comment);
  161. private:
  162.     void x_IndentLine(unsigned int level, char c = ' ', unsigned int len = 2);
  163.     void x_InsertPageBreak(const string& title = kEmptyStr,
  164.                            char c = '=', unsigned int len = 78);
  165.     ostream& m_Out;
  166. };
  167. /****************************************************************************
  168.         Collection of debug dump function templates
  169. ****************************************************************************/
  170.  
  171. //---------------------------------------------------------------------------
  172. // Value
  173. // Log a "simple" value
  174. // "Simple" means that output stream understands how to dump it
  175. // (i.e. operator 'os<<value' makes sense)
  176. template<class T>
  177. void DebugDumpValue( CDebugDumpContext& _this, const string& name,
  178.     const T& value, const string& comment = kEmptyStr)
  179. {
  180.     ostrstream os;
  181.     os << value << '';
  182.     _this.Log(name, string(os.str()), CDebugDumpFormatter::eValue, comment);
  183. }
  184. //---------------------------------------------------------------------------
  185. // non-associative STL containers
  186. // Log range of pointers to dumpable objects
  187. template<class T>
  188. void DebugDumpRangePtr( CDebugDumpContext& _this, const string& name,
  189.     T it, T it_end, unsigned int depth)
  190. {
  191.     if (depth == 0) {
  192.         return;
  193.     }
  194.     --depth;
  195.     // container is an object - so,
  196.     // to start a sub-bundle we create a new CDebugDumpContext
  197.     CDebugDumpContext ddc2(_this,name);
  198.     for ( int n=0; it != it_end; ++it, ++n) {
  199.         string member_name = name + "[ " + NStr::IntToString(n) + " ]";
  200.         ddc2.Log(member_name, (*it), depth);
  201.     }
  202. }
  203. // Log range of dumpable objects
  204. template<class T>
  205. void DebugDumpRangeObj( CDebugDumpContext& _this, const string& name,
  206.     T it, T it_end, unsigned int depth)
  207. {
  208.     if (depth == 0) {
  209.         return;
  210.     }
  211.     --depth;
  212.     CDebugDumpContext ddc2(_this,name);
  213.     for ( int n=0; it != it_end; ++it, ++n) {
  214.         string member_name = name + "[ " + NStr::IntToString(n) + " ]";
  215.         ddc2.Log(member_name, &(*it), depth);
  216.     }
  217. }
  218. // Log range of CRefs to dumpable objects
  219. template<class T>
  220. void DebugDumpRangeCRef( CDebugDumpContext& _this, const string& name,
  221.     T it, T it_end, unsigned int depth)
  222. {
  223.     if (depth == 0) {
  224.         return;
  225.     }
  226.     --depth;
  227.     CDebugDumpContext ddc2(_this,name);
  228.     for ( int n=0; it != it_end; ++it, ++n) {
  229.         string member_name = name + "[ " + NStr::IntToString(n) + " ]";
  230.         ddc2.Log(member_name, (*it).GetPointer(), depth);
  231.     }
  232. }
  233. //---------------------------------------------------------------------------
  234. // associative STL containers
  235. // Log range of pairs of pointers (map of ptr to ptr)
  236. // "second" is a pointer to a dumpable objects
  237. template<class T>
  238. void DebugDumpPairsPtrPtr( CDebugDumpContext& _this, const string& name,
  239.     T it, T it_end, unsigned int depth)
  240. {
  241.     if (depth == 0) {
  242.         return;
  243.     }
  244.     --depth;
  245.     CDebugDumpContext ddc2(_this,name);
  246.     for ( int n=0; it != it_end; ++it, ++n) {
  247.         string member_name = name + "[ " + NStr::PtrToString(
  248.             dynamic_cast<const CDebugDumpable*>(it->first)) + " ]";
  249.         ddc2.Log(member_name, it->second, depth);
  250.     }
  251. }
  252. // Log range of pairs of pointers (map of ptr to CRef)
  253. // "second" is a pointer to a dumpable objects
  254. template<class T>
  255. void DebugDumpPairsPtrCRef( CDebugDumpContext& _this, const string& name,
  256.     T it, T it_end, unsigned int depth)
  257. {
  258.     if (depth == 0) {
  259.         return;
  260.     }
  261.     --depth;
  262.     CDebugDumpContext ddc2(_this,name);
  263.     for ( int n=0; it != it_end; ++it, ++n) {
  264.         string member_name = name + "[ " + NStr::PtrToString(
  265.             dynamic_cast<const CDebugDumpable*>(it->first)) + " ]";
  266.         ddc2.Log(member_name,(it->second).GetPointer(), depth);
  267.     }
  268. }
  269. // Log range of pairs of pointers (map of CRef to CRef)
  270. // "second" is a CRef to a dumpable objects
  271. template<class T>
  272. void DebugDumpPairsCRefCRef( CDebugDumpContext& _this, const string& name,
  273.     T it, T it_end, unsigned int depth)
  274. {
  275.     if (depth == 0) {
  276.         return;
  277.     }
  278.     --depth;
  279.     CDebugDumpContext ddc2(_this,name);
  280.     for ( int n=0; it != it_end; ++it, ++n) {
  281.         string member_name = name + "[ " + NStr::PtrToString(
  282.             dynamic_cast<const CDebugDumpable*>((it->first).GetPointer()))
  283.             + " ]";
  284.         ddc2.Log(member_name,(it->second).GetPointer(), depth);
  285.     }
  286. }
  287. // Log range of pairs of pointers
  288. // "first" can be serialized into ostream
  289. // "second" is a pointer to a dumpable objects
  290. template<class T>
  291. void DebugDumpPairsValuePtr( CDebugDumpContext& _this, const string& name,
  292.     T it, T it_end, unsigned int depth)
  293. {
  294.     if (depth == 0) {
  295.         return;
  296.     }
  297.     --depth;
  298.     CDebugDumpContext ddc2(_this,name);
  299.     for ( int n=0; it != it_end; ++it, ++n) {
  300.         ostrstream os;
  301.         os << (it->first) << '';
  302.         string member_name = name + "[ " + os.str() + " ]";
  303.         ddc2.Log(member_name,it->second, depth);
  304.     }
  305. }
  306. END_NCBI_SCOPE
  307. /*
  308.  * ===========================================================================
  309.  * $Log: ddumpable.hpp,v $
  310.  * Revision 1000.2  2004/02/12 21:43:57  gouriano
  311.  * PRODUCTION: UPGRADED [CORE_001] Dev-tree R1.9
  312.  *
  313.  * Revision 1.9  2003/12/09 21:13:27  ucko
  314.  * Re-tweak logging of 64-bit numbers, as the previous revision broke
  315.  * when __int64 and long long were synonymous.  (Now uses Int8/Uint8
  316.  * everywhere, but only when sizeof(long) < 8.)
  317.  *
  318.  * Revision 1.8  2003/12/09 17:25:51  gouriano
  319.  * Corrected previously defined Log() functions to avoid conflicts
  320.  * on 64 bit platforms
  321.  *
  322.  * Revision 1.7  2003/12/09 16:55:12  gouriano
  323.  * Added Log() methods for Int8 and Uint8
  324.  *
  325.  * Revision 1.6  2003/11/12 20:15:23  gouriano
  326.  * Added more Log() methods: for short, int, and char* types
  327.  *
  328.  * Revision 1.5  2003/05/19 21:05:39  vakatov
  329.  * x_InsertPageBreak() --  title: "" -> kEmptyStr,  len:  int -> unsigned int.
  330.  * Fixed code indentation and simplified some code.
  331.  *
  332.  * Revision 1.4  2002/12/18 22:53:21  dicuccio
  333.  * Added export specifier for building DLLs in windows.  Added global list of
  334.  * all such specifiers in mswin_exports.hpp, included through ncbistl.hpp
  335.  *
  336.  * Revision 1.3  2002/05/29 21:15:08  gouriano
  337.  * changed formatter interface: added value type
  338.  *
  339.  * Revision 1.2  2002/05/28 17:57:11  gouriano
  340.  * all DebugDump-related classes were put in one header
  341.  * templates adjusted and debugged on multiple platforms
  342.  *
  343.  * Revision 1.1  2002/05/17 14:25:39  gouriano
  344.  * added DebugDump base class and function to CObject
  345.  *
  346.  *
  347.  *
  348.  * ===========================================================================
  349.  */
  350. #endif // DDUMPABLE__HPP