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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: ncbidiag.inl,v $
  4.  * PRODUCTION Revision 1000.3  2004/06/01 19:08:00  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.43
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #if defined(CORELIB___NCBIDIAG__HPP)  &&  !defined(CORELIB___NCBIDIAG__INL)
  10. #define CORELIB___NCBIDIAG__INL
  11. /*  $Id: ncbidiag.inl,v 1000.3 2004/06/01 19:08:00 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:  Denis Vakatov
  37.  *
  38.  * File Description:
  39.  *   NCBI C++ diagnostic API
  40.  *
  41.  */
  42. /////////////////////////////////////////////////////////////////////////////
  43. // WARNING -- all the beneath is for INTERNAL "ncbidiag" use only,
  44. //            and any classes, typedefs and even "extern" functions and
  45. //            variables declared in this file should not be used anywhere
  46. //            but inside "ncbidiag.inl" and/or "ncbidiag.cpp"!!!
  47. /////////////////////////////////////////////////////////////////////////////
  48. //////////////////////////////////////////////////////////////////
  49. // CDiagBuffer
  50. // (can be accessed only by "CNcbiDiag" and "CDiagRestorer"
  51. // and created only by GetDiagBuffer())
  52. //
  53. class CDiagBuffer
  54. {
  55.     CDiagBuffer(const CDiagBuffer&);
  56.     CDiagBuffer& operator= (const CDiagBuffer&);
  57.     friend CDiagBuffer& GetDiagBuffer(void);
  58.     // Flags
  59.     friend bool IsSetDiagPostFlag(EDiagPostFlag flag, TDiagPostFlags flags);
  60.     NCBI_XNCBI_EXPORT
  61.     friend TDiagPostFlags         SetDiagPostAllFlags(TDiagPostFlags flags);
  62.     NCBI_XNCBI_EXPORT friend void SetDiagPostFlag(EDiagPostFlag flag);
  63.     NCBI_XNCBI_EXPORT friend void UnsetDiagPostFlag(EDiagPostFlag flag);
  64.     NCBI_XNCBI_EXPORT
  65.     friend TDiagPostFlags         SetDiagTraceAllFlags(TDiagPostFlags flags);
  66.     NCBI_XNCBI_EXPORT friend void SetDiagTraceFlag(EDiagPostFlag flag);
  67.     NCBI_XNCBI_EXPORT friend void UnsetDiagTraceFlag(EDiagPostFlag flag);
  68.     NCBI_XNCBI_EXPORT friend void SetDiagPostPrefix(const char* prefix);
  69.     NCBI_XNCBI_EXPORT friend void PushDiagPostPrefix(const char* prefix);
  70.     NCBI_XNCBI_EXPORT friend void PopDiagPostPrefix(void);
  71.     //
  72.     friend class CNcbiDiag;
  73.     friend const CNcbiDiag& Reset(const CNcbiDiag& diag);
  74.     friend const CNcbiDiag& Endm(const CNcbiDiag& diag);
  75.     // Severity
  76.     NCBI_XNCBI_EXPORT
  77.     friend EDiagSev SetDiagPostLevel(EDiagSev post_sev);
  78.     NCBI_XNCBI_EXPORT
  79.     friend void SetDiagFixedPostLevel(EDiagSev post_sev);
  80.     NCBI_XNCBI_EXPORT
  81.     friend bool DisableDiagPostLevelChange(bool disable_change);
  82.     NCBI_XNCBI_EXPORT
  83.     friend EDiagSev SetDiagDieLevel(EDiagSev die_sev);
  84.     NCBI_XNCBI_EXPORT
  85.     friend void IgnoreDiagDieLevel(bool ignore, EDiagSev* prev_sev);
  86.     // Others
  87.     NCBI_XNCBI_EXPORT
  88.     friend void SetDiagTrace(EDiagTrace how, EDiagTrace dflt);
  89.     NCBI_XNCBI_EXPORT friend bool IsDiagStream(const CNcbiOstream* os);
  90.     // Handler
  91.     NCBI_XNCBI_EXPORT friend void
  92.     SetDiagHandler(CDiagHandler* handler, bool can_delete);
  93.     NCBI_XNCBI_EXPORT friend CDiagHandler* GetDiagHandler(bool take_ownership);
  94.     NCBI_XNCBI_EXPORT friend bool IsSetDiagHandler(void);
  95.     // Error code information
  96.     NCBI_XNCBI_EXPORT
  97.     friend void SetDiagErrCodeInfo(CDiagErrCodeInfo* info, bool can_delete);
  98.     NCBI_XNCBI_EXPORT
  99.     friend CDiagErrCodeInfo* GetDiagErrCodeInfo(bool take_ownership);
  100.     NCBI_XNCBI_EXPORT
  101.     friend bool IsSetDiagErrCodeInfo(void);
  102. private:
  103.     friend class CDiagRestorer;
  104.     const CNcbiDiag* m_Diag;    // present user
  105.     CNcbiOstream*    m_Stream;  // storage for the diagnostic message
  106.     // user-specified string to add to each posted message
  107.     // (can be constructed from "m_PrefixList" after push/pop operations)
  108.     string m_PostPrefix;
  109.     // list of prefix strings to compose the "m_PostPrefix" from
  110.     typedef list<string> TPrefixList;
  111.     TPrefixList m_PrefixList;
  112.     CDiagBuffer(void);
  113.     //### This is a temporary workaround to allow call the destructor of
  114.     //### static instance of "CDiagBuffer" defined in GetDiagBuffer()
  115. public:
  116.     ~CDiagBuffer(void);
  117. private:
  118.     //###
  119.     // formatted output
  120.     template<class X> void Put(const CNcbiDiag& diag, const X& x) {
  121.         if ( SetDiag(diag) )
  122.             (*m_Stream) << x;
  123.     }
  124.     NCBI_XNCBI_EXPORT
  125.     void Flush  (void);
  126.     void Reset  (const CNcbiDiag& diag);   // reset content of the diag.message
  127.     void EndMess(const CNcbiDiag& diag);   // output current diag. message
  128.     NCBI_XNCBI_EXPORT
  129.     bool SetDiag(const CNcbiDiag& diag);
  130.     // flush & detach the current user
  131.     void Detach(const CNcbiDiag* diag);
  132.     // compose the post prefix using "m_PrefixList"
  133.     void UpdatePrefix(void);
  134.     // the bitwise OR combination of "EDiagPostFlag"
  135.     static TDiagPostFlags sm_PostFlags;
  136.     // extra flags ORed in for traces
  137.     static TDiagPostFlags sm_TraceFlags;
  138.     // static members
  139.     static EDiagSev       sm_PostSeverity;
  140.     static EDiagSevChange sm_PostSeverityChange;
  141.                                            // severity level changing status
  142.     static EDiagSev       sm_DieSeverity;
  143.     static EDiagTrace     sm_TraceDefault; // default state of tracing
  144.     static bool           sm_TraceEnabled; // current state of tracing
  145.                                            // (enable/disable)
  146.     static bool GetTraceEnabled(void);     // dont access sm_TraceEnabled 
  147.                                            // directly
  148.     static bool GetTraceEnabledFirstTime(void);
  149.     static bool GetSeverityChangeEnabledFirstTime(void);
  150.     // call the current diagnostics handler directly
  151.     static void DiagHandler(SDiagMessage& mess);
  152.     // Symbolic name for the severity levels(used by CNcbiDiag::SeverityName)
  153.     static const char* sm_SeverityName[eDiag_Trace+1];
  154.     // Application-wide diagnostic handler
  155.     static CDiagHandler* sm_Handler;
  156.     static bool          sm_CanDeleteHandler;
  157.     // Error codes info
  158.     static CDiagErrCodeInfo* sm_ErrCodeInfo;
  159.     static bool              sm_CanDeleteErrCodeInfo;
  160. };
  161. extern CDiagBuffer& GetDiagBuffer(void);
  162. ///////////////////////////////////////////////////////
  163. //  CNcbiDiag::
  164. inline CNcbiDiag::~CNcbiDiag(void) {
  165.     m_Buffer.Detach(this);
  166. }
  167. #ifdef NCBIDIAG_DEFER_GENERIC_PUT
  168. template<class X>
  169. inline const CNcbiDiag& CNcbiDiag::operator<< (const X& x) const {
  170.     m_Buffer.Put(*this, x);
  171.     return *this;
  172. }
  173. #endif
  174. inline const CNcbiDiag& CNcbiDiag::SetLine(size_t line) const {
  175.     m_Line = line;
  176.     return *this;
  177. }
  178. inline const CNcbiDiag& CNcbiDiag::SetErrorCode(int code, int subcode) const {
  179.     m_ErrCode = code;
  180.     m_ErrSubCode = subcode;
  181.     return *this;
  182. }
  183. inline EDiagSev CNcbiDiag::GetSeverity(void) const {
  184.     return m_Severity;
  185. }
  186. inline const char* CNcbiDiag::GetFile(void) const {
  187.     return m_File;
  188. }
  189. inline size_t CNcbiDiag::GetLine(void) const {
  190.     return m_Line;
  191. }
  192. inline int CNcbiDiag::GetErrorCode(void) const {
  193.     return m_ErrCode;
  194. }
  195. inline int CNcbiDiag::GetErrorSubCode(void) const {
  196.     return m_ErrSubCode;
  197. }
  198. inline TDiagPostFlags CNcbiDiag::GetPostFlags(void) const {
  199.     return (m_PostFlags & eDPF_Default) ?
  200.         (m_PostFlags | CDiagBuffer::sm_PostFlags) & ~eDPF_Default :
  201.         m_PostFlags;
  202. }
  203. inline
  204. const char* CNcbiDiag::SeverityName(EDiagSev sev) {
  205.     return CDiagBuffer::sm_SeverityName[sev];
  206. }
  207. ///////////////////////////////////////////////////////
  208. //  ErrCode - class for manipulator ErrCode
  209. inline
  210. const CNcbiDiag& CNcbiDiag::operator<< (const ErrCode& err_code) const
  211. {
  212.     return SetErrorCode(err_code.m_Code, err_code.m_SubCode);
  213. }
  214. inline
  215. bool operator< (const ErrCode& ec1, const ErrCode& ec2)
  216. {
  217.     return (ec1.m_Code == ec2.m_Code)
  218.         ? (ec1.m_SubCode < ec2.m_SubCode)
  219.         : (ec1.m_Code < ec2.m_Code);
  220. }
  221. ///////////////////////////////////////////////////////
  222. //  Other CNcbiDiag:: manipulators
  223. inline
  224. const CNcbiDiag& Reset(const CNcbiDiag& diag)  {
  225.     diag.m_Buffer.Reset(diag);
  226.     diag.SetErrorCode(0, 0);
  227.     return diag;
  228. }
  229. inline
  230. const CNcbiDiag& Endm(const CNcbiDiag& diag)  {
  231.     diag.m_Buffer.EndMess(diag);
  232.     diag.SetErrorCode(0, 0);
  233.     return diag;
  234. }
  235. inline
  236. const CNcbiDiag& Info(const CNcbiDiag& diag)  {
  237.     diag << Endm;
  238.     diag.m_Severity = eDiag_Info;
  239.     return diag;
  240. }
  241. inline
  242. const CNcbiDiag& Warning(const CNcbiDiag& diag)  {
  243.     diag << Endm;
  244.     diag.m_Severity = eDiag_Warning;
  245.     return diag;
  246. }
  247. inline
  248. const CNcbiDiag& Error(const CNcbiDiag& diag)  {
  249.     diag << Endm;
  250.     diag.m_Severity = eDiag_Error;
  251.     return diag;
  252. }
  253. inline
  254. const CNcbiDiag& Critical(const CNcbiDiag& diag)  {
  255.     diag << Endm;
  256.     diag.m_Severity = eDiag_Critical;
  257.     return diag;
  258. }
  259. inline
  260. const CNcbiDiag& Fatal(const CNcbiDiag& diag)  {
  261.     diag << Endm;
  262.     diag.m_Severity = eDiag_Fatal;
  263.     return diag;
  264. }
  265. inline
  266. const CNcbiDiag& Trace(const CNcbiDiag& diag)  {
  267.     diag << Endm;
  268.     diag.m_Severity = eDiag_Trace;
  269.     return diag;
  270. }
  271. ///////////////////////////////////////////////////////
  272. //  CDiagBuffer::
  273. inline
  274. void CDiagBuffer::Reset(const CNcbiDiag& diag) {
  275.     if (&diag == m_Diag)
  276.         m_Stream->rdbuf()->SEEKOFF(0, IOS_BASE::beg, IOS_BASE::out);
  277. }
  278. inline
  279. void CDiagBuffer::EndMess(const CNcbiDiag& diag) {
  280.     if (&diag == m_Diag)
  281.         Flush();
  282. }
  283. inline
  284. void CDiagBuffer::Detach(const CNcbiDiag* diag) {
  285.     if (diag == m_Diag) {
  286.         Flush();
  287.         m_Diag = 0;
  288.     }
  289. }
  290. inline
  291. bool CDiagBuffer::GetTraceEnabled(void) {
  292.     return (sm_TraceDefault == eDT_Default) ?
  293.         GetTraceEnabledFirstTime() : sm_TraceEnabled;
  294. }
  295. ///////////////////////////////////////////////////////
  296. //  EDiagPostFlag::
  297. inline
  298. bool IsSetDiagPostFlag(EDiagPostFlag flag, TDiagPostFlags flags) {
  299.     if (flags & eDPF_Default)
  300.         flags |= CDiagBuffer::sm_PostFlags;
  301.     return (flags & flag) != 0;
  302. }
  303. ///////////////////////////////////////////////////////
  304. //  CDiagMessage::
  305. inline
  306. SDiagMessage::SDiagMessage(EDiagSev severity,
  307.                            const char* buf, size_t len,
  308.                            const char* file, size_t line,
  309.                            TDiagPostFlags flags, const char* prefix,
  310.                            int err_code, int err_subcode,
  311.                            const char* err_text)
  312. {
  313.     m_Severity   = severity;
  314.     m_Buffer     = buf;
  315.     m_BufferLen  = len;
  316.     m_File       = file;
  317.     m_Line       = line;
  318.     m_Flags      = flags;
  319.     m_Prefix     = prefix;
  320.     m_ErrCode    = err_code;
  321.     m_ErrSubCode = err_subcode;
  322.     m_ErrText    = err_text;
  323. }
  324. ///////////////////////////////////////////////////////
  325. //  CDiagErrCodeInfo::
  326. inline
  327. CDiagErrCodeInfo::CDiagErrCodeInfo(void)
  328. {
  329.     return;
  330. }
  331. inline
  332. CDiagErrCodeInfo::CDiagErrCodeInfo(const string& file_name)
  333. {
  334.     if ( !Read(file_name) ) {
  335.         throw runtime_error
  336.             ("CDiagErrCodeInfo::  failed to read error descriptions from file "
  337.              + file_name);
  338.     }
  339. }
  340. inline
  341. CDiagErrCodeInfo::CDiagErrCodeInfo(CNcbiIstream& is)
  342. {
  343.     if ( !Read(is) ) {
  344.         throw runtime_error
  345.             ("CDiagErrCodeInfo::  failed to read error descriptions");
  346.     }
  347. }
  348. inline
  349. CDiagErrCodeInfo::~CDiagErrCodeInfo(void)
  350. {
  351.     Clear();
  352. }
  353. inline
  354. void CDiagErrCodeInfo::Clear(void)
  355. {
  356.     m_Info.clear();
  357. }
  358. inline
  359. void CDiagErrCodeInfo::SetDescription
  360. (const ErrCode&                 err_code, 
  361.  const SDiagErrCodeDescription& description)
  362. {
  363.     m_Info[err_code] = description;
  364. }
  365. inline
  366. bool CDiagErrCodeInfo::HaveDescription(const ErrCode& err_code) const
  367. {
  368.     return m_Info.find(err_code) != m_Info.end();
  369. }
  370. /*
  371.  * ===========================================================================
  372.  * $Log: ncbidiag.inl,v $
  373.  * Revision 1000.3  2004/06/01 19:08:00  gouriano
  374.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.43
  375.  *
  376.  * Revision 1.43  2004/04/26 19:28:24  ucko
  377.  * Make previous change compiler-dependent due to MSVC bugginess.
  378.  *
  379.  * Revision 1.42  2004/04/26 14:35:48  ucko
  380.  * Move CNcbiDiag::operator<< to ncbidiag.inl to make GCC 3.4 happy.
  381.  *
  382.  * Revision 1.41  2004/03/18 23:03:35  vakatov
  383.  * Cosmetics
  384.  *
  385.  * Revision 1.40  2004/03/18 22:49:32  vakatov
  386.  * SetDiagFixedPostLevel() -- get rid of extraneous and breaking 'const' in arg
  387.  *
  388.  * Revision 1.39  2004/03/10 19:54:12  gorelenk
  389.  * Changed NCBI_XNCBI_EXPORT prefixes for class CDiagBuffer members.
  390.  *
  391.  * Revision 1.38  2003/11/12 20:30:25  ucko
  392.  * Make extra flags for severity-trace messages tunable.
  393.  *
  394.  * Revision 1.37  2003/11/06 21:40:34  vakatov
  395.  * A somewhat more natural handling of the 'eDPF_Default' flag -- replace
  396.  * it by the current global flags, then merge these with other flags (if any)
  397.  *
  398.  * Revision 1.36  2003/04/25 20:53:16  lavr
  399.  * Introduce draft version of IgnoreDiagDieLevel()
  400.  * Clear error code/subcode from Endm() and Reset() manipulators
  401.  *
  402.  * Revision 1.35  2002/12/18 22:53:21  dicuccio
  403.  * Added export specifier for building DLLs in windows.  Added global list of
  404.  * all such specifiers in mswin_exports.hpp, included through ncbistl.hpp
  405.  *
  406.  * Revision 1.34  2002/08/01 18:48:08  ivanov
  407.  * Added stuff to store and output error verbose messages for error codes
  408.  *
  409.  * Revision 1.33  2002/07/10 16:18:43  ivanov
  410.  * Added CNcbiDiag::StrToSeverityLevel().
  411.  * Rewrite and rename SetDiagFixedStrPostLevel() -> SetDiagFixedPostLevel()
  412.  *
  413.  * Revision 1.32  2002/07/09 16:38:00  ivanov
  414.  * Added GetSeverityChangeEnabledFirstTime().
  415.  * Fix usage forced set severity post level from environment variable
  416.  * to work without NcbiApplication::AppMain()
  417.  *
  418.  * Revision 1.31  2002/07/02 18:26:08  ivanov
  419.  * Added CDiagBuffer::DisableDiagPostLevelChange()
  420.  *
  421.  * Revision 1.30  2002/06/26 18:36:37  gouriano
  422.  * added CNcbiException class
  423.  *
  424.  * Revision 1.29  2002/04/23 19:57:26  vakatov
  425.  * Made the whole CNcbiDiag class "mutable" -- it helps eliminate
  426.  * numerous warnings issued by SUN Forte6U2 compiler.
  427.  * Do not use #NO_INCLASS_TMPL anymore -- apparently all modern
  428.  * compilers seem to be supporting in-class template methods.
  429.  *
  430.  * Revision 1.28  2002/04/11 20:39:17  ivanov
  431.  * CVS log moved to end of the file
  432.  *
  433.  * Revision 1.27  2002/02/13 22:39:13  ucko
  434.  * Support AIX.
  435.  *
  436.  * Revision 1.26  2002/02/07 19:45:53  ucko
  437.  * Optionally transfer ownership in GetDiagHandler.
  438.  *
  439.  * Revision 1.25  2001/11/14 15:14:59  ucko
  440.  * Revise diagnostic handling to be more object-oriented.
  441.  *
  442.  * Revision 1.24  2001/10/29 15:16:11  ucko
  443.  * Preserve default CGI diagnostic settings, even if customized by app.
  444.  *
  445.  * Revision 1.23  2001/10/16 23:44:05  vakatov
  446.  * + SetDiagPostAllFlags()
  447.  *
  448.  * Revision 1.22  2001/06/14 03:37:28  vakatov
  449.  * For the ErrCode manipulator, use CNcbiDiag:: method rather than a friend
  450.  *
  451.  * Revision 1.21  2001/06/13 23:19:36  vakatov
  452.  * Revamped previous revision (prefix and error codes)
  453.  *
  454.  * Revision 1.20  2001/06/13 20:51:52  ivanov
  455.  * + PushDiagPostPrefix(),PopPushDiagPostPrefix() - stack post prefix messages.
  456.  * + ERR_POST_EX, LOG_POST_EX - macros for posting with error codes.
  457.  * + ErrCode(code[,subcode]) - CNcbiDiag error code manipulator.
  458.  * + eDPF_ErrCode, eDPF_ErrSubCode - new post flags.
  459.  *
  460.  * Revision 1.19  2001/05/17 14:51:04  lavr
  461.  * Typos corrected
  462.  *
  463.  * Revision 1.18  2000/04/04 22:31:57  vakatov
  464.  * SetDiagTrace() -- auto-set basing on the application
  465.  * environment and/or registry
  466.  *
  467.  * Revision 1.17  2000/02/18 16:54:04  vakatov
  468.  * + eDiag_Critical
  469.  *
  470.  * Revision 1.16  2000/01/20 16:52:30  vakatov
  471.  * SDiagMessage::Write() to replace SDiagMessage::Compose()
  472.  * + operator<<(CNcbiOstream& os, const SDiagMessage& mess)
  473.  * + IsSetDiagHandler(), IsDiagStream()
  474.  *
  475.  * Revision 1.15  1999/12/29 22:30:22  vakatov
  476.  * Use "exit()" rather than "abort()" in non-#_DEBUG mode
  477.  *
  478.  * Revision 1.14  1999/12/28 18:55:24  vasilche
  479.  * Reduced size of compiled object files:
  480.  * 1. avoid inline or implicit virtual methods (especially destructors).
  481.  * 2. avoid std::string's methods usage in inline methods.
  482.  * 3. avoid string literals ("xxx") in inline methods.
  483.  *
  484.  * Revision 1.13  1999/09/27 16:23:20  vasilche
  485.  * Changed implementation of debugging macros (_TRACE, _THROW*, _ASSERT etc),
  486.  * so that they will be much easier for compilers to eat.
  487.  *
  488.  * Revision 1.12  1999/05/14 16:23:18  vakatov
  489.  * CDiagBuffer::Reset: easy fix
  490.  *
  491.  * Revision 1.11  1999/05/12 21:11:42  vakatov
  492.  * Minor fixes to compile by the Mac CodeWarrior C++ compiler
  493.  *
  494.  * Revision 1.10  1999/05/04 00:03:07  vakatov
  495.  * Removed the redundant severity arg from macro ERR_POST()
  496.  *
  497.  * Revision 1.9  1999/04/30 19:20:58  vakatov
  498.  * Added more details and more control on the diagnostics
  499.  * See #ERR_POST, EDiagPostFlag, and ***DiagPostFlag()
  500.  *
  501.  * Revision 1.8  1998/12/30 21:52:17  vakatov
  502.  * Fixed for the new SunPro 5.0 beta compiler that does not allow friend
  503.  * templates and member(in-class) templates
  504.  *
  505.  * Revision 1.7  1998/11/05 00:00:42  vakatov
  506.  * Fix in CDiagBuffer::Reset() to avoid "!=" ambiguity when using
  507.  * new(templated) streams
  508.  *
  509.  * Revision 1.6  1998/11/04 23:46:36  vakatov
  510.  * Fixed the "ncbidbg/diag" header circular dependencies
  511.  *
  512.  * Revision 1.5  1998/11/03 22:28:33  vakatov
  513.  * Renamed Die/Post...Severity() to ...Level()
  514.  *
  515.  * Revision 1.4  1998/11/03 20:51:24  vakatov
  516.  * Adaptation for the SunPro compiler glitchs(see conf. #NO_INCLASS_TMPL)
  517.  *
  518.  * Revision 1.3  1998/10/30 20:08:25  vakatov
  519.  * Fixes to (first-time) compile and test-run on MSVS++
  520.  * ==========================================================================
  521.  */
  522. #endif /* def CORELIB___NCBIDIAG__HPP  &&  ndef CORELIB___NCBIDIAG__INL */