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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: seqdesc_ci.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 19:24:28  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.13
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: seqdesc_ci.cpp,v 1000.2 2004/06/01 19:24:28 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: Aleksey Grichenko
  35. *
  36. * File Description:
  37. *   Object manager iterators
  38. *
  39. */
  40. #include <ncbi_pch.hpp>
  41. #include <objmgr/seqdesc_ci.hpp>
  42. #include <objects/seq/Seq_descr.hpp>
  43. #include <objmgr/impl/annot_object.hpp>
  44. BEGIN_NCBI_SCOPE
  45. BEGIN_SCOPE(objects)
  46. ////////////////////////////////////////////////////////////////////
  47. //
  48. //  CSeqdesc_CI::
  49. //
  50. static const list< CRef<CSeqdesc> > kEmptySeqdescList;
  51. static const list< CRef<CSeqdesc> >::const_iterator kDummyInner
  52.     = kEmptySeqdescList.end();
  53. CSeqdesc_CI::CSeqdesc_CI(void)
  54.     : m_Outer(),
  55.       m_Inner(kDummyInner),
  56.       m_InnerEnd(kDummyInner),
  57.       m_Current(NULL)
  58. {}
  59. CSeqdesc_CI::CSeqdesc_CI(const CSeq_descr_CI& desc_it,
  60.                          CSeqdesc::E_Choice choice)
  61.     : m_Outer(desc_it),
  62.       m_Current(NULL)
  63. {
  64.     if (choice != CSeqdesc::e_not_set) {
  65.         m_Choice.set(choice);
  66.     }
  67.     else {
  68.         m_Choice.set();
  69.     }
  70.     if ( !m_Outer )
  71.         return;
  72.     m_Inner = desc_it->Get().begin();
  73.     m_InnerEnd = desc_it->Get().end();
  74.     // Advance to the first relevant Seqdesc, if any.
  75.     x_Next();
  76. }
  77. CSeqdesc_CI::CSeqdesc_CI(const CBioseq_Handle& handle,
  78.                          CSeqdesc::E_Choice choice,
  79.                          size_t search_depth)
  80.     : m_Outer(handle, search_depth),
  81.       m_Current(NULL)
  82. {
  83.     if (choice != CSeqdesc::e_not_set) {
  84.         m_Choice.set(choice);
  85.     }
  86.     else {
  87.         m_Choice.set();
  88.     }
  89.     if ( !m_Outer )
  90.         return;
  91.     m_Inner = m_Outer->Get().begin();
  92.     m_InnerEnd = m_Outer->Get().end();
  93.     // Advance to the first relevant Seqdesc, if any.
  94.     x_Next();
  95. }
  96. CSeqdesc_CI::CSeqdesc_CI(const CSeq_entry_Handle& entry,
  97.                          CSeqdesc::E_Choice choice,
  98.                          size_t search_depth)
  99.     : m_Outer(entry, search_depth),
  100.       m_Current(NULL)
  101. {
  102.     if (choice != CSeqdesc::e_not_set) {
  103.         m_Choice.set(choice);
  104.     }
  105.     else {
  106.         m_Choice.set();
  107.     }
  108.     if ( !m_Outer )
  109.         return;
  110.     m_Inner = m_Outer->Get().begin();
  111.     m_InnerEnd = m_Outer->Get().end();
  112.     // Advance to the first relevant Seqdesc, if any.
  113.     x_Next();
  114. }
  115. CSeqdesc_CI::CSeqdesc_CI(const CBioseq_Handle& handle,
  116.                          const TDescChoices& choices,
  117.                          size_t search_depth)
  118.     : m_Outer(handle, search_depth),
  119.       m_Current(NULL)
  120. {
  121.     ITERATE(TDescChoices, it, choices) {
  122.         m_Choice.set(*it);
  123.     }
  124.     if ( !m_Outer )
  125.         return;
  126.     m_Inner = m_Outer->Get().begin();
  127.     m_InnerEnd = m_Outer->Get().end();
  128.     // Advance to the first relevant Seqdesc, if any.
  129.     x_Next();
  130. }
  131. CSeqdesc_CI::CSeqdesc_CI(const CSeq_entry_Handle& entry,
  132.                          const TDescChoices& choices,
  133.                          size_t search_depth)
  134.     : m_Outer(entry, search_depth),
  135.       m_Current(NULL)
  136. {
  137.     ITERATE(TDescChoices, it, choices) {
  138.         m_Choice.set(*it);
  139.     }
  140.     if ( !m_Outer )
  141.         return;
  142.     m_Inner = m_Outer->Get().begin();
  143.     m_InnerEnd = m_Outer->Get().end();
  144.     // Advance to the first relevant Seqdesc, if any.
  145.     x_Next();
  146. }
  147. CSeqdesc_CI::CSeqdesc_CI(const CSeqdesc_CI& iter)
  148.     : m_Outer(iter.m_Outer),
  149.       m_Inner(iter.m_Inner),
  150.       m_InnerEnd(iter.m_InnerEnd),
  151.       m_Current(iter.m_Current),
  152.       m_Choice(iter.m_Choice)
  153. {
  154. }
  155. CSeqdesc_CI::~CSeqdesc_CI(void)
  156. {
  157.     return;
  158. }
  159. CSeqdesc_CI& CSeqdesc_CI::operator= (const CSeqdesc_CI& iter)
  160. {
  161.     if (this != &iter) {
  162.         m_Current  = iter.m_Current;
  163.         m_Outer    = iter.m_Outer;
  164.         m_Inner    = iter.m_Inner;
  165.         m_InnerEnd = iter.m_InnerEnd;
  166.         m_Choice   = iter.m_Choice;
  167.     }
  168.     return *this;
  169. }
  170. void CSeqdesc_CI::x_Next(void)
  171. {
  172.     while (m_Outer) {
  173.         while (m_Inner != m_InnerEnd) {
  174.             if ( m_Choice[(*m_Inner)->Which()] ) {
  175.                 m_Current = *m_Inner;
  176.                 ++m_Inner;
  177.                 return;
  178.             } else {
  179.                 ++m_Inner;
  180.             }
  181.         }
  182.         if (++m_Outer) {
  183.             m_Inner    = m_Outer->Get().begin();
  184.             m_InnerEnd = m_Outer->Get().end();
  185.         }
  186.     }
  187.     m_Current = NULL;
  188. }
  189. CSeqdesc_CI& CSeqdesc_CI::operator++(void)
  190. {
  191.     x_Next();
  192.     return *this;
  193. }
  194. CSeqdesc_CI::operator bool(void) const
  195. {
  196.     return bool(m_Current)  &&  (m_Inner != m_InnerEnd  ||  m_Outer);
  197. }
  198. const CSeqdesc& CSeqdesc_CI::operator*(void) const
  199. {
  200.     _ASSERT(m_Current);
  201.     return *m_Current;
  202. }
  203. const CSeqdesc* CSeqdesc_CI::operator->(void) const
  204. {
  205.     _ASSERT(m_Current);
  206.     return m_Current;
  207. }
  208. CSeq_entry_Handle CSeqdesc_CI::GetSeq_entry_Handle(void) const
  209. {
  210.     return m_Outer ? m_Outer.GetSeq_entry_Handle() :
  211.         CSeq_entry_Handle();
  212. }
  213. END_SCOPE(objects)
  214. END_NCBI_SCOPE
  215. /*
  216. * ---------------------------------------------------------------------------
  217. * $Log: seqdesc_ci.cpp,v $
  218. * Revision 1000.2  2004/06/01 19:24:28  gouriano
  219. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.13
  220. *
  221. * Revision 1.13  2004/05/21 21:42:13  gorelenk
  222. * Added PCH ncbi_pch.hpp
  223. *
  224. * Revision 1.12  2004/04/28 14:14:39  grichenk
  225. * Added filtering by several seqdesc types.
  226. *
  227. * Revision 1.11  2004/03/16 15:47:28  vasilche
  228. * Added CBioseq_set_Handle and set of EditHandles
  229. *
  230. * Revision 1.10  2004/02/09 19:18:54  grichenk
  231. * Renamed CDesc_CI to CSeq_descr_CI. Redesigned CSeq_descr_CI
  232. * and CSeqdesc_CI to avoid using data directly.
  233. *
  234. * Revision 1.9  2003/06/02 16:06:38  dicuccio
  235. * Rearranged src/objects/ subtree.  This includes the following shifts:
  236. *     - src/objects/asn2asn --> arc/app/asn2asn
  237. *     - src/objects/testmedline --> src/objects/ncbimime/test
  238. *     - src/objects/objmgr --> src/objmgr
  239. *     - src/objects/util --> src/objmgr/util
  240. *     - src/objects/alnmgr --> src/objtools/alnmgr
  241. *     - src/objects/flat --> src/objtools/flat
  242. *     - src/objects/validator --> src/objtools/validator
  243. *     - src/objects/cddalignview --> src/objtools/cddalignview
  244. * In addition, libseq now includes six of the objects/seq... libs, and libmmdb
  245. * replaces the three libmmdb? libs.
  246. *
  247. * Revision 1.8  2003/03/14 19:10:41  grichenk
  248. * + SAnnotSelector::EIdResolving; fixed operator=() for several classes
  249. *
  250. * Revision 1.7  2003/03/13 13:02:36  dicuccio
  251. * Added #include for annot_object.hpp - fixes obtuse error for Win32 builds
  252. *
  253. * Revision 1.6  2002/12/05 19:28:32  grichenk
  254. * Prohibited postfix operator ++()
  255. *
  256. * Revision 1.5  2002/07/08 20:51:02  grichenk
  257. * Moved log to the end of file
  258. * Replaced static mutex (in CScope, CDataSource) with the mutex
  259. * pool. Redesigned CDataSource data locking.
  260. *
  261. * Revision 1.4  2002/05/09 14:20:54  grichenk
  262. * Added checking of m_Current validity
  263. *
  264. * Revision 1.3  2002/05/06 03:28:48  vakatov
  265. * OM/OM1 renaming
  266. *
  267. * Revision 1.2  2002/02/21 19:27:06  grichenk
  268. * Rearranged includes. Added scope history. Added searching for the
  269. * best seq-id match in data sources and scopes. Updated tests.
  270. *
  271. * Revision 1.1  2002/01/11 19:06:25  gouriano
  272. * restructured objmgr
  273. *
  274. *
  275. * ===========================================================================
  276. */