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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: weakmap.hpp,v $
  4.  * PRODUCTION Revision 1000.0  2003/10/29 15:33:16  gouriano
  5.  * PRODUCTION PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R1.5
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef WEAKMAP__HPP
  10. #define WEAKMAP__HPP
  11. /*  $Id: weakmap.hpp,v 1000.0 2003/10/29 15:33:16 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. *   CWeakMap<Object> template work like STL map<> with the only difference:
  40. *       it automatically forgets entries with key which are deleted.
  41. *       To do this, key type is fixed - CWeakMapKey<Object>.
  42. *   CWeakMap<Object> defines mostly used methods from map<>.
  43. *
  44. * ---------------------------------------------------------------------------
  45. * $Log: weakmap.hpp,v $
  46. * Revision 1000.0  2003/10/29 15:33:16  gouriano
  47. * PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R1.5
  48. *
  49. * Revision 1.5  2003/04/17 17:50:41  siyan
  50. * Added doxygen support
  51. *
  52. * Revision 1.4  2002/12/19 14:51:00  dicuccio
  53. * Added export specifier for Win32 DLL builds.
  54. *
  55. * Revision 1.3  2001/01/05 20:08:53  vasilche
  56. * Added util directory for various algorithms and utility classes.
  57. *
  58. * Revision 1.2  2000/10/13 16:28:34  vasilche
  59. * Reduced header dependency.
  60. * Avoid use of templates with virtual methods.
  61. * Reduced amount of different maps used.
  62. * All this lead to smaller compiled code size (libraries and programs).
  63. *
  64. * Revision 1.1  2000/09/29 16:18:16  vasilche
  65. * Fixed binary format encoding/decoding on 64 bit compulers.
  66. * Implemented CWeakMap<> for automatic cleaning map entries.
  67. * Added cleaning local hooks via CWeakMap<>.
  68. * Renamed ReadTypeName -> ReadFileHeader, ENoTypeName -> ENoFileHeader.
  69. * Added some user interface methods to CObjectIStream, CObjectOStream and
  70. * CObjectStreamCopier.
  71. *
  72. * ===========================================================================
  73. */
  74. #include <corelib/ncbistd.hpp>
  75. #include <map>
  76. #include <set>
  77. /** @addtogroup WeakMap
  78.  *
  79.  * @{
  80.  */
  81. BEGIN_NCBI_SCOPE
  82. /*
  83. //   Generic example of usage of these templates:
  84. class NCBI_XUTIL_EXPORT CKey
  85. {
  86. public:
  87.     CWeakMapKey<string> m_MapKey;
  88. };
  89. void Test(void)
  90. {
  91.     // declare map object
  92.     CWeakMap<string> map;
  93.     {
  94.         // declare temporary key object
  95.         CWeakMapKey<string> key;
  96.         // insert string value
  97.         map.insert(key, "value");
  98.         cout << map.size(); // == 1
  99.         cout << map.empty(); // == false
  100.     } // end of block: key object is destructed and map forgets about value
  101.     cout << map.size(); // == 0
  102.     cout << map.empty(); // == true
  103. };
  104. */
  105. template<class Object> class CWeakMap;
  106. template<class Object> class CWeakMapKey;
  107. template<class Object>
  108. class CWeakMapKey
  109. {
  110. public:
  111.     typedef Object mapped_type;
  112.     typedef CWeakMap<mapped_type> TWeakMap;
  113.     CWeakMapKey(void);
  114.     ~CWeakMapKey(void);
  115. private:
  116.     friend class CWeakMap<mapped_type>;
  117.     void Register(TWeakMap* map);
  118.     void Deregister(TWeakMap* map);
  119.     typedef set<TWeakMap*> TMapSet;
  120.     TMapSet m_Maps;
  121. };
  122. template<class Object>
  123. class CWeakMap
  124. {
  125. public:
  126.     typedef Object mapped_type;
  127.     typedef CWeakMapKey<mapped_type> key_type;
  128.     typedef map<key_type*, mapped_type> TMap;
  129.     typedef typename TMap::value_type value_type;
  130.     typedef typename TMap::const_iterator const_iterator;
  131.     typedef typename TMap::iterator iterator;
  132. public:
  133.     CWeakMap(void);
  134.     ~CWeakMap(void);
  135.     size_t size(void) const;
  136.     bool empty(void) const;
  137.     void insert(key_type& key, const mapped_type& object);
  138.     void erase(key_type& key);
  139.     const_iterator find(key_type& key) const;
  140.     iterator find(key_type& key);
  141.     const_iterator begin(void) const;
  142.     iterator begin(void);
  143.     const_iterator end(void) const;
  144.     iterator end(void);
  145. private:
  146.     friend class CWeakMapKey<mapped_type>;
  147.     void Forget(key_type& key);
  148.     TMap m_Map;
  149. };
  150. /* @} */
  151. #include <util/weakmap.inl>
  152. END_NCBI_SCOPE
  153. #endif  /* WEAKMAP__HPP */