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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: seq_id_handle.hpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/04/12 17:27:42  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.22
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef OBJECTS_OBJMGR___SEQ_ID_HANDLE__HPP
  10. #define OBJECTS_OBJMGR___SEQ_ID_HANDLE__HPP
  11. /*  $Id: seq_id_handle.hpp,v 1000.2 2004/04/12 17:27:42 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: Aleksey Grichenko, Eugene Vasilchenko
  37. *
  38. * File Description:
  39. *   Seq-id handle for Object Manager
  40. *
  41. */
  42. #include <objects/seqloc/Seq_id.hpp>
  43. BEGIN_NCBI_SCOPE
  44. BEGIN_SCOPE(objects)
  45. ////////////////////////////////////////////////////////////////////
  46. //
  47. //  CSeq_id_Handle::
  48. //
  49. //    Handle to be used instead of CSeq_id. Supports different
  50. //    methods of comparison: exact equality or match of seq-ids.
  51. //
  52. // forward declaration
  53. class CSeq_id;
  54. class CSeq_id_Handle;
  55. class CSeq_id_Mapper;
  56. class CSeq_id_Which_Tree;
  57. class NCBI_XOBJMGR_EXPORT CSeq_id_Info
  58. {
  59. public:
  60.     explicit CSeq_id_Info(CSeq_id_Which_Tree* tree);
  61.     CSeq_id_Info(CSeq_id_Which_Tree* tree, const CConstRef<CSeq_id>& seq_id);
  62.     ~CSeq_id_Info(void);
  63.     CConstRef<CSeq_id> GetSeqId(void) const
  64.         {
  65.             return m_Seq_id;
  66.         }
  67.     CConstRef<CSeq_id> GetGiSeqId(int gi) const;
  68.     void AddReference(void) const;
  69.     void RemoveReference(void) const;
  70.     int GetCounter(void) const;
  71.     CSeq_id_Which_Tree* GetTree(void) const;
  72. protected:
  73.     void x_RemoveLastReference(void) const;
  74.     mutable CAtomicCounter m_Counter;
  75.     CSeq_id_Which_Tree*    m_Tree;
  76.     CConstRef<CSeq_id>     m_Seq_id;
  77. private:
  78.     CSeq_id_Info(const CSeq_id_Info&);
  79.     const CSeq_id_Info& operator=(const CSeq_id_Info&);
  80. };
  81. class NCBI_XOBJMGR_EXPORT CSeq_id_Handle
  82. {
  83. public:
  84.     // 'ctors
  85.     CSeq_id_Handle(void);
  86.     explicit CSeq_id_Handle(const CSeq_id_Info* info, int gi = 0);
  87.     static CSeq_id_Handle GetGiHandle(int gi);
  88.     static CSeq_id_Handle GetHandle(const CSeq_id& id);
  89.     bool operator== (const CSeq_id_Handle& handle) const;
  90.     bool operator!= (const CSeq_id_Handle& handle) const;
  91.     bool operator<  (const CSeq_id_Handle& handle) const;
  92.     bool operator== (const CSeq_id& id) const;
  93.     // Check if the handle is a valid or an empty one
  94.     operator bool(void) const;
  95.     bool operator! (void) const;
  96.     // Reset the handle (remove seq-id reference)
  97.     void Reset(void);
  98.     // True if "this" is a better bioseq than "h".
  99.     bool IsBetter(const CSeq_id_Handle& h) const;
  100.     string AsString(void) const;
  101.     bool IsGi(void) const;
  102.     int GetGi(void) const;
  103.     unsigned GetHash(void) const;
  104.     CConstRef<CSeq_id> GetSeqId(void) const;
  105.     CConstRef<CSeq_id> GetSeqIdOrNull(void) const;
  106.     static void DumpRegister(const char* msg);
  107. private:
  108.     void x_Register(void);
  109.     void x_Deregister(void);
  110.     
  111.     friend class CSeq_id_Mapper;
  112.     CSeq_id_Which_Tree* x_GetTree(void) const;
  113.     // Comparison methods
  114.     // True if handles are strictly equal
  115.     bool x_Equal(const CSeq_id_Handle& handle) const;
  116.     // True if "this" may be resolved to "handle"
  117.     bool x_Match(const CSeq_id_Handle& handle) const;
  118.     // Seq-id info
  119.     CConstRef<CSeq_id_Info>    m_Info;
  120.     int                        m_Gi;
  121. };
  122. /////////////////////////////////////////////////////////////////////
  123. //
  124. //  Inline methods
  125. //
  126. /////////////////////////////////////////////////////////////////////
  127. /////////////////////////////////////////////////////////////////////////////
  128. // CSeq_id_Info
  129. /////////////////////////////////////////////////////////////////////////////
  130. inline
  131. CSeq_id_Info::CSeq_id_Info(CSeq_id_Which_Tree* tree)
  132.     : m_Tree(tree)
  133. {
  134.     _ASSERT(tree);
  135.     m_Counter.Set(0);
  136. }
  137. inline
  138. CSeq_id_Info::CSeq_id_Info(CSeq_id_Which_Tree* tree, const CConstRef<CSeq_id>& seq_id)
  139.     : m_Tree(tree),
  140.       m_Seq_id(seq_id)
  141. {
  142.     _ASSERT(tree);
  143.     m_Counter.Set(0);
  144. }
  145. inline
  146. void CSeq_id_Info::AddReference(void) const
  147. {
  148.     _VERIFY(m_Counter.Add(1) > 0);
  149. }
  150. inline
  151. void CSeq_id_Info::RemoveReference(void) const
  152. {
  153.     if ( m_Counter.Add(-1) <= 0 ) {
  154.         x_RemoveLastReference();
  155.     }
  156. }
  157. inline
  158. int CSeq_id_Info::GetCounter(void) const
  159. {
  160.     int counter = m_Counter.Get();
  161.     _ASSERT(counter >= 0);
  162.     return counter;
  163. }
  164. inline
  165. CSeq_id_Which_Tree* CSeq_id_Info::GetTree(void) const
  166. {
  167.     _ASSERT(m_Tree);
  168.     return m_Tree;
  169. }
  170. /////////////////////////////////////////////////////////////////////////////
  171. // CSeq_id_Handle
  172. /////////////////////////////////////////////////////////////////////////////
  173. inline
  174. CSeq_id_Handle::operator bool (void) const
  175. {
  176.     return m_Info;
  177. }
  178. inline
  179. bool CSeq_id_Handle::operator!(void) const
  180. {
  181.     return !m_Info;
  182. }
  183. inline
  184. CSeq_id_Handle::CSeq_id_Handle(void)
  185.     : m_Info(0), m_Gi(0)
  186. {
  187. }
  188. inline
  189. CSeq_id_Handle::CSeq_id_Handle(const CSeq_id_Info* info, int gi)
  190.     : m_Info(info), m_Gi(gi)
  191. {
  192.     _ASSERT(info);
  193. }
  194. inline
  195. void CSeq_id_Handle::Reset(void)
  196. {
  197.     m_Info.Reset();
  198.     m_Gi = 0;
  199. }
  200. inline
  201. bool CSeq_id_Handle::operator==(const CSeq_id_Handle& handle) const
  202. {
  203.     return m_Gi == handle.m_Gi && m_Info == handle.m_Info;
  204. }
  205. inline
  206. bool CSeq_id_Handle::operator!=(const CSeq_id_Handle& handle) const
  207. {
  208.     return m_Gi != handle.m_Gi || m_Info != handle.m_Info;
  209. }
  210. inline
  211. bool CSeq_id_Handle::operator<(const CSeq_id_Handle& handle) const
  212. {
  213.     return m_Gi < handle.m_Gi ||
  214.         m_Gi == handle.m_Gi && m_Info < handle.m_Info;
  215. }
  216. inline
  217. bool CSeq_id_Handle::IsGi(void) const
  218. {
  219.     return m_Gi != 0;
  220. }
  221. inline
  222. int CSeq_id_Handle::GetGi(void) const
  223. {
  224.     return m_Gi;
  225. }
  226. inline
  227. unsigned CSeq_id_Handle::GetHash(void) const
  228. {
  229.     unsigned hash = m_Gi;
  230.     if ( !hash ) {
  231.         hash = unsigned((unsigned long)(m_Info)>>3);
  232.     }
  233.     return hash;
  234. }
  235. END_SCOPE(objects)
  236. END_NCBI_SCOPE
  237. /*
  238. * ---------------------------------------------------------------------------
  239. * $Log: seq_id_handle.hpp,v $
  240. * Revision 1000.2  2004/04/12 17:27:42  gouriano
  241. * PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.22
  242. *
  243. * Revision 1.22  2004/02/19 17:25:33  vasilche
  244. * Use CRef<> to safely hold pointer to CSeq_id_Info.
  245. * CSeq_id_Info holds pointer to owner CSeq_id_Which_Tree.
  246. * Reduce number of calls to CSeq_id_Handle.GetSeqId().
  247. *
  248. * Revision 1.21  2004/01/22 20:10:38  vasilche
  249. * 1. Splitted ID2 specs to two parts.
  250. * ID2 now specifies only protocol.
  251. * Specification of ID2 split data is moved to seqsplit ASN module.
  252. * For now they are still reside in one resulting library as before - libid2.
  253. * As the result split specific headers are now in objects/seqsplit.
  254. * 2. Moved ID2 and ID1 specific code out of object manager.
  255. * Protocol is processed by corresponding readers.
  256. * ID2 split parsing is processed by ncbi_xreader library - used by all readers.
  257. * 3. Updated OBJMGR_LIBS correspondingly.
  258. *
  259. * Revision 1.20  2004/01/07 20:42:00  grichenk
  260. * Fixed matching of accession to accession.version
  261. *
  262. * Revision 1.19  2003/11/26 17:55:54  vasilche
  263. * Implemented ID2 split in ID1 cache.
  264. * Fixed loading of splitted annotations.
  265. *
  266. * Revision 1.18  2003/10/07 13:43:22  vasilche
  267. * Added proper handling of named Seq-annots.
  268. * Added feature search from named Seq-annots.
  269. * Added configurable adaptive annotation search (default: gene, cds, mrna).
  270. * Fixed selection of blobs for loading from GenBank.
  271. * Added debug checks to CSeq_id_Mapper for easier finding lost CSeq_id_Handles.
  272. * Fixed leaked split chunks annotation stubs.
  273. * Moved some classes definitions in separate *.cpp files.
  274. *
  275. * Revision 1.17  2003/09/30 16:21:59  vasilche
  276. * Updated internal object manager classes to be able to load ID2 data.
  277. * SNP blobs are loaded as ID2 split blobs - readers convert them automatically.
  278. * Scope caches results of requests for data to data loaders.
  279. * Optimized CSeq_id_Handle for gis.
  280. * Optimized bioseq lookup in scope.
  281. * Reduced object allocations in annotation iterators.
  282. * CScope is allowed to be destroyed before other objects using this scope are
  283. * deleted (feature iterators, bioseq handles etc).
  284. * Optimized lookup for matching Seq-ids in CSeq_id_Mapper.
  285. * Added 'adaptive' option to objmgr_demo application.
  286. *
  287. * Revision 1.16  2003/07/17 20:07:55  vasilche
  288. * Reduced memory usage by feature indexes.
  289. * SNP data is loaded separately through PUBSEQ_OS.
  290. * String compression for SNP data.
  291. *
  292. * Revision 1.15  2003/06/19 18:23:44  vasilche
  293. * Added several CXxx_ScopeInfo classes for CScope related information.
  294. * CBioseq_Handle now uses reference to CBioseq_ScopeInfo.
  295. * Some fine tuning of locking in CScope.
  296. *
  297. * Revision 1.14  2003/06/10 19:06:34  vasilche
  298. * Simplified CSeq_id_Mapper and CSeq_id_Handle.
  299. *
  300. * Revision 1.13  2003/04/24 16:12:37  vasilche
  301. * Object manager internal structures are splitted more straightforward.
  302. * Removed excessive header dependencies.
  303. *
  304. * Revision 1.12  2003/02/24 18:57:21  vasilche
  305. * Make feature gathering in one linear pass using CSeqMap iterator.
  306. * Do not use feture index by sub locations.
  307. * Sort features at the end of gathering in one vector.
  308. * Extracted some internal structures and classes in separate header.
  309. * Delay creation of mapped features.
  310. *
  311. * Revision 1.11  2003/02/21 14:33:50  grichenk
  312. * Display warning but don't crash on uninitialized seq-ids.
  313. *
  314. * Revision 1.10  2002/12/26 20:44:02  dicuccio
  315. * Added Win32 export specifier.  Added #include for seq_id_mapper - at bottom of
  316. * file to skirt circular include dependency.
  317. *
  318. * Revision 1.9  2002/07/08 20:50:56  grichenk
  319. * Moved log to the end of file
  320. * Replaced static mutex (in CScope, CDataSource) with the mutex
  321. * pool. Redesigned CDataSource data locking.
  322. *
  323. * Revision 1.8  2002/05/29 21:19:57  gouriano
  324. * added debug dump
  325. *
  326. * Revision 1.7  2002/05/02 20:42:35  grichenk
  327. * throw -> THROW1_TRACE
  328. *
  329. * Revision 1.6  2002/03/18 17:26:32  grichenk
  330. * +CDataLoader::x_GetSeq_id(), x_GetSeq_id_Key(), x_GetSeq_id_Handle()
  331. *
  332. * Revision 1.5  2002/03/15 18:10:05  grichenk
  333. * Removed CRef<CSeq_id> from CSeq_id_Handle, added
  334. * key to seq-id map th CSeq_id_Mapper
  335. *
  336. * Revision 1.4  2002/02/21 19:27:00  grichenk
  337. * Rearranged includes. Added scope history. Added searching for the
  338. * best seq-id match in data sources and scopes. Updated tests.
  339. *
  340. * Revision 1.3  2002/02/12 19:41:40  grichenk
  341. * Seq-id handles lock/unlock moved to CSeq_id_Handle 'ctors.
  342. *
  343. * Revision 1.2  2002/01/29 17:06:12  grichenk
  344. * + operator !()
  345. *
  346. * Revision 1.1  2002/01/23 21:56:35  grichenk
  347. * Splitted id_handles.hpp
  348. *
  349. *
  350. * ===========================================================================
  351. */
  352. #endif  /* OBJECTS_OBJMGR___SEQ_ID_HANDLE__HPP */