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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: priority.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:23:34  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.7
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: priority.cpp,v 1000.1 2004/06/01 19:23:34 gouriano Exp $
  10. * ===========================================================================
  11. *
  12. *                            PUBLIC DOMAIN NOTICE
  13. *               National Center for Biotechnology Information
  14. *
  15. *  This software/database is a "United States Government Work" under the
  16. *  terms of the United States Copyright Act.  It was written as part of
  17. *  the author's official duties as a United States Government employee and
  18. *  thus cannot be copyrighted.  This software/database is freely available
  19. *  to the public for use. The National Library of Medicine and the U.S.
  20. *  Government have not placed any restriction on its use or reproduction.
  21. *
  22. *  Although all reasonable efforts have been taken to ensure the accuracy
  23. *  and reliability of the software and data, the NLM and the U.S.
  24. *  Government do not and cannot warrant the performance or results that
  25. *  may be obtained by using this software or data. The NLM and the U.S.
  26. *  Government disclaim all warranties, express or implied, including
  27. *  warranties of performance, merchantability or fitness for any particular
  28. *  purpose.
  29. *
  30. *  Please cite the author in any work or product based on this material.
  31. *
  32. * ===========================================================================
  33. *
  34. * Authors:
  35. *           Aleksey Grichenko, Eugene Vasilchenko
  36. *
  37. * File Description:
  38. *           Priority record for CObjectManager and CScope
  39. *
  40. */
  41. #include <ncbi_pch.hpp>
  42. #include <objmgr/impl/priority.hpp>
  43. #include <objmgr/impl/scope_info.hpp>
  44. BEGIN_NCBI_SCOPE
  45. BEGIN_SCOPE(objects)
  46. // CPriorityTree methods
  47. CPriorityTree::CPriorityTree(void)
  48. {
  49. }
  50. CPriorityTree::~CPriorityTree(void)
  51. {
  52. }
  53. CPriorityTree::CPriorityTree(const CPriorityTree& tree)
  54.     : m_Map(tree.m_Map)
  55. {
  56. }
  57. const CPriorityTree& CPriorityTree::operator=(const CPriorityTree& tree)
  58. {
  59.     m_Map = tree.m_Map;
  60.     return *this;
  61. }
  62. bool CPriorityTree::Insert(const CPriorityNode& node, TPriority priority)
  63. {
  64.     m_Map.insert(TPriorityMap::value_type(priority, node));
  65.     return true;
  66. }
  67. bool CPriorityTree::Insert(const CPriorityTree& tree, TPriority priority)
  68. {
  69.     return Insert(CPriorityNode(tree), priority);
  70. }
  71. bool CPriorityTree::Insert(CDataSource& ds, TPriority priority)
  72. {
  73.     for ( TPriorityMap::iterator it = m_Map.lower_bound(priority);
  74.           it != m_Map.end() && it->first == priority; ++it ) {
  75.         if ( it->second.IsLeaf() &&
  76.              &it->second.GetLeaf().GetDataSource() == &ds ) {
  77.             return false;
  78.         }
  79.     }
  80.     return Insert(CPriorityNode(ds), priority);
  81. }
  82. bool CPriorityTree::Erase(const TLeaf& leaf)
  83. {
  84.     NON_CONST_ITERATE ( TPriorityMap, mit, m_Map ) {
  85.         if ( mit->second.Erase(leaf) ) {
  86.             if ( mit->second.IsEmpty() ) {
  87.                 m_Map.erase(mit);
  88.             }
  89.             return true;
  90.         }
  91.     }
  92.     return false;
  93. }
  94. void CPriorityTree::Clear(void)
  95. {
  96.     m_Map.clear();
  97. }
  98. // CPriorityNode methods
  99. CPriorityNode::CPriorityNode(void)
  100. {
  101. }
  102. CPriorityNode::CPriorityNode(TLeaf& leaf)
  103.     : m_Leaf(&leaf)
  104. {
  105. }
  106. CPriorityNode::CPriorityNode(CDataSource& ds)
  107.     : m_Leaf(new TLeaf(ds))
  108. {
  109. }
  110. CPriorityNode::CPriorityNode(const CPriorityTree& tree)
  111.     : m_SubTree(new CPriorityTree(tree))
  112. {
  113. }
  114. CPriorityNode::CPriorityNode(const CPriorityNode& node)
  115.     : m_SubTree(node.m_SubTree)
  116. {
  117.     if ( node.IsLeaf() ) {
  118.         m_Leaf.Reset(new TLeaf(const_cast<CDataSource&>
  119.                                (node.GetLeaf().GetDataSource())));
  120.     }
  121. }
  122. CPriorityNode& CPriorityNode::operator=(const CPriorityNode& node)
  123. {
  124.     m_Leaf = node.m_Leaf;
  125.     m_SubTree = node.m_SubTree;
  126.     return *this;
  127. }
  128. CPriorityTree& CPriorityNode::SetTree(void)
  129. {
  130.     m_Leaf.Reset();
  131.     if ( !m_SubTree )
  132.         m_SubTree.Reset(new CPriorityTree());
  133.     return *m_SubTree;
  134. }
  135. void CPriorityNode::SetLeaf(TLeaf& leaf)
  136. {
  137.     m_SubTree.Reset();
  138.     m_Leaf.Reset(&leaf);
  139. }
  140. bool CPriorityNode::Erase(const TLeaf& leaf)
  141. {
  142.     if ( IsTree() ) {
  143.         return GetTree().Erase(leaf);
  144.     }
  145.     else if (m_Leaf == &leaf) {
  146.         m_Leaf.Reset();
  147.         return true;
  148.     }
  149.     return false;
  150. }
  151. void CPriorityNode::Clear(void)
  152. {
  153.     m_Leaf.Reset();
  154.     if ( m_SubTree ) {
  155.         m_SubTree->Clear();
  156.     }
  157. }
  158. // CPriority_I methods
  159. CPriority_I::CPriority_I(void)
  160.     : m_Map(0), m_Node(0)
  161. {
  162. }
  163. CPriority_I::CPriority_I(CPriorityTree& tree)
  164.     : m_Map(&tree.GetTree()), m_Node(0)
  165. {
  166.     for ( m_Map_I = m_Map->begin(); m_Map_I != m_Map->end(); ++m_Map_I ) {
  167.         m_Node = &m_Map_I->second;
  168.         if ( m_Node->IsLeaf() )
  169.             return;
  170.         else if ( m_Node->IsTree() ) {
  171.             m_Sub_I.reset(new CPriority_I(m_Node->GetTree()));
  172.             if ( *m_Sub_I )
  173.                 return;
  174.             m_Sub_I.reset();
  175.         }
  176.     }
  177.     m_Node = 0;
  178. }
  179. const CPriority_I& CPriority_I::operator++(void)
  180. {
  181.     _ASSERT(m_Node && m_Map && m_Map_I != m_Map->end());
  182.     if ( m_Sub_I.get() ) {
  183.         // Try to increment sub-iterator
  184.         if ( ++*m_Sub_I )
  185.             return *this;
  186.         m_Sub_I.reset();
  187.     }
  188.     // Current node is not a tree or the tree has been iterated to its end
  189.     // Select next element in the set/map
  190.     while ( ++m_Map_I != m_Map->end()) {
  191.         m_Node = &m_Map_I->second;
  192.         if ( m_Node->IsLeaf() )
  193.             return *this;
  194.         else if ( m_Node->IsTree() ) {
  195.             m_Sub_I.reset(new CPriority_I(m_Node->GetTree()));
  196.             if ( *m_Sub_I ) // found non-empty subtree
  197.                 return *this;
  198.             m_Sub_I.reset();
  199.         }
  200.     }
  201.     // No more valid nodes - reset node
  202.     m_Node = 0;
  203.     return *this;
  204. }
  205. END_SCOPE(objects)
  206. END_NCBI_SCOPE
  207. /*
  208. * ---------------------------------------------------------------------------
  209. * $Log: priority.cpp,v $
  210. * Revision 1000.1  2004/06/01 19:23:34  gouriano
  211. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.7
  212. *
  213. * Revision 1.7  2004/05/21 21:42:12  gorelenk
  214. * Added PCH ncbi_pch.hpp
  215. *
  216. * Revision 1.6  2003/09/30 20:40:32  vasilche
  217. * Fixed CScope::AddScope() -  create new CDataSource_ScopeInfo objects.
  218. *
  219. * Revision 1.5  2003/07/01 17:59:13  vasilche
  220. * Reordered member initializers.
  221. *
  222. * Revision 1.4  2003/06/30 18:42:10  vasilche
  223. * CPriority_I made to use less memory allocations/deallocations.
  224. *
  225. * Revision 1.3  2003/06/19 19:31:23  vasilche
  226. * Added missing CBioseq_ScopeInfo destructor.
  227. *
  228. * Revision 1.2  2003/06/19 19:14:15  vasilche
  229. * Added include to make MSVC happy.
  230. *
  231. * Revision 1.1  2003/06/19 18:23:46  vasilche
  232. * Added several CXxx_ScopeInfo classes for CScope related information.
  233. * CBioseq_Handle now uses reference to CBioseq_ScopeInfo.
  234. * Some fine tuning of locking in CScope.
  235. *
  236. * ===========================================================================
  237. */