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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: priority.hpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/04/12 17:28:23  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.13
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef PRIORITY__HPP
  10. #define PRIORITY__HPP
  11. /*  $Id: priority.hpp,v 1000.1 2004/04/12 17:28:23 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:
  37. *           Aleksey Grichenko
  38. *
  39. * File Description:
  40. *           Priority record for CObjectManager and CScope
  41. *
  42. */
  43. #include <corelib/ncbistd.hpp>
  44. #include <corelib/ncbimtx.hpp>
  45. #include <corelib/ncbiobj.hpp>
  46. #include <map>
  47. #include <memory>
  48. BEGIN_NCBI_SCOPE
  49. BEGIN_SCOPE(objects)
  50. class CPriority_I;
  51. class CTSE_Info;
  52. class CDataSource;
  53. struct CDataSource_ScopeInfo;
  54. class CPriorityTree;
  55. class CPriorityNode;
  56. class NCBI_XOBJMGR_EXPORT CPriorityNode
  57. {
  58. public:
  59.     typedef CDataSource_ScopeInfo TLeaf;
  60.     CPriorityNode(void);
  61.     explicit CPriorityNode(CDataSource& ds);
  62.     explicit CPriorityNode(TLeaf& leaf);
  63.     explicit CPriorityNode(const CPriorityTree& tree);
  64.     CPriorityNode(const CPriorityNode& node);
  65.     CPriorityNode& operator=(const CPriorityNode& node);
  66.     typedef int TPriority;
  67.     typedef CPriority_I iterator;
  68.     typedef multimap<TPriority, CPriorityNode> TPriorityMap;
  69.     // true if the node is a tree, not a leaf
  70.     bool IsTree(void) const;
  71.     bool IsLeaf(void) const;
  72.     TLeaf& GetLeaf(void);
  73.     const TLeaf& GetLeaf(void) const;
  74.     CPriorityTree& GetTree(void);
  75.     const CPriorityTree& GetTree(void) const;
  76.     // Set node type to "tree"
  77.     CPriorityTree& SetTree(void);
  78.     // Set node type to "leaf"
  79.     void SetLeaf(TLeaf& leaf);
  80.     //bool Insert(const CPriorityNode& node, TPriority priority);
  81.     //bool Insert(CDataSource& ds, TPriority priority);
  82.     bool Erase(const TLeaf& leaf);
  83.     bool IsEmpty(void) const;
  84.     void Clear(void);
  85. private:
  86.     void x_CopySubTree(const CPriorityNode& node);
  87.     CRef<CPriorityTree> m_SubTree;
  88.     CRef<TLeaf>         m_Leaf;
  89. };
  90. class NCBI_XOBJMGR_EXPORT CPriorityTree : public CObject
  91. {
  92. public:
  93.     typedef CDataSource_ScopeInfo TLeaf;
  94.     CPriorityTree(void);
  95.     CPriorityTree(const CPriorityTree& node);
  96.     ~CPriorityTree(void);
  97.     const CPriorityTree& operator=(const CPriorityTree& node);
  98.     typedef CPriorityNode::TPriority TPriority;
  99.     typedef CPriority_I iterator;
  100.     typedef multimap<TPriority, CPriorityNode> TPriorityMap;
  101.     TPriorityMap& GetTree(void);
  102.     const TPriorityMap& GetTree(void) const;
  103.     bool Insert(const CPriorityNode& node, TPriority priority);
  104.     bool Insert(const CPriorityTree& tree, TPriority priority);
  105.     bool Insert(CDataSource& ds, TPriority priority);
  106.     bool Erase(const TLeaf& leaf);
  107.     bool IsEmpty(void) const;
  108.     void Clear(void);
  109. private:
  110.     void x_CopySubTree(const CPriorityNode& node);
  111.     TPriorityMap m_Map;
  112. };
  113. class CPriority_I
  114. {
  115. public:
  116.     CPriority_I(void);
  117.     CPriority_I(CPriorityTree& tree);
  118.     typedef CPriorityNode::TLeaf TLeaf;
  119.     typedef TLeaf value_type;
  120.     operator bool(void) const;
  121.     value_type& operator*(void) const;
  122.     value_type* operator->(void) const;
  123.     const CPriority_I& operator++(void);
  124. private:
  125.     CPriority_I(const CPriority_I&);
  126.     CPriority_I& operator= (const CPriority_I&);
  127.     typedef CPriorityTree::TPriorityMap TPriorityMap;
  128.     typedef TPriorityMap::iterator      TMap_I;
  129.     TPriorityMap*           m_Map;
  130.     TMap_I                  m_Map_I;
  131.     CPriorityNode*          m_Node;
  132.     auto_ptr<CPriority_I>   m_Sub_I;
  133. };
  134. // CPriorityTree inline methods
  135. inline
  136. CPriorityTree::TPriorityMap& CPriorityTree::GetTree(void)
  137. {
  138.     return m_Map;
  139. }
  140. inline
  141. const CPriorityTree::TPriorityMap& CPriorityTree::GetTree(void) const
  142. {
  143.     return m_Map;
  144. }
  145. inline
  146. bool CPriorityTree::IsEmpty(void) const
  147. {
  148.     return m_Map.empty();
  149. }
  150. // CPriorityNode inline methods
  151. inline
  152. bool CPriorityNode::IsTree(void) const
  153. {
  154.     return m_SubTree;
  155. }
  156. inline
  157. bool CPriorityNode::IsLeaf(void) const
  158. {
  159.     return m_Leaf;
  160. }
  161. inline
  162. CDataSource_ScopeInfo& CPriorityNode::GetLeaf(void)
  163. {
  164.     _ASSERT(IsLeaf());
  165.     return *m_Leaf;
  166. }
  167. inline
  168. const CDataSource_ScopeInfo& CPriorityNode::GetLeaf(void) const
  169. {
  170.     _ASSERT(IsLeaf());
  171.     return *m_Leaf;
  172. }
  173. inline
  174. CPriorityTree& CPriorityNode::GetTree(void)
  175. {
  176.     _ASSERT(IsTree());
  177.     return *m_SubTree;
  178. }
  179. inline
  180. const CPriorityTree& CPriorityNode::GetTree(void) const
  181. {
  182.     _ASSERT(IsTree());
  183.     return *m_SubTree;
  184. }
  185. inline
  186. bool CPriorityNode::IsEmpty(void) const
  187. {
  188.     return !IsLeaf()  &&  (!IsTree()  ||  m_SubTree->IsEmpty());
  189. }
  190. // CPriority_I inline methods
  191. inline
  192. CPriority_I::operator bool(void) const
  193. {
  194.     return m_Node != 0;
  195. }
  196. inline
  197. CPriority_I::value_type& CPriority_I::operator*(void) const
  198. {
  199.     _ASSERT(m_Node  &&  (m_Node->IsTree()  ||  m_Node->IsLeaf()));
  200.     if (m_Sub_I.get()) {
  201.         return **m_Sub_I;
  202.     }
  203.     return m_Node->GetLeaf();
  204. }
  205. inline
  206. CPriority_I::value_type* CPriority_I::operator->(void) const
  207. {
  208.     return &this->operator *();
  209. }
  210. END_SCOPE(objects)
  211. END_NCBI_SCOPE
  212. /*
  213. * ---------------------------------------------------------------------------
  214. * $Log: priority.hpp,v $
  215. * Revision 1000.1  2004/04/12 17:28:23  gouriano
  216. * PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.13
  217. *
  218. * Revision 1.13  2004/02/19 17:16:35  vasilche
  219. * Removed unused include.
  220. *
  221. * Revision 1.12  2003/09/30 16:22:01  vasilche
  222. * Updated internal object manager classes to be able to load ID2 data.
  223. * SNP blobs are loaded as ID2 split blobs - readers convert them automatically.
  224. * Scope caches results of requests for data to data loaders.
  225. * Optimized CSeq_id_Handle for gis.
  226. * Optimized bioseq lookup in scope.
  227. * Reduced object allocations in annotation iterators.
  228. * CScope is allowed to be destroyed before other objects using this scope are
  229. * deleted (feature iterators, bioseq handles etc).
  230. * Optimized lookup for matching Seq-ids in CSeq_id_Mapper.
  231. * Added 'adaptive' option to objmgr_demo application.
  232. *
  233. * Revision 1.11  2003/08/04 17:04:29  grichenk
  234. * Added default data-source priority assignment.
  235. * Added support for iterating all annotations from a
  236. * seq-entry or seq-annot.
  237. *
  238. * Revision 1.10  2003/06/30 19:12:40  vasilche
  239. * Changed order of classes to make it compilable on MSVC.
  240. *
  241. * Revision 1.9  2003/06/30 18:42:09  vasilche
  242. * CPriority_I made to use less memory allocations/deallocations.
  243. *
  244. * Revision 1.8  2003/06/19 18:34:07  vasilche
  245. * Fixed compilation on Windows.
  246. *
  247. * Revision 1.7  2003/06/19 18:23:45  vasilche
  248. * Added several CXxx_ScopeInfo classes for CScope related information.
  249. * CBioseq_Handle now uses reference to CBioseq_ScopeInfo.
  250. * Some fine tuning of locking in CScope.
  251. *
  252. * Revision 1.6  2003/05/14 18:39:26  grichenk
  253. * Simplified TSE caching and filtering in CScope, removed
  254. * some obsolete members and functions.
  255. *
  256. * Revision 1.5  2003/05/06 18:54:08  grichenk
  257. * Moved TSE filtering from CDataSource to CScope, changed
  258. * some filtering rules (e.g. priority is now more important
  259. * than scope history). Added more caches to CScope.
  260. *
  261. * Revision 1.4  2003/04/24 16:12:37  vasilche
  262. * Object manager internal structures are splitted more straightforward.
  263. * Removed excessive header dependencies.
  264. *
  265. * Revision 1.3  2003/04/18 20:08:53  kans
  266. * changed iterate to ITERATE
  267. *
  268. * Revision 1.2  2003/04/09 16:04:30  grichenk
  269. * SDataSourceRec replaced with CPriorityNode
  270. * Added CScope::AddScope(scope, priority) to allow scope nesting
  271. *
  272. * Revision 1.1  2003/03/11 14:14:49  grichenk
  273. * Initial revision
  274. *
  275. *
  276. * ===========================================================================
  277. */
  278. #endif // PRIORITY__HPP