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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: weakmap.inl,v $
  4.  * PRODUCTION Revision 1000.0  2003/10/29 15:33:24  gouriano
  5.  * PRODUCTION PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R1.7
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #if defined(WEAKMAP__HPP)  &&  !defined(WEAKMAP__INL)
  10. #define WEAKMAP__INL
  11. /*  $Id: weakmap.inl,v 1000.0 2003/10/29 15:33:24 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. *   Inline methods for classes defined in weakmap.hpp
  40. *
  41. * ---------------------------------------------------------------------------
  42. * $Log: weakmap.inl,v $
  43. * Revision 1000.0  2003/10/29 15:33:24  gouriano
  44. * PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R1.7
  45. *
  46. * Revision 1.7  2001/05/17 15:01:19  lavr
  47. * Typos corrected
  48. *
  49. * Revision 1.6  2001/01/05 20:08:54  vasilche
  50. * Added util directory for various algorithms and utility classes.
  51. *
  52. * Revision 1.5  2000/12/26 22:23:46  vasilche
  53. * Fixed errors of compilation on Mac.
  54. *
  55. * Revision 1.4  2000/10/20 15:51:28  vasilche
  56. * Fixed data error processing.
  57. * Added interface for constructing container objects directly into output stream.
  58. * object.hpp, object.inl and object.cpp were split to
  59. * objectinfo.*, objecttype.*, objectiter.* and objectio.*.
  60. *
  61. * Revision 1.3  2000/10/13 16:28:34  vasilche
  62. * Reduced header dependency.
  63. * Avoid use of templates with virtual methods.
  64. * Reduced amount of different maps used.
  65. * All this lead to smaller compiled code size (libraries and programs).
  66. *
  67. * Revision 1.2  2000/09/29 20:14:30  vasilche
  68. * Fixed name conflict (map).
  69. *
  70. * Revision 1.1  2000/09/29 16:18:16  vasilche
  71. * Fixed binary format encoding/decoding on 64 bit compulers.
  72. * Implemented CWeakMap<> for automatic cleaning map entries.
  73. * Added cleaning local hooks via CWeakMap<>.
  74. * Renamed ReadTypeName -> ReadFileHeader, ENoTypeName -> ENoFileHeader.
  75. * Added some user interface methods to CObjectIStream, CObjectOStream and
  76. * CObjectStreamCopier.
  77. *
  78. * ===========================================================================
  79. */
  80. template<class Object>
  81. inline
  82. void CWeakMapKey<Object>::Register(TWeakMap* m)
  83. {
  84.     _ASSERT(m_Maps.find(m) == m_Maps.end());
  85.     m_Maps.insert(m);
  86. }
  87. template<class Object>
  88. inline
  89. void CWeakMapKey<Object>::Deregister(TWeakMap* m)
  90. {
  91.     _ASSERT(m_Maps.find(m) != m_Maps.end());
  92.     m_Maps.erase(m);
  93. }
  94. template<class Object>
  95. inline
  96. size_t CWeakMap<Object>::size(void) const
  97. {
  98.     return m_Map.size();
  99. }
  100. template<class Object>
  101. inline
  102. bool CWeakMap<Object>::empty(void) const
  103. {
  104.     return m_Map.empty();
  105. }
  106. template<class Object>
  107. inline
  108. CWeakMap<Object>::CWeakMap(void)
  109. {
  110. }
  111. template<class Object>
  112. inline
  113. CWeakMap<Object>::~CWeakMap(void)
  114. {
  115.     while ( !empty() ) {
  116.         erase(*(m_Map.begin()->first));
  117.     }
  118. }
  119. template<class Object>
  120. inline
  121. void CWeakMap<Object>::insert(key_type& key, const mapped_type& object)
  122. {
  123.     pair<TMap::iterator, bool> insert =
  124.         m_Map.insert(TMap::value_type(&key, object));
  125.     if ( insert.second ) {
  126.         key.Register(this);
  127.     }
  128.     else {
  129.         insert.first->second = object;
  130.     }
  131. }
  132. template<class Object>
  133. inline
  134. void CWeakMap<Object>::erase(key_type& key)
  135. {
  136.     TMap::iterator mi = m_Map.find(&key);
  137.     if ( mi != m_Map.end() ) {
  138.         m_Map.erase(mi);
  139.         key.Deregister(this);
  140.     }
  141. }
  142. template<class Object>
  143. inline
  144. void CWeakMap<Object>::Forget(key_type& key)
  145. {
  146.     _ASSERT(m_Map.find(&key) != m_Map.end());
  147.     m_Map.erase(&key);
  148.     key.Deregister(this);
  149. }
  150. template<class Object>
  151. inline
  152. typename CWeakMap<Object>::const_iterator
  153. CWeakMap<Object>::find(key_type& key) const
  154. {
  155.     return m_Map.find(&key);
  156. }
  157. template<class Object>
  158. inline
  159. typename CWeakMap<Object>::iterator
  160. CWeakMap<Object>::find(key_type& key)
  161. {
  162.     return m_Map.find(&key);
  163. }
  164. template<class Object>
  165. inline
  166. typename CWeakMap<Object>::const_iterator
  167. CWeakMap<Object>::begin(void) const
  168. {
  169.     return m_Map.begin();
  170. }
  171. template<class Object>
  172. inline
  173. typename CWeakMap<Object>::iterator
  174. CWeakMap<Object>::begin(void)
  175. {
  176.     return m_Map.begin();
  177. }
  178. template<class Object>
  179. inline
  180. typename CWeakMap<Object>::const_iterator
  181. CWeakMap<Object>::end(void) const
  182. {
  183.     return m_Map.end();
  184. }
  185. template<class Object>
  186. inline
  187. typename CWeakMap<Object>::iterator
  188. CWeakMap<Object>::end(void)
  189. {
  190.     return m_Map.end();
  191. }
  192. template<class Object>
  193. inline
  194. CWeakMapKey<Object>::CWeakMapKey(void)
  195. {
  196. }
  197. template<class Object>
  198. inline
  199. CWeakMapKey<Object>::~CWeakMapKey(void)
  200. {
  201.     while ( !m_Maps.empty() ) {
  202.         (*m_Maps.begin())->Forget(*this);
  203.     }
  204. }
  205. #endif /* def WEAKMAP__HPP  &&  ndef WEAKMAP__INL */