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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: lds_coreobjreader.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:45:58  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: lds_coreobjreader.cpp,v 1000.1 2004/06/01 19:45:58 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: Anatoliy Kuznetsov
  35.  *
  36.  * File Description:  Core objects reader implementations.
  37.  *
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include <objtools/lds/admin/lds_coreobjreader.hpp>
  41. #include <objects/seqset/Seq_entry.hpp>
  42. #include <objects/seq/Bioseq.hpp>
  43. #include <objects/seqloc/Seq_id.hpp>
  44. #include <objects/seq/Seq_descr.hpp>
  45. #include <objects/seq/Seqdesc.hpp>
  46. #include <objects/submit/Seq_submit.hpp>
  47. #include <objects/seqset/Bioseq_set.hpp>
  48. #include <objects/seq/Seq_annot.hpp>
  49. #include <objects/seqalign/Seq_align.hpp>
  50. BEGIN_NCBI_SCOPE
  51. BEGIN_SCOPE(objects)
  52. CLDS_CoreObjectsReader::CLDS_CoreObjectsReader(void)
  53. {
  54.     AddCandidate(CObjectTypeInfo(CType<CSeq_entry>()));
  55.     AddCandidate(CObjectTypeInfo(CType<CBioseq>()));
  56.     AddCandidate(CObjectTypeInfo(CType<CBioseq_set>()));
  57.     AddCandidate(CObjectTypeInfo(CType<CSeq_annot>()));
  58.     AddCandidate(CObjectTypeInfo(CType<CSeq_align>()));
  59. }
  60. void CLDS_CoreObjectsReader::OnTopObjectFoundPre(const CObjectInfo& object,
  61.                                                  size_t stream_offset)
  62. {
  63.     // GetStreamOffset() returns offset of the most recent top level object
  64.     // In case of the Text ASN.1 it can differ from the stream_offset variable
  65.     // because reader first reads the file header and only then calls the main
  66.     // Read function.
  67.     size_t offset = GetStreamOffset();
  68.     m_TopDescr = SObjectParseDescr(&object, offset);
  69.     m_Stack.push(SObjectParseDescr(&object, offset));
  70. }
  71. void CLDS_CoreObjectsReader::OnTopObjectFoundPost(const CObjectInfo& object)
  72. {
  73.     SObjectParseDescr pdescr = m_Stack.top();
  74.     SObjectDetails od(*pdescr.object_info, 
  75.                       pdescr.stream_offset,
  76.                       0,
  77.                       0,
  78.                       true);
  79.     m_Objects.push_back(od);
  80.     m_Stack.pop();
  81.     _ASSERT(m_Stack.empty());
  82. }
  83. void CLDS_CoreObjectsReader::OnObjectFoundPre(const CObjectInfo& object, 
  84.                                               size_t stream_offset)
  85. {
  86.     if (m_Stack.size() == 0) {
  87.         OnTopObjectFoundPre(object, stream_offset);
  88.         return;
  89.     }
  90.     _ASSERT(stream_offset);
  91.     m_Stack.push(SObjectParseDescr(&object, stream_offset));
  92. }
  93. void CLDS_CoreObjectsReader::OnObjectFoundPost(const CObjectInfo& object)
  94. {
  95.     if (m_Stack.size() == 1) {
  96.         OnTopObjectFoundPost(object);
  97.         return;
  98.     }
  99.     SObjectParseDescr object_descr = m_Stack.top();
  100.     m_Stack.pop();
  101.     _ASSERT(!m_Stack.empty());
  102.     SObjectParseDescr parent_descr = m_Stack.top();
  103.     _ASSERT(object_descr.stream_offset); // non-top object must have an offset
  104.     SObjectDetails od(object, 
  105.                       object_descr.stream_offset,
  106.                       parent_descr.stream_offset,
  107.                       m_TopDescr.stream_offset,
  108.                       false);
  109.     m_Objects.push_back(od);
  110. }
  111. void CLDS_CoreObjectsReader::Reset()
  112. {
  113.     while (!m_Stack.empty()) {
  114.         m_Stack.pop();
  115.     }
  116. }
  117. CLDS_CoreObjectsReader::SObjectDetails* 
  118. CLDS_CoreObjectsReader::FindObjectInfo(size_t stream_offset)
  119. {
  120.     int idx = FindObject(stream_offset);
  121.     if (idx < 0)
  122.         return 0;
  123.     return &m_Objects[idx];
  124. }
  125. int CLDS_CoreObjectsReader::FindObject(size_t stream_offset)
  126. {
  127.     int idx = 0;
  128.     ITERATE(TObjectVector, it, m_Objects) {
  129.         if (it->offset == stream_offset) {
  130.             return idx;
  131.         }
  132.         ++idx;
  133.     }
  134.     return -1;
  135. }
  136. END_SCOPE(objects)
  137. END_NCBI_SCOPE
  138. /*
  139.  * ===========================================================================
  140.  * $Log: lds_coreobjreader.cpp,v $
  141.  * Revision 1000.1  2004/06/01 19:45:58  gouriano
  142.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6
  143.  *
  144.  * Revision 1.6  2004/05/21 21:42:55  gorelenk
  145.  * Added PCH ncbi_pch.hpp
  146.  *
  147.  * Revision 1.5  2003/10/09 16:46:57  kuznets
  148.  * Fixed bug with cleaning objects vector on every OnTopObjectFound call.
  149.  * Caused incorrect ASN.1 binary scan.
  150.  *
  151.  * Revision 1.4  2003/10/07 20:45:23  kuznets
  152.  * Implemented Reset()
  153.  *
  154.  * Revision 1.3  2003/07/14 19:44:40  kuznets
  155.  * Fixed a bug with objects offset in for ASN.1 text files
  156.  *
  157.  * Revision 1.2  2003/06/16 16:24:43  kuznets
  158.  * Fixed #include paths (lds <-> lds_admin separation)
  159.  *
  160.  * Revision 1.1  2003/06/03 14:13:25  kuznets
  161.  * Initial revision
  162.  *
  163.  * Revision 1.1  2003/05/22 18:56:05  kuznets
  164.  * Initial revision
  165.  *
  166.  *
  167.  * ===========================================================================
  168.  */