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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: hookdata.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 19:40:15  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.10
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: hookdata.cpp,v 1000.2 2004/06/01 19:40:15 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: Eugene Vasilchenko
  35. *
  36. * File Description:
  37. *   Class for storing local hooks information in CTypeInfo
  38. *
  39. * ---------------------------------------------------------------------------
  40. * $Log: hookdata.cpp,v $
  41. * Revision 1000.2  2004/06/01 19:40:15  gouriano
  42. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.10
  43. *
  44. * Revision 1.10  2004/05/17 21:03:02  gorelenk
  45. * Added include of PCH ncbi_pch.hpp
  46. *
  47. * Revision 1.9  2004/01/05 14:25:20  gouriano
  48. * Added possibility to set serialization hooks by stack path
  49. *
  50. * Revision 1.8  2003/08/19 18:32:38  vasilche
  51. * Optimized reading and writing strings.
  52. * Avoid string reallocation when checking char values.
  53. * Try to reuse old string data when string reference counting is not working.
  54. *
  55. * Revision 1.7  2003/07/29 20:36:48  vasilche
  56. * Fixed warnings on Windows.
  57. *
  58. * Revision 1.6  2003/07/29 18:59:21  vasilche
  59. * Fixed compilation errors.
  60. *
  61. * Revision 1.5  2003/07/29 18:47:47  vasilche
  62. * Fixed thread safeness of object stream hooks.
  63. *
  64. * Revision 1.4  2002/11/04 21:29:20  grichenk
  65. * Fixed usage of const CRef<> and CRef<> constructor
  66. *
  67. * Revision 1.3  2001/01/05 20:10:50  vasilche
  68. * CByteSource, CIStrBuffer, COStrBuffer, CLightString, CChecksum, CWeakMap
  69. * were moved to util.
  70. *
  71. * Revision 1.2  2000/10/13 16:28:39  vasilche
  72. * Reduced header dependency.
  73. * Avoid use of templates with virtual methods.
  74. * Reduced amount of different maps used.
  75. * All this lead to smaller compiled code size (libraries and programs).
  76. *
  77. * Revision 1.1  2000/10/03 17:22:42  vasilche
  78. * Reduced header dependency.
  79. * Reduced size of debug libraries on WorkShop by 3 times.
  80. * Fixed tag allocation for parent classes.
  81. * Fixed CObject allocation/deallocation in streams.
  82. * Moved instantiation of several templates in separate source file.
  83. *
  84. * ===========================================================================
  85. */
  86. #include <ncbi_pch.hpp>
  87. #include <corelib/ncbistd.hpp>
  88. #include <serial/hookdata.hpp>
  89. #include <serial/objstack.hpp>
  90. BEGIN_NCBI_SCOPE
  91. /////////////////////////////////////////////////////////////////////////////
  92. // CHookDataBase
  93. /////////////////////////////////////////////////////////////////////////////
  94. CHookDataBase::CHookDataBase(void)
  95. {
  96.     m_HookCount.Set(0);
  97. }
  98. CHookDataBase::~CHookDataBase(void)
  99. {
  100.     _ASSERT(m_HookCount.Get() == 0);
  101. }
  102. void CHookDataBase::SetLocalHook(TLocalHooks& key, THook* hook)
  103. {
  104.     _ASSERT(hook);
  105.     _ASSERT(m_HookCount.Get() >= (m_GlobalHook? 1: 0));
  106.     key.SetHook(this, hook);
  107.     m_HookCount.Add(1);
  108.     _ASSERT(m_HookCount.Get() > (m_GlobalHook? 1: 0));
  109.     _ASSERT(!Empty());
  110. }
  111. void CHookDataBase::ResetLocalHook(TLocalHooks& key)
  112. {
  113.     _ASSERT(!Empty());
  114.     _ASSERT(m_HookCount.Get() > (m_GlobalHook? 1: 0));
  115.     key.ResetHook(this);
  116.     m_HookCount.Add(-1);
  117.     _ASSERT(m_HookCount.Get() >= (m_GlobalHook? 1: 0));
  118. }
  119. void CHookDataBase::ForgetLocalHook(TLocalHooks& _DEBUG_ARG(key))
  120. {
  121.     _ASSERT(!Empty());
  122.     _ASSERT(m_HookCount.Get() > (m_GlobalHook? 1: 0));
  123.     _ASSERT(key.GetHook(this) != 0);
  124.     m_HookCount.Add(-1);
  125.     _ASSERT(m_HookCount.Get() >= (m_GlobalHook? 1: 0));
  126. }
  127. void CHookDataBase::SetGlobalHook(THook* hook)
  128. {
  129.     _ASSERT(hook);
  130.     _ASSERT(!m_GlobalHook);
  131.     _ASSERT(m_HookCount.Get() >= 0);
  132.     m_GlobalHook.Reset(hook);
  133.     m_HookCount.Add(1);
  134.     _ASSERT(m_HookCount.Get() > 0);
  135.     _ASSERT(!Empty());
  136. }
  137. void CHookDataBase::ResetGlobalHook(void)
  138. {
  139.     _ASSERT(!Empty());
  140.     _ASSERT(m_GlobalHook);
  141.     _ASSERT(m_HookCount.Get() > 0);
  142.     m_GlobalHook.Reset();
  143.     m_HookCount.Add(-1);
  144.     _ASSERT(m_HookCount.Get() >= 0);
  145. }
  146. void CHookDataBase::SetPathHook(CObjectStack* stk, const string& path, THook* hook)
  147. {
  148.     if (m_PathHooks.SetHook(stk, path, hook)) {
  149.         m_HookCount.Add(1);
  150.     }
  151. }
  152. void CHookDataBase::ResetPathHook(CObjectStack* stk, const string& path)
  153. {
  154.     if (m_PathHooks.SetHook(stk, path, 0)) {
  155.         m_HookCount.Add(-1);
  156.     }
  157. }
  158. END_NCBI_SCOPE