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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: ddumpable.cpp,v $
  4.  * PRODUCTION Revision 1000.4  2004/06/01 19:08:28  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.11
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: ddumpable.cpp,v 1000.4 2004/06/01 19:08:28 gouriano Exp $
  10.  * ===========================================================================
  11.  *
  12.  *                            PUBLIC DOMAIN NOTICE
  13.  *               National Center for Biotechnology Information
  14.  *
  15.  *  This software/database is a "United States Government Work" under the
  16.  *  terms of the United States Copyright Act.  It was written as part of
  17.  *  the author's official duties as a United States Government employee and
  18.  *  thus cannot be copyrighted.  This software/database is freely available
  19.  *  to the public for use. The National Library of Medicine and the U.S.
  20.  *  Government have not placed any restriction on its use or reproduction.
  21.  *
  22.  *  Although all reasonable efforts have been taken to ensure the accuracy
  23.  *  and reliability of the software and data, the NLM and the U.S.
  24.  *  Government do not and cannot warrant the performance or results that
  25.  *  may be obtained by using this software or data. The NLM and the U.S.
  26.  *  Government disclaim all warranties, express or implied, including
  27.  *  warranties of performance, merchantability or fitness for any particular
  28.  *  purpose.
  29.  *
  30.  *  Please cite the author in any work or product based on this material.
  31.  *
  32.  * ===========================================================================
  33.  *
  34.  * Author:  Andrei Gourianov
  35.  *
  36.  * File Description:
  37.  *      Debug Dump functionality
  38.  *
  39.  */
  40. #include <ncbi_pch.hpp>
  41. #include <corelib/ddumpable.hpp>
  42. BEGIN_NCBI_SCOPE
  43. //---------------------------------------------------------------------------
  44. //  CDebugDumpable defines DebugDump() functionality (abstract base class)
  45. bool CDebugDumpable::sm_DumpEnabled = true;
  46. CDebugDumpable::~CDebugDumpable(void)
  47. {
  48.     return;
  49. }
  50. void CDebugDumpable::EnableDebugDump(bool on)
  51. {
  52.     sm_DumpEnabled = on;
  53. }
  54. void CDebugDumpable::DebugDumpText(ostream&      out,
  55.                                    const string& bundle,
  56.                                    unsigned int  depth)
  57.     const
  58. {
  59.     if ( sm_DumpEnabled ) {
  60.         CDebugDumpFormatterText ddf(out);
  61.         DebugDumpFormat(ddf, bundle, depth);
  62.     }
  63. }
  64. void CDebugDumpable::DebugDumpFormat(CDebugDumpFormatter& ddf,
  65.                                      const string&        bundle,
  66.                                      unsigned int         depth)
  67.     const
  68. {
  69.     if ( sm_DumpEnabled ) {
  70.         CDebugDumpContext ddc(ddf, bundle);
  71.         DebugDump(ddc, depth);
  72.     }
  73. }
  74. //---------------------------------------------------------------------------
  75. //  CDebugDumpContext provides client interface in the form [name=value]
  76. CDebugDumpContext::CDebugDumpContext(CDebugDumpFormatter& formatter,
  77.                                      const string&        bundle)
  78.     : m_Parent(*this),
  79.       m_Formatter(formatter),
  80.       m_Title(bundle)
  81. {
  82.     m_Level        = 0;
  83.     m_Start_Bundle = true;
  84.     m_Started      = false;
  85. }
  86. CDebugDumpContext::CDebugDumpContext(CDebugDumpContext& ddc)
  87.     : m_Parent(ddc),
  88.       m_Formatter(ddc.m_Formatter)
  89. {
  90.     m_Parent.x_VerifyFrameStarted();
  91.     m_Level        = m_Parent.m_Level + 1;
  92.     m_Start_Bundle = false;
  93.     m_Started      = false;
  94. }
  95. CDebugDumpContext::CDebugDumpContext(CDebugDumpContext& ddc,
  96.                                      const string&      bundle)
  97.     : m_Parent(ddc),
  98.       m_Formatter(ddc.m_Formatter),
  99.       m_Title(bundle)
  100. {
  101.     m_Parent.x_VerifyFrameStarted();
  102.     m_Level        = m_Parent.m_Level + 1;
  103.     m_Start_Bundle = true;
  104.     m_Started      = false;
  105. }
  106. CDebugDumpContext::~CDebugDumpContext(void)
  107. {
  108.     if (&m_Parent == this)
  109.         return;
  110.     x_VerifyFrameStarted();
  111.     x_VerifyFrameEnded();
  112.     if (m_Level == 1) {
  113.         m_Parent.x_VerifyFrameEnded();
  114.     }
  115. }
  116. void CDebugDumpContext::SetFrame(const string& frame)
  117. {
  118.     if ( m_Started )
  119.         return;
  120.     if (m_Start_Bundle) {
  121.         m_Started = m_Formatter.StartBundle(m_Level, m_Title);
  122.     } else {
  123.         m_Title   = frame;
  124.         m_Started = m_Formatter.StartFrame(m_Level, m_Title);
  125.     }
  126. }
  127. void CDebugDumpContext::Log(const string& name,
  128.                             const char* value, 
  129.                             CDebugDumpFormatter::EValueType type,
  130.                             const string& comment)
  131. {
  132.     Log(name,value ? string(value) : kEmptyStr,type,comment);
  133. }
  134. void CDebugDumpContext::Log(const string&                   name,
  135.                             const string&                   value,
  136.                             CDebugDumpFormatter::EValueType type,
  137.                             const string&                   comment)
  138. {
  139.     x_VerifyFrameStarted();
  140.     if ( m_Started ) {
  141.         m_Formatter.PutValue(m_Level, name, value, type, comment);
  142.     }
  143. }
  144. void CDebugDumpContext::Log(const string& name, bool value,
  145.                             const string& comment)
  146. {
  147.     Log(name, NStr::BoolToString(value), CDebugDumpFormatter::eValue, comment);
  148. }
  149. void CDebugDumpContext::Log(const string& name, short value,
  150.                             const string& comment)
  151. {
  152.     Log(name, NStr::IntToString(value), CDebugDumpFormatter::eValue, comment);
  153. }
  154. void CDebugDumpContext::Log(const string& name, unsigned short value,
  155.                             const string& comment)
  156. {
  157.     Log(name, NStr::UIntToString(value), CDebugDumpFormatter::eValue, comment);
  158. }
  159. void CDebugDumpContext::Log(const string& name, int value,
  160.                             const string& comment)
  161. {
  162.     Log(name, NStr::IntToString(value), CDebugDumpFormatter::eValue, comment);
  163. }
  164. void CDebugDumpContext::Log(const string& name, unsigned int value,
  165.                             const string& comment)
  166. {
  167.     Log(name, NStr::UIntToString(value), CDebugDumpFormatter::eValue, comment);
  168. }
  169. void CDebugDumpContext::Log(const string& name, long value,
  170.                             const string& comment)
  171. {
  172.     Log(name, NStr::IntToString(value), CDebugDumpFormatter::eValue, comment);
  173. }
  174. void CDebugDumpContext::Log(const string& name, unsigned long value,
  175.                             const string& comment)
  176. {
  177.     Log(name, NStr::UIntToString(value), CDebugDumpFormatter::eValue, comment);
  178. }
  179. #if (SIZEOF_LONG < 8)
  180. void CDebugDumpContext::Log(const string& name, Int8 value,
  181.                             const string& comment)
  182. {
  183.     Log(name, NStr::Int8ToString(value), CDebugDumpFormatter::eValue, comment);
  184. }
  185. void CDebugDumpContext::Log(const string& name, Uint8 value,
  186.                             const string& comment)
  187. {
  188.     Log(name, NStr::UInt8ToString(value), CDebugDumpFormatter::eValue, comment);
  189. }
  190. #endif
  191. void CDebugDumpContext::Log(const string& name, double value,
  192.                             const string& comment)
  193. {
  194.     Log(name, NStr::DoubleToString(value), CDebugDumpFormatter::eValue,
  195.         comment);
  196. }
  197. void CDebugDumpContext::Log(const string& name, const void* value,
  198.                             const string& comment)
  199. {
  200.     Log(name, NStr::PtrToString(value), CDebugDumpFormatter::eValue, comment);
  201. }
  202. void CDebugDumpContext::Log(const string& name, const CDebugDumpable* value,
  203.                             unsigned int depth)
  204. {
  205.     if (depth != 0  &&  value) {
  206.         CDebugDumpContext ddc(*this, name);
  207.         value->DebugDump(ddc, depth - 1);
  208.     } else {
  209.         Log(name, NStr::PtrToString(static_cast<const void*> (value)),
  210.             CDebugDumpFormatter::ePointer);
  211.     }
  212. }
  213. void CDebugDumpContext::x_VerifyFrameStarted(void)
  214. {
  215.     SetFrame(m_Title);
  216. }
  217. void CDebugDumpContext::x_VerifyFrameEnded(void)
  218. {
  219.     if ( !m_Started )
  220.         return;
  221.     if (m_Start_Bundle) {
  222.         m_Formatter.EndBundle(m_Level, m_Title);
  223.     } else {
  224.         m_Formatter.EndFrame(m_Level, m_Title);
  225.     }
  226.     m_Started = false;
  227. }
  228. //---------------------------------------------------------------------------
  229. //  CDebugDumpFormatterText defines text debug dump formatter class
  230. CDebugDumpFormatterText::CDebugDumpFormatterText(ostream& out)
  231.     : m_Out(out)
  232. {
  233. }
  234. CDebugDumpFormatterText::~CDebugDumpFormatterText(void)
  235. {
  236. }
  237. bool CDebugDumpFormatterText::StartBundle(unsigned int  level,
  238.                                           const string& bundle)
  239. {
  240.     if (level == 0) {
  241.         x_InsertPageBreak(bundle);
  242.     } else {
  243.         m_Out << endl;
  244.         x_IndentLine(level);
  245.         m_Out << (bundle.empty() ? "?" : bundle.c_str()) << " = {";
  246.     }
  247.     return true;
  248. }
  249. void CDebugDumpFormatterText::EndBundle(unsigned int  level,
  250.                                         const string& /*bundle*/)
  251. {
  252.     if (level == 0) {
  253.         x_InsertPageBreak();
  254.         m_Out << endl;
  255.     } else {
  256.         m_Out << endl;
  257.         x_IndentLine(level);
  258.         m_Out << "}";
  259.     }
  260. }
  261. bool CDebugDumpFormatterText::StartFrame(unsigned int  level,
  262.                                          const string& frame)
  263. {
  264.     m_Out << endl;
  265.     x_IndentLine(level);
  266.     m_Out << (frame.empty() ? "?" : frame.c_str()) << " {";
  267.     return true;
  268. }
  269. void CDebugDumpFormatterText::EndFrame(unsigned int  /*level*/,
  270.                                        const string& /*frame*/)
  271. {
  272.     m_Out << " }";
  273. }
  274. void CDebugDumpFormatterText::PutValue(unsigned int level,
  275.                                        const string& name, const string& value,
  276.                                        EValueType type, const string& comment)
  277. {
  278.     m_Out << endl;
  279.     x_IndentLine(level + 1);
  280.     m_Out << name << " = " ;
  281.     if (type == eString) {
  282.         m_Out << '"' << value << '"';
  283.     } else {
  284.         m_Out << value;
  285.     }
  286.     if ( !comment.empty() ) {
  287.         m_Out << " (" << comment << ")";
  288.     }
  289. }
  290. void CDebugDumpFormatterText::x_IndentLine(unsigned int level, char c,
  291.                                            unsigned int len)
  292. {
  293.     m_Out << string(level * len, c);
  294. }
  295. void CDebugDumpFormatterText::x_InsertPageBreak(const string& title, char c,
  296.                                                 unsigned int len)
  297. {
  298.     m_Out << endl;
  299.     string tmp;
  300.     if ( !title.empty() ) {
  301.         if (len < title.length() + 2) {
  302.             tmp = title;
  303.         } else {
  304.             size_t i1 = (len - title.length() - 2) / 2;
  305.             tmp.append(i1, c);
  306.             tmp += " " + title + " ";
  307.             tmp.append(i1, c);
  308.         }
  309.     } else {
  310.         tmp.append(len, c);
  311.     }
  312.     m_Out << tmp;
  313. }
  314. END_NCBI_SCOPE
  315. /*
  316.  * ===========================================================================
  317.  * $Log: ddumpable.cpp,v $
  318.  * Revision 1000.4  2004/06/01 19:08:28  gouriano
  319.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.11
  320.  *
  321.  * Revision 1.11  2004/05/14 13:59:26  gorelenk
  322.  * Added include of ncbi_pch.hpp
  323.  *
  324.  * Revision 1.10  2003/12/09 21:13:49  ucko
  325.  * Re-tweak logging of 64-bit numbers, as the previous revision broke
  326.  * when __int64 and long long were synonymous.  (Now uses Int8/Uint8
  327.  * everywhere, but only when sizeof(long) < 8.)
  328.  *
  329.  * Revision 1.9  2003/12/09 17:27:22  gouriano
  330.  * Corrected previously defined Log() functions to avoid conflicts
  331.  * on 64 bit platforms
  332.  *
  333.  * Revision 1.8  2003/12/09 16:55:38  gouriano
  334.  * Added Log() methods for Int8 and Uint8
  335.  *
  336.  * Revision 1.7  2003/11/18 14:13:43  gouriano
  337.  * Corrected odd typecast in CDebugDumpContext::Log method
  338.  *
  339.  * Revision 1.6  2003/11/12 20:16:01  gouriano
  340.  * Added more Log() methods: for short, int, and char* types
  341.  *
  342.  * Revision 1.5  2003/05/19 21:05:41  vakatov
  343.  * x_InsertPageBreak() --  title: "" -> kEmptyStr,  len:  int -> unsigned int.
  344.  * Fixed code indentation and simplified some code.
  345.  *
  346.  * Revision 1.4  2003/02/21 21:07:46  vakatov
  347.  * Minor cast to get rid of 64-bit compilation warning
  348.  *
  349.  * Revision 1.3  2002/05/29 21:17:32  gouriano
  350.  * changed formatter interface: added value type
  351.  *
  352.  * Revision 1.2  2002/05/28 17:59:24  gouriano
  353.  * all DebugDump-related classes were put in one header
  354.  * templates adjusted and debugged on multiple platforms
  355.  *
  356.  * Revision 1.1  2002/05/17 14:27:11  gouriano
  357.  * added DebugDump base class and function to CObject
  358.  * ===========================================================================
  359.  */