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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: tse_info_object.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:24:38  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.3
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: tse_info_object.cpp,v 1000.1 2004/06/01 19:24:38 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. * Author: Eugene Vasilchenko
  35. *
  36. * File Description:
  37. *   CTSE_Info_Object
  38. *
  39. */
  40. #include <ncbi_pch.hpp>
  41. #include <objmgr/impl/tse_info_object.hpp>
  42. #include <objmgr/impl/tse_info.hpp>
  43. BEGIN_NCBI_SCOPE
  44. BEGIN_SCOPE(objects)
  45. CTSE_Info_Object::CTSE_Info_Object(void)
  46.     : m_TSE_Info(0),
  47.       m_Parent_Info(0),
  48.       m_DirtyAnnotIndex(true),
  49.       m_NeedUpdateObject(false)
  50. {
  51. }
  52. CTSE_Info_Object::~CTSE_Info_Object(void)
  53. {
  54. }
  55. bool CTSE_Info_Object::HasDataSource(void) const
  56. {
  57.     return HasTSE_Info() && GetTSE_Info().HasDataSource();
  58. }
  59. const CTSE_Info& CTSE_Info_Object::GetTSE_Info(void) const
  60. {
  61.     _ASSERT(m_TSE_Info);
  62.     return *m_TSE_Info;
  63. }
  64. CTSE_Info& CTSE_Info_Object::GetTSE_Info(void)
  65. {
  66.     _ASSERT(m_TSE_Info);
  67.     return *m_TSE_Info;
  68. }
  69. CDataSource& CTSE_Info_Object::GetDataSource(void) const
  70. {
  71.     return GetTSE_Info().GetDataSource();
  72. }
  73. const CTSE_Info_Object& CTSE_Info_Object::GetBaseParent_Info(void) const
  74. {
  75.     _ASSERT(m_Parent_Info);
  76.     return *m_Parent_Info;
  77. }
  78. CTSE_Info_Object& CTSE_Info_Object::GetBaseParent_Info(void)
  79. {
  80.     _ASSERT(m_Parent_Info);
  81.     return *m_Parent_Info;
  82. }
  83. void CTSE_Info_Object::x_TSEAttach(CTSE_Info& tse)
  84. {
  85.     _ASSERT(!m_TSE_Info);
  86.     _ASSERT(m_Parent_Info || &tse == this);
  87.     x_TSEAttachContents(tse);
  88.     _ASSERT(m_TSE_Info == &tse);
  89. }
  90. void CTSE_Info_Object::x_TSEDetach(CTSE_Info& tse)
  91. {
  92.     _ASSERT(m_TSE_Info == &tse);
  93.     _ASSERT(m_Parent_Info || &tse == this);
  94.     x_TSEDetachContents(tse);
  95.     _ASSERT(!m_TSE_Info);
  96. }
  97. void CTSE_Info_Object::x_TSEAttachContents(CTSE_Info& tse)
  98. {
  99.     _ASSERT(!m_TSE_Info);
  100.     m_TSE_Info = &tse;
  101. }
  102. void CTSE_Info_Object::x_TSEDetachContents(CTSE_Info& _DEBUG_ARG(tse))
  103. {
  104.     _ASSERT(m_TSE_Info == &tse);
  105.     m_TSE_Info = 0;
  106. }
  107. void CTSE_Info_Object::x_DSAttach(CDataSource& ds)
  108. {
  109.     _ASSERT(m_TSE_Info);
  110.     _ASSERT(m_Parent_Info || m_TSE_Info == this);
  111.     _ASSERT(!m_Parent_Info || &ds == &GetDataSource());
  112.     x_DSAttachContents(ds);
  113. }
  114. void CTSE_Info_Object::x_DSDetach(CDataSource& ds)
  115. {
  116.     _ASSERT(m_TSE_Info);
  117.     _ASSERT(m_Parent_Info || m_TSE_Info == this);
  118.     _ASSERT(!m_Parent_Info || &ds == &GetDataSource());
  119.     x_DSDetachContents(ds);
  120. }
  121. void CTSE_Info_Object::x_DSAttachContents(CDataSource& _DEBUG_ARG(ds))
  122. {
  123.     _ASSERT(&ds == &GetDataSource());
  124. }
  125. void CTSE_Info_Object::x_DSDetachContents(CDataSource& _DEBUG_ARG(ds))
  126. {
  127.     _ASSERT(&ds == &GetDataSource());
  128. }
  129. void CTSE_Info_Object::x_BaseParentAttach(CTSE_Info_Object& parent)
  130. {
  131.     _ASSERT(!m_Parent_Info);
  132.     _ASSERT(!m_TSE_Info);
  133.     m_Parent_Info = &parent;
  134.     if ( x_DirtyAnnotIndex() ) {
  135.         x_SetParentDirtyAnnotIndex();
  136.     }
  137.     if ( x_NeedUpdateObject() ) {
  138.         parent.x_SetNeedUpdateObject();
  139.     }
  140. }
  141. void CTSE_Info_Object::x_BaseParentDetach(CTSE_Info_Object& _DEBUG_ARG(parent))
  142. {
  143.     _ASSERT(m_Parent_Info == &parent);
  144.     _ASSERT(!m_TSE_Info);
  145.     m_Parent_Info = 0;
  146. }
  147. void CTSE_Info_Object::x_AttachObject(CTSE_Info_Object& object)
  148. {
  149.     _ASSERT(&object.GetBaseParent_Info() == this);
  150.     if ( HasTSE_Info() ) {
  151.         object.x_TSEAttach(GetTSE_Info());
  152.     }
  153.     if ( HasDataSource() ) {
  154.         object.x_DSAttach(GetDataSource());
  155.     }
  156. }
  157. void CTSE_Info_Object::x_DetachObject(CTSE_Info_Object& object)
  158. {
  159.     _ASSERT(&object.GetBaseParent_Info() == this);
  160.     if ( HasDataSource() ) {
  161.         object.x_DSDetach(GetDataSource());
  162.     }
  163.     if ( HasTSE_Info() ) {
  164.         object.x_TSEDetach(GetTSE_Info());
  165.     }
  166. }
  167. void CTSE_Info_Object::x_SetDirtyAnnotIndex(void)
  168. {
  169.     if ( !x_DirtyAnnotIndex() ) {
  170.         m_DirtyAnnotIndex = true;
  171.         x_SetParentDirtyAnnotIndex();
  172.     }
  173. }
  174. void CTSE_Info_Object::x_SetParentDirtyAnnotIndex(void)
  175. {
  176.     if ( HasParent_Info() ) {
  177.         GetBaseParent_Info().x_SetDirtyAnnotIndex();
  178.     }
  179.     else {
  180.         x_SetDirtyAnnotIndexNoParent();
  181.     }
  182. }
  183. void CTSE_Info_Object::x_SetDirtyAnnotIndexNoParent(void)
  184. {
  185. }
  186. void CTSE_Info_Object::x_ResetDirtyAnnotIndex(void)
  187. {
  188.     if ( x_DirtyAnnotIndex() ) {
  189.         m_DirtyAnnotIndex = false;
  190.         if ( !HasParent_Info() ) {
  191.             x_ResetDirtyAnnotIndexNoParent();
  192.         }
  193.     }
  194. }
  195. void CTSE_Info_Object::x_ResetDirtyAnnotIndexNoParent(void)
  196. {
  197. }
  198. void CTSE_Info_Object::x_UpdateAnnotIndex(CTSE_Info& tse)
  199. {
  200.     if ( x_DirtyAnnotIndex() ) {
  201.         x_UpdateAnnotIndexContents(tse);
  202.         x_ResetDirtyAnnotIndex();
  203.     }
  204. }
  205. void CTSE_Info_Object::x_UpdateAnnotIndexContents(CTSE_Info& /*tse*/)
  206. {
  207. }
  208. void CTSE_Info_Object::x_SetNeedUpdateObject(void)
  209. {
  210.     if ( !x_NeedUpdateObject() ) {
  211.         m_NeedUpdateObject = true;
  212.         if ( HasParent_Info() ) {
  213.             GetBaseParent_Info().x_SetNeedUpdateObject();
  214.         }
  215.     }
  216. }
  217. void CTSE_Info_Object::x_ResetNeedUpdateObject(void)
  218. {
  219.     m_NeedUpdateObject = false;
  220. }
  221. void CTSE_Info_Object::x_UpdateObject(void) const
  222. {
  223.     if ( x_NeedUpdateObject() ) {
  224.         const_cast<CTSE_Info_Object*>(this)->x_DoUpdateObject();
  225.         _ASSERT(!x_NeedUpdateObject());
  226.     }
  227. }
  228. void CTSE_Info_Object::x_DoUpdateObject(void)
  229. {
  230.     m_NeedUpdateObject = false;
  231. }
  232. END_SCOPE(objects)
  233. END_NCBI_SCOPE
  234. /*
  235.  * ===========================================================================
  236.  * $Log: tse_info_object.cpp,v $
  237.  * Revision 1000.1  2004/06/01 19:24:38  gouriano
  238.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.3
  239.  *
  240.  * Revision 1.3  2004/05/21 21:42:13  gorelenk
  241.  * Added PCH ncbi_pch.hpp
  242.  *
  243.  * Revision 1.2  2004/03/24 18:30:30  vasilche
  244.  * Fixed edit API.
  245.  * Every *_Info object has its own shallow copy of original object.
  246.  *
  247.  * Revision 1.1  2004/03/16 15:47:28  vasilche
  248.  * Added CBioseq_set_Handle and set of EditHandles
  249.  *
  250.  * Revision 1.10  2004/02/03 19:02:18  vasilche
  251.  * Fixed broken 'dirty annot index' state after RemoveEntry().
  252.  *
  253.  * Revision 1.9  2004/02/02 14:46:44  vasilche
  254.  * Several performance fixed - do not iterate whole tse set in CDataSource.
  255.  *
  256.  * Revision 1.8  2004/01/29 19:33:07  vasilche
  257.  * Fixed coredump on WorkShop when invalid Seq-entry is added to CScope.
  258.  *
  259.  * Revision 1.7  2004/01/22 20:10:40  vasilche
  260.  * 1. Splitted ID2 specs to two parts.
  261.  * ID2 now specifies only protocol.
  262.  * Specification of ID2 split data is moved to seqsplit ASN module.
  263.  * For now they are still reside in one resulting library as before - libid2.
  264.  * As the result split specific headers are now in objects/seqsplit.
  265.  * 2. Moved ID2 and ID1 specific code out of object manager.
  266.  * Protocol is processed by corresponding readers.
  267.  * ID2 split parsing is processed by ncbi_xreader library - used by all readers.
  268.  * 3. Updated OBJMGR_LIBS correspondingly.
  269.  *
  270.  * Revision 1.6  2003/12/18 16:38:07  grichenk
  271.  * Added CScope::RemoveEntry()
  272.  *
  273.  * Revision 1.5  2003/12/11 17:02:50  grichenk
  274.  * Fixed CRef resetting in constructors.
  275.  *
  276.  * Revision 1.4  2003/11/19 22:18:03  grichenk
  277.  * All exceptions are now CException-derived. Catch "exception" rather
  278.  * than "runtime_error".
  279.  *
  280.  * Revision 1.3  2003/09/30 16:22:03  vasilche
  281.  * Updated internal object manager classes to be able to load ID2 data.
  282.  * SNP blobs are loaded as ID2 split blobs - readers convert them automatically.
  283.  * Scope caches results of requests for data to data loaders.
  284.  * Optimized CSeq_id_Handle for gis.
  285.  * Optimized bioseq lookup in scope.
  286.  * Reduced object allocations in annotation iterators.
  287.  * CScope is allowed to be destroyed before other objects using this scope are
  288.  * deleted (feature iterators, bioseq handles etc).
  289.  * Optimized lookup for matching Seq-ids in CSeq_id_Mapper.
  290.  * Added 'adaptive' option to objmgr_demo application.
  291.  *
  292.  * Revision 1.2  2003/06/02 16:06:38  dicuccio
  293.  * Rearranged src/objects/ subtree.  This includes the following shifts:
  294.  *     - src/objects/asn2asn --> arc/app/asn2asn
  295.  *     - src/objects/testmedline --> src/objects/ncbimime/test
  296.  *     - src/objects/objmgr --> src/objmgr
  297.  *     - src/objects/util --> src/objmgr/util
  298.  *     - src/objects/alnmgr --> src/objtools/alnmgr
  299.  *     - src/objects/flat --> src/objtools/flat
  300.  *     - src/objects/validator --> src/objtools/validator
  301.  *     - src/objects/cddalignview --> src/objtools/cddalignview
  302.  * In addition, libseq now includes six of the objects/seq... libs, and libmmdb
  303.  * replaces the three libmmdb? libs.
  304.  *
  305.  * Revision 1.1  2003/04/24 16:12:38  vasilche
  306.  * Object manager internal structures are splitted more straightforward.
  307.  * Removed excessive header dependencies.
  308.  *
  309.  *
  310.  * ===========================================================================
  311.  */