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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: seq_entry_handle.hpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 19:21:38  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.11
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef SEQ_ENTRY_HANDLE__HPP
  10. #define SEQ_ENTRY_HANDLE__HPP
  11. /*  $Id: seq_entry_handle.hpp,v 1000.2 2004/06/01 19:21:38 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. *    Handle to Seq-entry object
  40. *
  41. */
  42. #include <corelib/ncbiobj.hpp>
  43. #include <objects/seqset/Seq_entry.hpp>
  44. #include <objects/seqset/Bioseq_set.hpp>
  45. #include <objmgr/impl/heap_scope.hpp>
  46. BEGIN_NCBI_SCOPE
  47. BEGIN_SCOPE(objects)
  48. /////////////////////////////////////////////////////////////////////////////
  49. // CSeq_entry_Handle
  50. /////////////////////////////////////////////////////////////////////////////
  51. class CScope;
  52. class CSeq_entry_Handle;
  53. class CBioseq_set_Handle;
  54. class CBioseq_Handle;
  55. class CSeq_annot_Handle;
  56. class CSeq_entry_EditHandle;
  57. class CBioseq_set_EditHandle;
  58. class CBioseq_EditHandle;
  59. class CSeq_annot_EditHandle;
  60. class CSeq_entry_Info;
  61. class CTSE_Info;
  62. class CSeqdesc;
  63. class NCBI_XOBJMGR_EXPORT CSeq_entry_Handle
  64. {
  65. public:
  66.     // default constructor
  67.     CSeq_entry_Handle(void);
  68.     // Get scope this handle belongs to
  69.     CScope& GetScope(void) const;
  70.     // Navigate object tree
  71.     bool HasParentEntry(void) const;
  72.     CBioseq_set_Handle GetParentBioseq_set(void) const;
  73.     CSeq_entry_Handle GetParentEntry(void) const;
  74.     CSeq_entry_Handle GetSingleSubEntry(void) const;
  75.     CSeq_entry_Handle GetTopLevelEntry(void) const;
  76.     // Get 'edit' version of handle
  77.     CSeq_entry_EditHandle GetEditHandle(void) const;
  78.     // Get controlled object
  79.     CConstRef<CSeq_entry> GetCompleteSeq_entry(void) const;
  80.     CConstRef<CSeq_entry> GetSeq_entryCore(void) const;
  81.     // Seq-entry accessors
  82.     typedef CSeq_entry::E_Choice E_Choice;
  83.     E_Choice Which(void) const;
  84.     // Bioseq access
  85.     bool IsSeq(void) const;
  86.     typedef CBioseq_Handle TSeq;
  87.     TSeq GetSeq(void) const;
  88.     // Bioseq_set access
  89.     bool IsSet(void) const;
  90.     typedef CBioseq_set_Handle TSet;
  91.     TSet GetSet(void) const;
  92.     // descr field is in both Bioseq and Bioseq-set
  93.     bool IsSetDescr(void) const;
  94.     typedef CSeq_descr TDescr;
  95.     const TDescr& GetDescr(void) const;
  96.     typedef CBioseq_set::TClass TClass;
  97.     CConstRef<CObject> GetBlobId(void) const;
  98.     // Utility methods/operators
  99.     operator bool(void) const;
  100.     bool operator!(void) const;
  101.     void Reset(void);
  102.     bool operator ==(const CSeq_entry_Handle& handle) const;
  103.     bool operator !=(const CSeq_entry_Handle& handle) const;
  104.     bool operator <(const CSeq_entry_Handle& handle) const;
  105. protected:
  106.     friend class CScope_Impl;
  107.     friend class CBioseq_Handle;
  108.     friend class CBioseq_set_Handle;
  109.     friend class CSeq_annot_Handle;
  110.     friend class CSeqMap_CI;
  111.     friend class CSeq_entry_CI;
  112.     CSeq_entry_Handle(CScope& scope, const CSeq_entry_Info& info);
  113.     CHeapScope          m_Scope;
  114.     CConstRef<CObject>  m_Info;
  115. public: // non-public section
  116.     CConstRef<CTSE_Info> GetTSE_Info(void) const;
  117.     const CSeq_entry_Info& x_GetInfo(void) const;
  118. };
  119. class NCBI_XOBJMGR_EXPORT CSeq_entry_EditHandle : public CSeq_entry_Handle
  120. {
  121. public:
  122.     // Default constructor
  123.     CSeq_entry_EditHandle(void);
  124.     // Navigate object tree
  125.     CBioseq_set_EditHandle GetParentBioseq_set(void) const;
  126.     CSeq_entry_EditHandle GetParentEntry(void) const;
  127.     CSeq_entry_EditHandle GetSingleSubEntry(void) const;
  128.     // Change descriptions
  129.     void SetDescr(TDescr& v) const;
  130.     void ResetDescr(void) const;
  131.     bool AddSeqdesc(CSeqdesc& v) const;
  132.     bool RemoveSeqdesc(const CSeqdesc& v) const;
  133.     void AddDescr(const CSeq_entry_EditHandle& src_entry) const;
  134.     typedef CBioseq_EditHandle TSeq;
  135.     typedef CBioseq_set_EditHandle TSet;
  136.     TSet SetSet(void) const;
  137.     TSeq SetSeq(void) const;
  138.     // Make this Seq-entry to be empty.
  139.     // Old contents of the entry will be deleted.
  140.     void SelectNone(void) const;
  141.     // Convert the empty Seq-entry to Bioseq-set.
  142.     // Returns new Bioseq-set handle.
  143.     TSet SelectSet(TClass set_class = CBioseq_set::eClass_not_set) const;
  144.     // Make the empty Seq-entry be in set state with given Bioseq-set object.
  145.     // Returns new Bioseq-set handle.
  146.     TSet SelectSet(CBioseq_set& seqset) const;
  147.     // Make the empty Seq-entry be in set state with given Bioseq-set object.
  148.     // Returns new Bioseq-set handle.
  149.     TSet CopySet(const CBioseq_set_Handle& seqset) const;
  150.     // Make the empty Seq-entry be in set state with moving Bioseq-set object
  151.     // from the argument seqset.
  152.     // Returns new Bioseq-set handle which could be different from the argument
  153.     // is the argument is from another scope.
  154.     TSet TakeSet(const TSet& seqset) const;
  155.     // Make the empty Seq-entry be in seq state with specified Bioseq object.
  156.     // Returns new Bioseq handle.
  157.     TSeq SelectSeq(CBioseq& seq) const;
  158.     // Make the empty Seq-entry be in seq state with specified Bioseq object.
  159.     // Returns new Bioseq handle.
  160.     TSeq CopySeq(const CBioseq_Handle& seq) const;
  161.     // Make the empty Seq-entry be in seq state with moving bioseq object
  162.     // from the argument seq.
  163.     // Returns new Bioseq handle which could be different from the argument
  164.     // is the argument is from another scope.
  165.     TSeq TakeSeq(const TSeq& seq) const;
  166.     // Convert the entry from Bioseq to Bioseq-set.
  167.     // Old Bioseq will become the only entry of new Bioseq-set.
  168.     // New Bioseq-set will have the specified class.
  169.     // If the set_class argument is omitted,
  170.     // or equals to CBioseq_set::eClass_not_set,
  171.     // the class field of new Bioseq-set object will not be initialized.
  172.     // Returns new Bioseq-set handle.
  173.     TSet ConvertSeqToSet(TClass set_class = CBioseq_set::eClass_not_set) const;
  174.     // Collapse one level of Bioseq-set.
  175.     // The Bioseq-set should originally contain only one sub-entry.
  176.     // Current Seq-entry will become the same type as sub-entry.
  177.     // All Seq-annot and Seq-descr objects from old Bioseq-set
  178.     // will be moved to new contents (sub-entry).
  179.     void CollapseSet(void) const;
  180.     // Do the same as CollapseSet() when sub-entry is of type bioseq.
  181.     // Throws an exception in other cases.
  182.     // Returns resulting Bioseq handle.
  183.     TSeq ConvertSetToSeq(void) const;
  184.     // Attach new Seq-annot to Bioseq or Bioseq-set
  185.     CSeq_annot_EditHandle AttachAnnot(const CSeq_annot& annot) const;
  186.     CSeq_annot_EditHandle CopyAnnot(const CSeq_annot_Handle&annot) const;
  187.     CSeq_annot_EditHandle TakeAnnot(const CSeq_annot_EditHandle& annot) const;
  188.     void TakeAllAnnots(const CSeq_entry_EditHandle& src_entry) const;
  189.     // Attach new sub objects to Bioseq-set
  190.     // index < 0 or index >= current number of entries means to add at the end.
  191.     CBioseq_EditHandle AttachBioseq(CBioseq& seq,
  192.                                     int index = -1) const;
  193.     CBioseq_EditHandle CopyBioseq(const CBioseq_Handle& seq,
  194.                                   int index = -1) const;
  195.     CBioseq_EditHandle TakeBioseq(const CBioseq_EditHandle& seq,
  196.                                   int index = -1) const;
  197.     CSeq_entry_EditHandle AttachEntry(CSeq_entry& entry,
  198.                                       int index = -1) const;
  199.     CSeq_entry_EditHandle CopyEntry(const CSeq_entry_Handle& entry,
  200.                                     int index = -1) const;
  201.     CSeq_entry_EditHandle TakeEntry(const CSeq_entry_EditHandle& entry,
  202.                                     int index = -1) const;
  203.     // Remove this Seq-entry from parent,
  204.     // or scope if it's top level Seq-entry.
  205.     void Remove(void) const;
  206. protected:
  207.     friend class CScope_Impl;
  208.     friend class CBioseq_EditHandle;
  209.     friend class CBioseq_set_EditHandle;
  210.     friend class CSeq_annot_EditHandle;
  211.     friend class CSeq_entry_I;
  212.     CSeq_entry_EditHandle(const CSeq_entry_Handle& h);
  213.     CSeq_entry_EditHandle(CScope& scope, CSeq_entry_Info& info);
  214. public: // non-public section
  215.     CSeq_entry_Info& x_GetInfo(void) const;
  216. };
  217. /////////////////////////////////////////////////////////////////////////////
  218. // CSeq_entry_Handle inline methods
  219. /////////////////////////////////////////////////////////////////////////////
  220. inline
  221. CSeq_entry_Handle::CSeq_entry_Handle(void)
  222. {
  223. }
  224. inline
  225. CScope& CSeq_entry_Handle::GetScope(void) const
  226. {
  227.     return m_Scope;
  228. }
  229. inline
  230. CSeq_entry_Handle::operator bool(void) const
  231. {
  232.     return m_Info;
  233. }
  234. inline
  235. bool CSeq_entry_Handle::operator!(void) const
  236. {
  237.     return !m_Info;
  238. }
  239. inline
  240. const CSeq_entry_Info& CSeq_entry_Handle::x_GetInfo(void) const
  241. {
  242.     return reinterpret_cast<const CSeq_entry_Info&>(*m_Info);
  243. }
  244. inline
  245. bool CSeq_entry_Handle::operator ==(const CSeq_entry_Handle& handle) const
  246. {
  247.     return m_Scope == handle.m_Scope  &&  m_Info == handle.m_Info;
  248. }
  249. inline
  250. bool CSeq_entry_Handle::operator !=(const CSeq_entry_Handle& handle) const
  251. {
  252.     return m_Scope != handle.m_Scope  ||  m_Info != handle.m_Info;
  253. }
  254. inline
  255. bool CSeq_entry_Handle::operator <(const CSeq_entry_Handle& handle) const
  256. {
  257.     if ( m_Scope != handle.m_Scope ) {
  258.         return m_Scope < handle.m_Scope;
  259.     }
  260.     return m_Info < handle.m_Info;
  261. }
  262. inline
  263. bool CSeq_entry_Handle::IsSeq(void) const
  264. {
  265.     return Which() == CSeq_entry::e_Seq;
  266. }
  267. inline
  268. bool CSeq_entry_Handle::IsSet(void) const
  269. {
  270.     return Which() == CSeq_entry::e_Set;
  271. }
  272. /////////////////////////////////////////////////////////////////////////////
  273. // CSeq_entry_EditHandle
  274. /////////////////////////////////////////////////////////////////////////////
  275. inline
  276. CSeq_entry_EditHandle::CSeq_entry_EditHandle(void)
  277. {
  278. }
  279. inline
  280. CSeq_entry_EditHandle::CSeq_entry_EditHandle(const CSeq_entry_Handle& h)
  281.     : CSeq_entry_Handle(h)
  282. {
  283. }
  284. inline
  285. CSeq_entry_EditHandle::CSeq_entry_EditHandle(CScope& scope,
  286.                                              CSeq_entry_Info& info)
  287.     : CSeq_entry_Handle(scope, info)
  288. {
  289. }
  290. END_SCOPE(objects)
  291. END_NCBI_SCOPE
  292. /*
  293. * ---------------------------------------------------------------------------
  294. * $Log: seq_entry_handle.hpp,v $
  295. * Revision 1000.2  2004/06/01 19:21:38  gouriano
  296. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.11
  297. *
  298. * Revision 1.11  2004/04/29 15:44:30  grichenk
  299. * Added GetTopLevelEntry()
  300. *
  301. * Revision 1.10  2004/03/31 19:54:08  vasilche
  302. * Fixed removal of bioseqs and bioseq-sets.
  303. *
  304. * Revision 1.9  2004/03/31 17:08:06  vasilche
  305. * Implemented ConvertSeqToSet and ConvertSetToSeq.
  306. *
  307. * Revision 1.8  2004/03/29 20:13:05  vasilche
  308. * Implemented whole set of methods to modify Seq-entry object tree.
  309. * Added CBioseq_Handle::GetExactComplexityLevel().
  310. *
  311. * Revision 1.7  2004/03/25 20:06:41  vasilche
  312. * Fixed typo TSet -> TSeq.
  313. *
  314. * Revision 1.6  2004/03/24 18:30:28  vasilche
  315. * Fixed edit API.
  316. * Every *_Info object has its own shallow copy of original object.
  317. *
  318. * Revision 1.5  2004/03/16 21:01:32  vasilche
  319. * Added methods to move Bioseq withing Seq-entry
  320. *
  321. * Revision 1.4  2004/03/16 15:47:26  vasilche
  322. * Added CBioseq_set_Handle and set of EditHandles
  323. *
  324. * Revision 1.3  2004/02/09 19:18:50  grichenk
  325. * Renamed CDesc_CI to CSeq_descr_CI. Redesigned CSeq_descr_CI
  326. * and CSeqdesc_CI to avoid using data directly.
  327. *
  328. * Revision 1.2  2003/12/03 16:40:03  grichenk
  329. * Added GetParentEntry()
  330. *
  331. * Revision 1.1  2003/11/28 15:12:30  grichenk
  332. * Initial revision
  333. *
  334. *
  335. * ===========================================================================
  336. */
  337. #endif //SEQ_ENTRY_HANDLE__HPP