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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: msg_pool.hpp,v $
  4.  * PRODUCTION Revision 1000.5  2004/04/16 16:54:00  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.15
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef GUI_UTILS___MSG_POOL__HPP
  10. #define GUI_UTILS___MSG_POOL__HPP
  11. /*  $Id: msg_pool.hpp,v 1000.5 2004/04/16 16:54:00 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.  * Authors:  Lou Friedman
  37.  *
  38.  * File Description:
  39.  *    Implement a messging mechanism between instants of an object. The object
  40.  *      must inherit from CObject and implement a MessageEventHandler.
  41.  */
  42. #include <corelib/ncbiobj.hpp>
  43. #include <algorithm>
  44. #include <vector>
  45. #include <list>
  46. #include <string>
  47. /** @addtogroup GUI_UTILS
  48.  *
  49.  * @{
  50.  */
  51. BEGIN_NCBI_SCOPE
  52. ///////////////////////////////////////////////////////////////////////
  53. //
  54. //  CMsgPool - Is a templated object that implement the messgaing 
  55. //      mechanism for object passed in to the template. The object
  56. //      must inherit from CObject and implement a MessageEventHandler.
  57. //      A message pool must have a sting name upon creation.
  58. template <class Object>
  59. class CMsgPool : public CObject
  60. {
  61. public:
  62.     typedef  CRef<Object>  TMember;
  63.     typedef  list<TMember> TMemberList;
  64.     // defautl ctor
  65.     CMsgPool(const string& name)
  66.         : m_Name(name) { }
  67.     // retrieve the name of this pool
  68.     void    GetName(const string& name) const { m_Name = name; }
  69.     string& SetName()                         { return m_Name; }
  70.     // add a member to this pool
  71.     void Join(Object& member)
  72.     {
  73.         typename TMemberList::iterator pos;
  74.         pos = find(m_Members.begin(), m_Members.end(), CRef<Object>(&member) );
  75.         if (pos == m_Members.end()) {
  76.             m_Members.push_back(TMember(&member));
  77.         }
  78.     }
  79.     // remove a member from this pool
  80.     void Leave(Object& member) 
  81.     {
  82.         typename TMemberList::iterator pos;
  83.         pos = find(m_Members.begin(), m_Members.end(), TMember(&member));
  84.         if (pos != m_Members.end()) {
  85.             m_Members.erase(pos);
  86.         } 
  87.     }
  88.     // post a messgae to this pool
  89.     template <class Msg>
  90.     void PostMessage(Msg msg, const void *user_data) 
  91.     {
  92.         NON_CONST_ITERATE(typename TMemberList, iter, m_Members) {
  93.             (*iter)->MessageEventHandler(msg, user_data);
  94.         }
  95.     }
  96. private:
  97.     string          m_Name;
  98.     TMemberList     m_Members;
  99. };
  100. ///////////////////////////////////////////////////////////////////////
  101. //
  102. // CMsgPoolMgr is a templated object that manages the message pools for
  103. //  passed in object. 
  104. template <class Object>    
  105. class CMsgPoolMgr : public CObject
  106. {
  107. public:
  108.     typedef   CMsgPool<Object>  TPool;
  109.     typedef   CRef<TPool>       TPoolRef;
  110.     typedef   list<TPoolRef>    TPoolList;
  111.     // create a message pool with a given name
  112.     TPool* CreatePool(const string& name)
  113.     {
  114.         // if pool exists, return the pool
  115.         if (TPool* pool = FindPool(name)) {
  116.             return pool;
  117.         }
  118.         // create new pool
  119.         TPoolRef pool (new  TPool(name));
  120.         m_Pools.push_back(pool);
  121.         return pool.GetPointer();
  122.     }
  123.     // retrieve a message pool by name
  124.     TPool* FindPool(const string& name)
  125.     {
  126.         TPoolRef pool = x_FindPool(name);
  127.         return pool.GetPointer();
  128.     }
  129.     // delete a named message pool
  130.     void DeletePool(const string& name)
  131. {
  132.         TPoolRef pool = x_FindPool(name);
  133.         m_Pools.remove(pool);
  134.     }
  135.     // clear all pools from this manager
  136.     void Clear(void)
  137.     {
  138.         m_Pools.clear();
  139.     }
  140. private:
  141.     // our message pools
  142.     TPoolList m_Pools;
  143.     // internal retrieval function
  144.     TPoolRef x_FindPool(const string& name)
  145.     {
  146.         NON_CONST_ITERATE(typename TPoolList, iter, m_Pools) {
  147.             if (NStr::CompareCase((*iter)->SetName(), name) == 0) {
  148.                 return *iter;
  149.             }
  150.         }
  151.     
  152.         return null;
  153.     }
  154.     
  155. };
  156. END_NCBI_SCOPE
  157.  
  158. /* @} */
  159. /*
  160.  * ===========================================================================
  161.  * $Log: msg_pool.hpp,v $
  162.  * Revision 1000.5  2004/04/16 16:54:00  gouriano
  163.  * PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.15
  164.  *
  165.  * Revision 1.15  2004/04/16 14:27:17  dicuccio
  166.  * Added doxygen module tag
  167.  *
  168.  * Revision 1.14  2004/01/21 12:34:36  dicuccio
  169.  * Removed unused variable
  170.  *
  171.  * Revision 1.13  2003/12/31 20:31:47  dicuccio
  172.  * Renamed prototypes in CMessagePoolMgr
  173.  *
  174.  * Revision 1.12  2003/12/22 19:15:48  dicuccio
  175.  * Pass const void* to PostMessage()
  176.  *
  177.  * Revision 1.11  2003/11/19 20:52:49  friedman
  178.  * CreateMessagePool checks for an existing message pool and returns it if detected
  179.  *
  180.  * Revision 1.10  2003/11/14 18:03:17  ucko
  181.  * Fixed CMsgPoolMgr::x_FindMessagePool now that CMsgPool::Name is {Get,Set}Name.
  182.  *
  183.  * Revision 1.9  2003/11/14 17:41:49  dicuccio
  184.  * Added Clear() to the pool manager - called at shut down.  Added code comments.
  185.  * Changed include guard to match file location.
  186.  *
  187.  * Revision 1.8  2003/11/04 18:28:40  ucko
  188.  * CMsgPoolMgr::x_FindMessagePool: return null rather than NULL, which
  189.  * the compiler may not be willing to cast to CRef implicitly.
  190.  *
  191.  * Revision 1.7  2003/11/04 16:47:37  dicuccio
  192.  * Fixed include guards.  Use explicit values on return rather than implict conversion
  193.  *
  194.  * Revision 1.6  2003/11/04 13:54:51  dicuccio
  195.  * Fixed compilation error on MSVC - ambiguous pointer<->CRef<> comparison
  196.  *
  197.  * Revision 1.5  2003/11/04 12:22:25  friedman
  198.  * Code cleanup
  199.  *
  200.  * Revision 1.4  2003/10/20 18:50:02  friedman
  201.  * Added typename to template<>::itearators to remove GCC 3.3.1 warnings
  202.  *
  203.  * Revision 1.3  2003/09/14 14:10:10  ucko
  204.  * +<algorithm> for find<> (not already included when using GCC 2.95)
  205.  *
  206.  * Revision 1.2  2003/09/12 19:46:04  ucko
  207.  * Tweak x_FindMessagePool to make GCC (and others?) happy.
  208.  *
  209.  * Revision 1.1  2003/09/12 17:38:40  friedman
  210.  * Initial revision
  211.  *
  212.  * ===========================================================================
  213.  */
  214. #endif // GUI_UTILS___MSG_POOL__HPP