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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: scope_info.hpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/04/12 17:28:25  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.8
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef SCOPE_INFO__HPP
  10. #define SCOPE_INFO__HPP
  11. /*  $Id: scope_info.hpp,v 1000.2 2004/04/12 17:28:25 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. *     Structures used by CScope
  40. *
  41. */
  42. #include <corelib/ncbiobj.hpp>
  43. #include <corelib/ncbimtx.hpp>
  44. #include <objmgr/seq_id_handle.hpp>
  45. #include <objmgr/impl/mutex_pool.hpp>
  46. #include <objmgr/objmgr_exception.hpp>
  47. #include <objmgr/impl/tse_info.hpp>
  48. #include <set>
  49. #include <utility>
  50. BEGIN_NCBI_SCOPE
  51. BEGIN_SCOPE(objects)
  52. class CDataSource;
  53. class CDataLoader;
  54. class CSeqMap;
  55. class CScope;
  56. class CBioseq_Info;
  57. class CSynonymsSet;
  58. struct SSeq_id_ScopeInfo;
  59. struct NCBI_XOBJMGR_EXPORT CDataSource_ScopeInfo : public CObject
  60. {
  61.     typedef CRef<CDataSource> TDataSourceLock;
  62.     CDataSource_ScopeInfo(CDataSource& ds);
  63.     ~CDataSource_ScopeInfo(void);
  64.     typedef CConstRef<CTSE_Info>                     TTSE_Lock;
  65.     typedef set<TTSE_Lock>                           TTSE_LockSet;
  66.     const TTSE_LockSet& GetTSESet(void) const;
  67.     CDataSource& GetDataSource(void);
  68.     const CDataSource& GetDataSource(void) const;
  69.     CDataLoader* GetDataLoader(void);
  70. protected:
  71.     friend class CScope_Impl;
  72.     CFastMutex& GetMutex(void);
  73.     void AddTSE(const CTSE_Info& tse);
  74.     void Reset(void);
  75. private:
  76.     CDataSource_ScopeInfo(const CDataSource_ScopeInfo&);
  77.     const CDataSource_ScopeInfo& operator=(const CDataSource_ScopeInfo&);
  78.     TDataSourceLock m_DataSource;
  79.     TTSE_LockSet    m_TSE_LockSet;
  80.     CFastMutex      m_Leaf_Mtx; // for m_TSE_LockSet
  81. };
  82. class NCBI_XOBJMGR_EXPORT CBioseq_ScopeInfo : public CObject
  83. {
  84. public:
  85.     typedef pair<const CSeq_id_Handle, SSeq_id_ScopeInfo> TScopeInfo;
  86.     CBioseq_ScopeInfo(TScopeInfo* scope_info); // no sequence
  87.     CBioseq_ScopeInfo(TScopeInfo* scope_info,
  88.                       const CConstRef<CBioseq_Info>& bioseq);
  89.     ~CBioseq_ScopeInfo(void);
  90.     CScope& GetScope(void) const;
  91.     bool HasBioseq(void) const;
  92.     const CSeq_id_Handle& GetSeq_id_Handle(void) const;
  93.     const CBioseq_Info& GetBioseq_Info(void) const;
  94.     const CTSE_Info& GetTSE_Info(void) const;
  95.     CDataSource& GetDataSource(void) const;
  96.      // check if the scope has not been reset
  97.     void CheckScope(void) const;
  98. private:
  99.     friend class CScope_Impl;
  100.     friend class CSeq_id_ScopeInfo;
  101.     // owner scope's info
  102.     TScopeInfo*              m_ScopeInfo;
  103.     // bioseq object if any
  104.     // if none -> no bioseq for this Seq_id, but there might be annotations
  105.     // if buiseq exists, m_TSE_Lock holds lock for TSE containing bioseq
  106.     CConstRef<CBioseq_Info>  m_Bioseq_Info;
  107.     CConstRef<CTSE_Info>     m_TSE_Lock;
  108.     // caches synonyms of bioseq if any
  109.     // all synonyms share the same CBioseq_ScopeInfo object
  110.     CInitMutex<CSynonymsSet> m_SynCache;
  111. private:
  112.     CBioseq_ScopeInfo(const CBioseq_ScopeInfo& info);
  113.     const CBioseq_ScopeInfo& operator=(const CBioseq_ScopeInfo& info);
  114. };
  115. struct NCBI_XOBJMGR_EXPORT SSeq_id_ScopeInfo
  116. {
  117.     SSeq_id_ScopeInfo(CScope* scope);
  118.     ~SSeq_id_ScopeInfo(void);
  119.     typedef CConstRef<CTSE_Info>                     TTSE_Lock;
  120.     typedef set<TTSE_Lock>                           TTSE_LockSet;
  121.     typedef CObjectFor<TTSE_LockSet>                 TAnnotRefSet;
  122.     typedef CInitMutex<TAnnotRefSet>                 TAnnotRefInfo;
  123.     // owner scope
  124.     CScope*                       m_Scope;
  125.     // caches and locks other (not main) TSEs with annotations on this Seq-id
  126.     CInitMutex<CBioseq_ScopeInfo> m_Bioseq_Info;
  127.     // caches and locks other (not main) TSEs with annotations on this Seq-id
  128.     TAnnotRefInfo                 m_AllAnnotRef_Info;
  129. };
  130. typedef CRef<CObject> TBlob_ID;
  131. class NCBI_XOBJMGR_EXPORT CBlob_Info
  132. {
  133. public:
  134.     CBlob_Info(void)
  135.         : m_Blob_ID(0), m_Source(0) {}
  136.     CBlob_Info(TBlob_ID bid, CDataSource& src)
  137.         : m_Blob_ID(bid), m_Source(&src) {}
  138.     ~CBlob_Info(void) {}
  139.     CBlob_Info(const CBlob_Info& info)
  140.         : m_Blob_ID(info.m_Blob_ID), m_Source(info.m_Source) {}
  141.     CBlob_Info& operator =(const CBlob_Info& info)
  142.         {
  143.             if (&info != this) {
  144.                 m_Blob_ID = info.m_Blob_ID;
  145.                 m_Source = info.m_Source;
  146.             }
  147.             return *this;
  148.         }
  149.     operator bool(void)
  150.         { return bool(m_Blob_ID)  &&  m_Source; }
  151.     bool operator !(void)
  152.         { return !m_Blob_ID  ||  !m_Source; }
  153.     TBlob_ID     m_Blob_ID;
  154.     CDataSource* m_Source;
  155. };
  156. /////////////////////////////////////////////////////////////////////////////
  157. // Inline methods
  158. /////////////////////////////////////////////////////////////////////////////
  159. /////////////////////////////////////////////////////////////////////////////
  160. // CDataSource_ScopeInfo
  161. /////////////////////////////////////////////////////////////////////////////
  162. inline
  163. CDataSource& CDataSource_ScopeInfo::GetDataSource(void)
  164. {
  165.     return *m_DataSource;
  166. }
  167. inline
  168. const CDataSource& CDataSource_ScopeInfo::GetDataSource(void) const
  169. {
  170.     return *m_DataSource;
  171. }
  172. inline
  173. CFastMutex& CDataSource_ScopeInfo::GetMutex(void)
  174. {
  175.     return m_Leaf_Mtx;
  176. }
  177. /////////////////////////////////////////////////////////////////////////////
  178. // CBioseq_ScopeInfo
  179. /////////////////////////////////////////////////////////////////////////////
  180. inline
  181. bool CBioseq_ScopeInfo::HasBioseq(void) const
  182. {
  183.     return m_Bioseq_Info;
  184. }
  185. inline
  186. const CBioseq_Info& CBioseq_ScopeInfo::GetBioseq_Info(void) const
  187. {
  188.     return *m_Bioseq_Info;
  189. }
  190. inline
  191. const CSeq_id_Handle& CBioseq_ScopeInfo::GetSeq_id_Handle(void) const
  192. {
  193.     return m_ScopeInfo->first;
  194. }
  195. inline
  196. void CBioseq_ScopeInfo::CheckScope(void) const
  197. {
  198.     if ( !m_ScopeInfo ) {
  199.         NCBI_THROW(CObjMgrException, eInvalidHandle,
  200.                    "No scope associated with bioseq info");
  201.     }
  202. }
  203. END_SCOPE(objects)
  204. END_NCBI_SCOPE
  205. /*
  206. * ---------------------------------------------------------------------------
  207. * $Log: scope_info.hpp,v $
  208. * Revision 1000.2  2004/04/12 17:28:25  gouriano
  209. * PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.8
  210. *
  211. * Revision 1.8  2004/01/27 17:10:12  ucko
  212. * +tse_info.hpp due to use of CConstRef<CTSE_Info>
  213. *
  214. * Revision 1.7  2003/11/17 16:03:13  grichenk
  215. * Throw exception in CBioseq_Handle if the parent scope has been reset
  216. *
  217. * Revision 1.6  2003/10/07 13:43:22  vasilche
  218. * Added proper handling of named Seq-annots.
  219. * Added feature search from named Seq-annots.
  220. * Added configurable adaptive annotation search (default: gene, cds, mrna).
  221. * Fixed selection of blobs for loading from GenBank.
  222. * Added debug checks to CSeq_id_Mapper for easier finding lost CSeq_id_Handles.
  223. * Fixed leaked split chunks annotation stubs.
  224. * Moved some classes definitions in separate *.cpp files.
  225. *
  226. * Revision 1.5  2003/09/30 16:22:01  vasilche
  227. * Updated internal object manager classes to be able to load ID2 data.
  228. * SNP blobs are loaded as ID2 split blobs - readers convert them automatically.
  229. * Scope caches results of requests for data to data loaders.
  230. * Optimized CSeq_id_Handle for gis.
  231. * Optimized bioseq lookup in scope.
  232. * Reduced object allocations in annotation iterators.
  233. * CScope is allowed to be destroyed before other objects using this scope are
  234. * deleted (feature iterators, bioseq handles etc).
  235. * Optimized lookup for matching Seq-ids in CSeq_id_Mapper.
  236. * Added 'adaptive' option to objmgr_demo application.
  237. *
  238. * Revision 1.4  2003/06/19 19:48:16  vasilche
  239. * Removed unnecessary copy constructor of SSeq_id_ScopeInfo.
  240. *
  241. * Revision 1.3  2003/06/19 19:31:00  vasilche
  242. * Added missing CBioseq_ScopeInfo destructor for MSVC.
  243. *
  244. * Revision 1.2  2003/06/19 19:08:31  vasilche
  245. * Added include to make MSVC happy.
  246. *
  247. * Revision 1.1  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. *
  253. * ===========================================================================
  254. */
  255. #endif  // SCOPE_INFO__HPP