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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: hookdata.hpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/04/12 17:14:42  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.8
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef HOOKDATA__HPP
  10. #define HOOKDATA__HPP
  11. /*  $Id: hookdata.hpp,v 1000.1 2004/04/12 17:14:42 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: Eugene Vasilchenko
  37. *
  38. * File Description:
  39. *   !!! PUT YOUR DESCRIPTION HERE !!!
  40. */
  41. #include <corelib/ncbistd.hpp>
  42. #include <corelib/ncbicntr.hpp>
  43. #include <serial/hookdatakey.hpp>
  44. #include <serial/pathhook.hpp>
  45. /** @addtogroup HookSupport
  46.  *
  47.  * @{
  48.  */
  49. BEGIN_NCBI_SCOPE
  50. class CObject;
  51. class CLocalHookSetBase;
  52. class NCBI_XSERIAL_EXPORT CHookDataBase
  53. {
  54. public:
  55.     CHookDataBase(void);
  56.     ~CHookDataBase(void);
  57.     bool HaveHooks(void) const
  58.         {
  59.             //return m_Data != 0;
  60.             return m_HookCount.Get() != 0;
  61.         }
  62. protected:
  63.     bool Empty(void) const
  64.         {
  65.             //return m_Data == 0;
  66.             return m_HookCount.Get() == 0;
  67.         }
  68.     typedef CLocalHookSetBase TLocalHooks;
  69.     typedef CObject THook;
  70.     void SetLocalHook(TLocalHooks& key, THook* hook);
  71.     void SetGlobalHook(THook* hook);
  72.     void SetPathHook(CObjectStack* stk, const string& path, THook* hook);
  73.     void ResetLocalHook(TLocalHooks& key);
  74.     void ResetGlobalHook(void);
  75.     void ResetPathHook(CObjectStack* stk, const string& path);
  76.     void ForgetLocalHook(TLocalHooks& key);
  77.     THook* GetHook(const TLocalHooks& key) const
  78.         {
  79.             const THook* hook = key.GetHook(this);
  80.             if ( !hook ) {
  81.                 hook = m_GlobalHook.GetPointer();
  82.             }
  83.             return const_cast<THook*>(hook);
  84.         }
  85.     THook* GetPathHook(CObjectStack& stk) const
  86.         {
  87.             return const_cast<THook*>(m_PathHooks.GetHook(stk));
  88.         }
  89. private:
  90.     friend class CLocalHookSetBase;
  91.     CRef<THook>    m_GlobalHook;
  92.     CPathHook      m_PathHooks;
  93.     CAtomicCounter m_HookCount; // including global hook
  94. };
  95. template<class Hook, typename Function>
  96. class CHookData : public CHookDataBase
  97. {
  98.     typedef CHookDataBase CParent;
  99. public:
  100.     typedef Hook THook;
  101.     typedef Function TFunction;
  102.     typedef CLocalHookSet<THook> TLocalHooks;
  103.     CHookData(TFunction typeFunction, TFunction hookFunction)
  104.         : m_CurrentFunction(typeFunction),
  105.           m_DefaultFunction(typeFunction),
  106.           m_HookFunction(hookFunction)
  107.         {
  108.         }
  109.     TFunction GetCurrentFunction(void) const
  110.         {
  111.             return m_CurrentFunction;
  112.         }
  113.     TFunction GetDefaultFunction(void) const
  114.         {
  115.             return m_DefaultFunction;
  116.         }
  117.     void SetDefaultFunction(const TFunction& func)
  118.         {
  119.             m_DefaultFunction = func;
  120.             if ( !HaveHooks() ) {
  121.                 m_CurrentFunction = func;
  122.             }
  123.         }
  124.     void SetLocalHook(TLocalHooks& key, THook* hook)
  125.         {
  126.             CParent::SetLocalHook(key, hook);
  127.             m_CurrentFunction = m_HookFunction;
  128.         }
  129.     void SetGlobalHook(THook* hook)
  130.         {
  131.             CParent::SetGlobalHook(hook);
  132.             m_CurrentFunction = m_HookFunction;
  133.         }
  134.     void SetPathHook(CObjectStack* stk, const string& path, THook* hook)
  135.         {
  136.             CParent::SetPathHook(stk, path, hook);
  137.             m_CurrentFunction = m_HookFunction;
  138.         }
  139.     void ResetLocalHook(TLocalHooks& key)
  140.         {
  141.             CParent::ResetLocalHook(key);
  142.             m_CurrentFunction = HaveHooks()? m_HookFunction: m_DefaultFunction;
  143.         }
  144.     void ResetGlobalHook(void)
  145.         {
  146.             CParent::ResetGlobalHook();
  147.             m_CurrentFunction = HaveHooks()? m_HookFunction: m_DefaultFunction;
  148.         }
  149.     void ResetPathHook(CObjectStack* stk, const string& path)
  150.         {
  151.             CParent::ResetPathHook(stk, path);
  152.             m_CurrentFunction = HaveHooks()? m_HookFunction: m_DefaultFunction;
  153.         }
  154.     THook* GetHook(const TLocalHooks& key) const
  155.         {
  156.             return static_cast<THook*>(CParent::GetHook(key));
  157.         }
  158.     THook* GetPathHook(CObjectStack& stk) const
  159.         {
  160.             return static_cast<THook*>(CParent::GetPathHook(stk));
  161.         }
  162. private:
  163.     TFunction m_CurrentFunction;   // current function
  164.     TFunction m_DefaultFunction;
  165.     TFunction m_HookFunction;
  166. };
  167. END_NCBI_SCOPE
  168. #endif  /* HOOKDATA__HPP */
  169. /* @} */
  170. /* ---------------------------------------------------------------------------
  171. * $Log: hookdata.hpp,v $
  172. * Revision 1000.1  2004/04/12 17:14:42  gouriano
  173. * PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.8
  174. *
  175. * Revision 1.8  2004/01/05 14:24:07  gouriano
  176. * Added possibility to set serialization hooks by stack path
  177. *
  178. * Revision 1.7  2003/07/29 18:47:46  vasilche
  179. * Fixed thread safeness of object stream hooks.
  180. *
  181. * Revision 1.6  2003/04/15 14:15:13  siyan
  182. * Added doxygen support
  183. *
  184. * Revision 1.5  2002/12/23 18:38:51  dicuccio
  185. * Added WIn32 export specifier: NCBI_XSERIAL_EXPORT.
  186. * Moved all CVS logs to the end.
  187. *
  188. * Revision 1.4  2000/10/13 16:28:30  vasilche
  189. * Reduced header dependency.
  190. * Avoid use of templates with virtual methods.
  191. * Reduced amount of different maps used.
  192. * All this lead to smaller compiled code size (libraries and programs).
  193. *
  194. * Revision 1.3  2000/10/03 17:22:31  vasilche
  195. * Reduced header dependency.
  196. * Reduced size of debug libraries on WorkShop by 3 times.
  197. * Fixed tag allocation for parent classes.
  198. * Fixed CObject allocation/deallocation in streams.
  199. * Moved instantiation of several templates in separate source file.
  200. *
  201. * Revision 1.2  2000/09/29 16:18:12  vasilche
  202. * Fixed binary format encoding/decoding on 64 bit compulers.
  203. * Implemented CWeakMap<> for automatic cleaning map entries.
  204. * Added cleaning local hooks via CWeakMap<>.
  205. * Renamed ReadTypeName -> ReadFileHeader, ENoTypeName -> ENoFileHeader.
  206. * Added some user interface methods to CObjectIStream, CObjectOStream and
  207. * CObjectStreamCopier.
  208. *
  209. * Revision 1.1  2000/09/18 20:00:01  vasilche
  210. * Separated CVariantInfo and CMemberInfo.
  211. * Implemented copy hooks.
  212. * All hooks now are stored in CTypeInfo/CMemberInfo/CVariantInfo.
  213. * Most type specific functions now are implemented via function pointers instead of virtual functions.
  214. *
  215. * ===========================================================================
  216. */