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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: resource_pool.hpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/04/13 17:22:55  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.5
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef UTIL___RESOURCEPOOL__HPP
  10. #define UTIL___RESOURCEPOOL__HPP
  11. /*  $Id: resource_pool.hpp,v 1000.1 2004/04/13 17:22:55 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:  Anatoliy Kuznetsov
  37.  *    General purpose resource pool.
  38.  */
  39. #include <corelib/ncbistd.hpp>
  40. #include <vector>
  41. BEGIN_NCBI_SCOPE
  42. /** @addtogroup ResourcePool
  43.  *
  44.  * @{
  45.  */
  46. /// General purpose resource pool.
  47. ///
  48. /// Intended use is to store heavy reusable objects.
  49. /// Pool frees all vacant objects only upon pools destruction.
  50. /// Subsequent Get/Put calls does not result in objects reallocations and
  51. /// reinitializations. (So the prime target is performance optimization).
  52. /// Class is intentinally light weight and unsophisticated.
  53. template<class Value>
  54. class CResourcePool
  55. {
  56. public: 
  57.     typedef Value                       TValue;
  58.     typedef Value*                      TValuePtr;
  59.     typedef vector<Value*>              TPoolList;
  60. public:
  61.     CResourcePool()
  62.     {}
  63.     ~CResourcePool()
  64.     {
  65.         ITERATE(typename TPoolList, it, m_FreeObjects) {
  66.             Value* v = *it;
  67.             delete v;
  68.         }
  69.     }
  70.     /// Get object from the pool. 
  71.     ///
  72.     /// Pool makes no reinitialization or constructor 
  73.     /// call and object is returned in the same state it was put.
  74.     /// If pool has no vacant objects, new is called to produce an object.
  75.     /// Caller is responsible for deletion or returning object back to the pool.
  76.     Value* Get()
  77.     {
  78.         Value* v;
  79.         if (m_FreeObjects.empty()) {
  80.             v = new Value;
  81.         } else {
  82.             typename TPoolList::iterator it = m_FreeObjects.end();
  83.             v = *(--it);
  84.             m_FreeObjects.pop_back();
  85.         }
  86.         return v;
  87.     }
  88.     /// Put object into the pool. 
  89.     ///
  90.     /// Pool does not check if object is actually
  91.     /// originated in the very same pool. It's ok to get an object from one pool
  92.     /// and return it to another pool.
  93.     /// Method does NOT immidiately destroy the object v. 
  94.     void Put(Value* v)
  95.     {
  96.         _ASSERT(v);
  97.         m_FreeObjects.push_back(v);
  98.     }
  99.     void Return(Value* v) { Put(v); }
  100.     /// Makes the pool to forget the object.
  101.     ///
  102.     /// Method scans the free objects list, finds the object and removes
  103.     /// it from the structure. It is important that the object is not
  104.     /// deleted and it is responsibility of the caller to destroy it.
  105.     ///
  106.     /// @return NULL if object does not belong to the pool or 
  107.     ///    object's pointer otherwise.
  108.     Value* Forget(Value* v)
  109.     {
  110.         NON_CONST_ITERATE(typename TPoolList, it, m_FreeObjects) {
  111.             Value* vp = *it;
  112.             if (v == vp) {
  113.                 m_FreeObjects.erase(it);
  114.                 return v;
  115.             }
  116.         }
  117.         return 0;
  118.     }
  119.     /// Makes pool to forget all objects
  120.     ///
  121.     /// Method removes all objects from the internal list but does NOT
  122.     /// deallocate the objects.
  123.     void ForgetAll()
  124.     {
  125.         m_FreeObjects.clear();
  126.     }
  127.     /// Get internal list of free objects
  128.     TPoolList& GetFreeList() { return m_FreeObjects; }
  129.     /// Get internal list of free objects
  130.     const TPoolList& GetFreeList() const { return m_FreeObjects; }
  131. protected:
  132.     CResourcePool(const CResourcePool&);
  133.     CResourcePool& operator=(const CResourcePool&);
  134. protected:
  135.     TPoolList   m_FreeObjects;
  136. };
  137. /// Guard object. Returns object pointer to the pool upon destruction.
  138. /// @sa CResourcePool
  139. template<class Pool>
  140. class CResourcePoolGuard
  141. {
  142. public:
  143.     CResourcePoolGuard(Pool& pool, typename Pool::TValue* v)
  144.     : m_Pool(pool),
  145.       m_Value(v)
  146.     {}
  147.     ~CResourcePoolGuard()
  148.     {
  149.         m_Pool.Return(m_Value);
  150.     }
  151. private:
  152.     Pool&                     m_Pool;
  153.     typename Pool::TValue*    m_Value;
  154. };
  155. /* @} */
  156. END_NCBI_SCOPE
  157. /*
  158.  * ===========================================================================
  159.  * $Log: resource_pool.hpp,v $
  160.  * Revision 1000.1  2004/04/13 17:22:55  gouriano
  161.  * PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.5
  162.  *
  163.  * Revision 1.5  2004/03/10 16:51:09  kuznets
  164.  * Fixed compilation problems (GCC)
  165.  *
  166.  * Revision 1.4  2004/03/10 16:16:48  kuznets
  167.  * Add accessors to internal list of free objects
  168.  *
  169.  * Revision 1.3  2004/02/23 19:18:20  kuznets
  170.  * +CResourcePool::Forget to manually remove objects from the pool.
  171.  *
  172.  * Revision 1.2  2004/02/17 19:06:59  kuznets
  173.  * GCC warning fix
  174.  *
  175.  * Revision 1.1  2004/02/13 20:24:47  kuznets
  176.  * Initial revision. CResourcePool implements light weight solution for pooling
  177.  * of heavy weight objects (intended as optimization tool).
  178.  *
  179.  *
  180.  * ===========================================================================
  181.  */
  182. #endif  /* UTIL___RESOURCEPOOL__HPP */