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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: seq_annot_ci.hpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 19:21:31  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.9
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef SEQ_ANNOT_CI__HPP
  10. #define SEQ_ANNOT_CI__HPP
  11. /*  $Id: seq_annot_ci.hpp,v 1000.2 2004/06/01 19:21:31 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-annot iterator
  40. *
  41. */
  42. #include <corelib/ncbiobj.hpp>
  43. #include <objmgr/scope.hpp>
  44. #include <objmgr/seq_annot_handle.hpp>
  45. #include <vector>
  46. #include <stack>
  47. BEGIN_NCBI_SCOPE
  48. BEGIN_SCOPE(objects)
  49. class CSeq_annot_Handle;
  50. class CSeq_entry_Info;
  51. class CSeq_annot_Info;
  52. class CBioseq_set_Info;
  53. class CBioseq_Handle;
  54. class CBioseq_set_Handle;
  55. class NCBI_XOBJMGR_EXPORT CSeq_annot_CI
  56. {
  57. public:
  58.     enum EFlags {
  59.         eSearch_entry,
  60.         eSearch_recursive
  61.     };
  62.     CSeq_annot_CI(void);
  63.     explicit CSeq_annot_CI(const CSeq_entry_Handle& entry,
  64.                            EFlags flags = eSearch_recursive);
  65.     explicit CSeq_annot_CI(const CBioseq_set_Handle& bioseq_set,
  66.                            EFlags flags = eSearch_recursive);
  67.     CSeq_annot_CI(CScope& scope, const CSeq_entry& entry,
  68.                   EFlags flags = eSearch_recursive);
  69.     // Iterate from the bioseq up to the TSE
  70.     explicit CSeq_annot_CI(const CBioseq_Handle& bioseq);
  71.     CSeq_annot_CI(const CSeq_annot_CI& iter);
  72.     ~CSeq_annot_CI(void);
  73.     CSeq_annot_CI& operator=(const CSeq_annot_CI& iter);
  74.     operator bool(void) const;
  75.     CSeq_annot_CI& operator++(void);
  76.     CScope& GetScope(void) const;
  77.     const CSeq_annot_Handle& operator*(void) const;
  78.     const CSeq_annot_Handle* operator->(void) const;
  79.     struct SEntryLevel_CI
  80.     {
  81.         typedef vector< CRef<CSeq_entry_Info> > TEntries;
  82.         typedef TEntries::const_iterator  TEntry_CI;
  83.         
  84.         SEntryLevel_CI(const CBioseq_set_Info& seqset, const TEntry_CI& iter);
  85.         SEntryLevel_CI(const SEntryLevel_CI&);
  86.         SEntryLevel_CI& operator=(const SEntryLevel_CI&);
  87.         ~SEntryLevel_CI(void);
  88.         
  89.         CConstRef<CBioseq_set_Info> m_Set;
  90.         TEntry_CI                   m_Iter;
  91.     };
  92. private:
  93.     void x_Initialize(const CSeq_entry_Handle& entry_handle, EFlags flags);
  94.     void x_SetEntry(const CSeq_entry_Info& entry);
  95.     void x_Push(void);
  96.     void x_Settle(void);
  97.     typedef vector< CRef<CSeq_annot_Info> > TAnnots;
  98.     typedef TAnnots::const_iterator TAnnot_CI;
  99.     typedef stack<SEntryLevel_CI>   TEntryStack;
  100.     CHeapScope                  m_Scope;
  101.     CConstRef<CSeq_entry_Info>  m_CurrentEntry;
  102.     TAnnot_CI                   m_AnnotIter;
  103.     CSeq_annot_Handle           m_CurrentAnnot;
  104.     TEntryStack                 m_EntryStack;
  105.     // Used when initialized with a bioseq handle to iterate upwards
  106.     bool                        m_UpTree;
  107. };
  108. /////////////////////////////////////////////////////////////////////
  109. //
  110. //  Inline methods
  111. //
  112. /////////////////////////////////////////////////////////////////////
  113. inline
  114. CScope& CSeq_annot_CI::GetScope(void) const
  115. {
  116.     return m_Scope;
  117. }
  118. inline
  119. CSeq_annot_CI::operator bool(void) const
  120. {
  121.     return m_CurrentAnnot;
  122. }
  123. inline
  124. const CSeq_annot_Handle& CSeq_annot_CI::operator*(void) const
  125. {
  126.     _ASSERT(*this);
  127.     return m_CurrentAnnot;
  128. }
  129. inline
  130. const CSeq_annot_Handle* CSeq_annot_CI::operator->(void) const
  131. {
  132.     _ASSERT(*this);
  133.     return &m_CurrentAnnot;
  134. }
  135. END_SCOPE(objects)
  136. END_NCBI_SCOPE
  137. /*
  138. * ---------------------------------------------------------------------------
  139. * $Log: seq_annot_ci.hpp,v $
  140. * Revision 1000.2  2004/06/01 19:21:31  gouriano
  141. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.9
  142. *
  143. * Revision 1.9  2004/04/26 14:13:45  grichenk
  144. * Added constructors from bioseq-set handle and bioseq handle.
  145. *
  146. * Revision 1.8  2004/03/16 15:47:26  vasilche
  147. * Added CBioseq_set_Handle and set of EditHandles
  148. *
  149. * Revision 1.7  2003/10/08 17:55:53  vasilche
  150. * Fixed null initialization of CHeapScope.
  151. *
  152. * Revision 1.6  2003/10/08 14:14:53  vasilche
  153. * Use CHeapScope instead of CRef<CScope> internally.
  154. *
  155. * Revision 1.5  2003/09/30 16:21:59  vasilche
  156. * Updated internal object manager classes to be able to load ID2 data.
  157. * SNP blobs are loaded as ID2 split blobs - readers convert them automatically.
  158. * Scope caches results of requests for data to data loaders.
  159. * Optimized CSeq_id_Handle for gis.
  160. * Optimized bioseq lookup in scope.
  161. * Reduced object allocations in annotation iterators.
  162. * CScope is allowed to be destroyed before other objects using this scope are
  163. * deleted (feature iterators, bioseq handles etc).
  164. * Optimized lookup for matching Seq-ids in CSeq_id_Mapper.
  165. * Added 'adaptive' option to objmgr_demo application.
  166. *
  167. * Revision 1.4  2003/08/22 14:59:25  grichenk
  168. * + operators ==, !=, <
  169. *
  170. * Revision 1.3  2003/08/04 17:02:57  grichenk
  171. * Added constructors to iterate all annotations from a
  172. * seq-entry or seq-annot.
  173. *
  174. * Revision 1.2  2003/07/25 21:41:27  grichenk
  175. * Implemented non-recursive mode for CSeq_annot_CI,
  176. * fixed friend declaration in CSeq_entry_Info.
  177. *
  178. * Revision 1.1  2003/07/25 15:23:41  grichenk
  179. * Initial revision
  180. *
  181. *
  182. * ===========================================================================
  183. */
  184. #endif  // SEQ_ANNOT_CI__HPP