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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: pathhook.hpp,v $
  4.  * PRODUCTION Revision 1000.0  2004/04/12 17:21:02  gouriano
  5.  * PRODUCTION PRODUCTION: IMPORTED [CATCHUP_003] Dev-tree R1.1
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef PATHHOOK__HPP
  10. #define PATHHOOK__HPP
  11. /*  $Id: pathhook.hpp,v 1000.0 2004/04/12 17:21:02 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. *   Helper classes to set serialization hooks by stack path
  40. */
  41. #include <corelib/ncbistd.hpp>
  42. #include <corelib/ncbiobj.hpp>
  43. /** @addtogroup ObjStreamSupport
  44.  *
  45.  * @{
  46.  */
  47. BEGIN_NCBI_SCOPE
  48. class CItemInfo;
  49. class CObjectStack;
  50. class CTypeInfo;
  51. class CPathHook : protected multimap<CObjectStack*, pair<string, CRef<CObject> > >
  52. {
  53. public:
  54.     CPathHook(void);
  55.     ~CPathHook(void);
  56.     bool     IsEmpty(void) const {return m_Empty;}
  57.     bool     SetHook(CObjectStack* stk, const string& path, CObject* hook);
  58.     CObject* GetHook(CObjectStack& stk) const;
  59.     static bool Match(const string& mask, const string& path);
  60. private:
  61.     CObject* x_Get(CObjectStack& stk, const string& path) const;
  62.     bool m_Empty;
  63.     bool m_Regular;
  64.     bool m_All;
  65.     bool m_Wildcard;
  66. };
  67. class CStreamPathHookBase : protected map<string,CRef<CObject> >
  68. {
  69. public:
  70.     CStreamPathHookBase(void);
  71.     ~CStreamPathHookBase(void);
  72.     bool     IsEmpty(void) const {return m_Empty;}
  73.     bool     SetHook(const string& path, CObject* hook);
  74.     CObject* GetHook(CObjectStack& stk) const;
  75.     static CTypeInfo* FindType(const CObjectStack& stk);
  76.     static CItemInfo* FindItem(const CObjectStack& stk);
  77. private:
  78.     CObject* x_Get(const string& path) const;
  79.     bool m_Empty;
  80.     bool m_Regular;
  81.     bool m_All;
  82.     bool m_Member;
  83.     bool m_Wildcard;
  84. };
  85. template <typename TInfo, typename THook>
  86. class CStreamPathHook : public CStreamPathHookBase
  87. {
  88. public:
  89.     void SetHook(const string& path, THook hook)
  90.     {
  91.         CStreamPathHookBase::SetHook(path,hook);
  92.     }
  93.     THook GetHook(CObjectStack& stk) const
  94.     {
  95.         return static_cast<THook>(CStreamPathHookBase::GetHook(stk));
  96.     }
  97.     static TInfo FindItem(const CObjectStack& stk)
  98.     {
  99.         return dynamic_cast<TInfo>(CStreamPathHookBase::FindItem(stk));
  100.     } 
  101. };
  102. template <typename THook>
  103. class CStreamObjectPathHook : public CStreamPathHookBase
  104. {
  105. public:
  106.     void SetHook(const string& path, THook hook)
  107.     {
  108.         CStreamPathHookBase::SetHook(path,hook);
  109.     }
  110.     THook GetHook(CObjectStack& stk) const
  111.     {
  112.         return static_cast<THook>(CStreamPathHookBase::GetHook(stk));
  113.     }
  114. };
  115. END_NCBI_SCOPE
  116. #endif  /* PATHHOOK__HPP */
  117. /* @} */
  118. /* ---------------------------------------------------------------------------
  119. * $Log: pathhook.hpp,v $
  120. * Revision 1000.0  2004/04/12 17:21:02  gouriano
  121. * PRODUCTION: IMPORTED [CATCHUP_003] Dev-tree R1.1
  122. *
  123. * Revision 1.1  2004/01/05 14:24:09  gouriano
  124. * Added possibility to set serialization hooks by stack path
  125. *
  126. *
  127. * ===========================================================================
  128. */