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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: seqdbvolset.hpp,v $
  4.  * PRODUCTION Revision 1000.0  2004/04/15 15:06:37  gouriano
  5.  * PRODUCTION PRODUCTION: IMPORTED [CATCHUP_003] Dev-tree R1.7
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef OBJTOOLS_READERS_SEQDB__SEQDBVOLSET_HPP
  10. #define OBJTOOLS_READERS_SEQDB__SEQDBVOLSET_HPP
  11. /*  $Id: seqdbvolset.hpp,v 1000.0 2004/04/15 15:06:37 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:  Kevin Bealer
  37.  *
  38.  */
  39. /// CSeqDBVolSet class
  40. /// 
  41. /// This object defines access to a set of database volume.
  42. #include "seqdbvol.hpp"
  43. BEGIN_NCBI_SCOPE
  44. using namespace ncbi::objects;
  45. class CSeqDBVolSet : public CObject {
  46. public:
  47.     CSeqDBVolSet(CSeqDBMemPool        & mempool,
  48.                  const vector<string> & vol_names,
  49.                  char                   prot_nucl,
  50.                  bool                   use_mmap);
  51.     
  52.     const CSeqDBVol * FindVol(Uint4 oid, Uint4 & vol_oid) const
  53.     {
  54.         for(Uint4 index = 0; index < m_VolList.size(); index++) {
  55.             if ((m_VolList[index].OIDStart() <= oid) &&
  56.                 (m_VolList[index].OIDEnd()   >  oid)) {
  57.                 
  58.                 m_RecentVol = index;
  59.                 
  60.                 vol_oid = oid - m_VolList[index].OIDStart();
  61.                 return m_VolList[index].Vol();
  62.             }
  63.         }
  64.         
  65.         return 0;
  66.     }
  67.     
  68.     CSeqDBVol * FindVol(Uint4 oid, Uint4 & vol_oid)
  69.     {
  70.         for(Uint4 index = 0; index < m_VolList.size(); index++) {
  71.             if ((m_VolList[index].OIDStart() <= oid) &&
  72.                 (m_VolList[index].OIDEnd()   >  oid)) {
  73.                 
  74.                 m_RecentVol = index;
  75.                 
  76.                 vol_oid = oid - m_VolList[index].OIDStart();
  77.                 return m_VolList[index].Vol();
  78.             }
  79.         }
  80.         
  81.         return 0;
  82.     }
  83.     
  84.     const CSeqDBVol * GetVol(Uint4 i) const
  85.     {
  86.         if (m_VolList.empty()) {
  87.             return 0;
  88.         }
  89.         
  90.         if (i >= m_VolList.size()) {
  91.             return 0;
  92.         }
  93.         
  94.         m_RecentVol = i;
  95.         
  96.         return m_VolList[i].Vol();
  97.     }
  98.     
  99.     const CSeqDBVol * GetVol(const string & volname) const
  100.     {
  101.         if (const CVolEntry * v = x_FindVolName(volname)) {
  102.             return v->Vol();
  103.         }
  104.         return 0;
  105.     }
  106.     
  107.     CSeqDBVol * GetVol(const string & volname)
  108.     {
  109.         if (CVolEntry * v = x_FindVolName(volname)) {
  110.             return v->Vol();
  111.         }
  112.         return 0;
  113.     }
  114.     
  115.     const CSeqDBVol * GetRecentVol(void) const
  116.     {
  117.         const CSeqDBVol * v = GetVol(m_RecentVol);
  118.         
  119.         if (! v) {
  120.             v = GetVol(0);
  121.         }
  122.         
  123.         return v;
  124.     }
  125.     
  126.     const CSeqDBVol * GetLastVol(void) const
  127.     {
  128.         if (! m_VolList.empty()) {
  129.             return m_VolList.back().Vol();
  130.         }
  131.         return 0;
  132.     }
  133.     
  134.     void SetRecentVol(Uint4 i) const
  135.     {
  136.         m_RecentVol = i;
  137.     }
  138.     
  139.     Uint4 GetNumVols(void) const
  140.     {
  141.         return m_VolList.size();
  142.     }
  143.     
  144.     bool HasMask(void) const
  145.     {
  146.         for(Uint4 i = 0; i < m_VolList.size(); i++) {
  147.             if (0 != m_VolList[i].NumMasks()) {
  148.                 return true;
  149.             }
  150.         }
  151.         return false;
  152.     }
  153.     
  154.     bool HasSimpleMask(void) const
  155.     {
  156.         return ((m_VolList.size()        == 1) &&
  157.                 (m_VolList[0].NumMasks() == 1));
  158.     }
  159.     
  160.     string GetSimpleMask(void) const
  161.     {
  162.         _ASSERT(HasSimpleMask());
  163.         return m_VolList[0].GetSimpleMask();
  164.     }
  165.     
  166.     Uint4 GetNumSeqs(void) const
  167.     {
  168.         if (! m_VolList.empty()) {
  169.             return m_VolList.back().OIDEnd();
  170.         }
  171.         return 0;
  172.     }
  173.     
  174.     void GetMaskFiles(Uint4          index,
  175.                       bool         & all_oids,
  176.                       list<string> & mask_files,
  177.                       Uint4        & oid_start,
  178.                       Uint4        & oid_end) const
  179.     {
  180.         const CVolEntry & v = m_VolList[index];
  181.         
  182.         if (v.GetIncludeAll()) {
  183.             all_oids = true;
  184.         } else {
  185.             all_oids = false;
  186.             mask_files.clear();
  187.             v.GetMaskFiles(mask_files);
  188.         }
  189.         
  190.         oid_start = v.OIDStart();
  191.         oid_end   = v.OIDEnd();
  192.     }
  193.     
  194.     void AddMaskedVolume(const string & volname, const string & maskfile)
  195.     {
  196.         CVolEntry * v = x_FindVolName(volname);
  197.         if (! v) {
  198.             NCBI_THROW(CSeqDBException, eFileErr,
  199.                        "Error: Could not find volume (" + volname + ").");
  200.         }
  201.         v->AddMask(maskfile);
  202.     }
  203.     
  204.     void AddFullVolume(const string & volname)
  205.     {
  206.         CVolEntry * v = x_FindVolName(volname);
  207.         if (! v) {
  208.             NCBI_THROW(CSeqDBException, eFileErr,
  209.                        "Error: Could not find volume (" + volname + ").");
  210.         }
  211.         v->SetIncludeAll();
  212.     }
  213.     
  214. private:
  215.     
  216.     class CVolEntry {
  217.     public:
  218.         CVolEntry(CSeqDBVol * new_vol)
  219.             : m_Vol     (new_vol),
  220.               m_OIDStart(0),
  221.               m_OIDEnd  (0),
  222.               m_AllOIDs (false)
  223.         {
  224.         }
  225.         
  226.         void SetStartEnd(Uint4 start)
  227.         {
  228.             m_OIDStart = start;
  229.             m_OIDEnd   = start + m_Vol->GetNumSeqs();
  230.         }
  231.         
  232.         void AddMask(const string & mask_file)
  233.         {
  234.             if (! m_AllOIDs) {
  235.                 m_MaskFiles.insert(mask_file);
  236.             }
  237.         }
  238.         
  239.         void SetIncludeAll(void)
  240.         {
  241.             m_AllOIDs = true;
  242.             m_MaskFiles.clear();
  243.         }
  244.         
  245.         bool GetIncludeAll(void) const
  246.         {
  247.             return (m_AllOIDs || m_MaskFiles.empty());
  248.         }
  249.         
  250.         Uint4 NumMasks(void) const
  251.         {
  252.             return m_MaskFiles.size();
  253.         }
  254.         
  255.         Uint4 OIDStart(void) const
  256.         {
  257.             return m_OIDStart;
  258.         }
  259.         
  260.         Uint4 OIDEnd(void) const
  261.         {
  262.             return m_OIDEnd;
  263.         }
  264.         
  265.         CSeqDBVol * Vol(void)
  266.         {
  267.             return m_Vol.GetNonNullPointer();
  268.         }
  269.         
  270.         const CSeqDBVol * Vol(void) const
  271.         {
  272.             return m_Vol.GetNonNullPointer();
  273.         }
  274.         
  275.         string GetSimpleMask(void) const
  276.         {
  277.             _ASSERT(1 == m_MaskFiles.size());
  278.             return *(m_MaskFiles.begin());
  279.         }
  280.         
  281.         void GetMaskFiles(list<string> & mask_files) const
  282.         {
  283.             set<string>::const_iterator i = m_MaskFiles.begin();
  284.             
  285.             while(i != m_MaskFiles.end()) {
  286.                 mask_files.push_back(*i);
  287.                 i++;
  288.             }
  289.         }
  290.         
  291.     private:
  292.         CRef<CSeqDBVol> m_Vol;
  293.         Uint4           m_OIDStart;
  294.         Uint4           m_OIDEnd;
  295.         bool            m_AllOIDs;
  296.         set<string>     m_MaskFiles;
  297.     };
  298.     
  299.     Uint4 x_GetNumSeqs(void)
  300.     {
  301.         if (m_VolList.empty())
  302.             return 0;
  303.         
  304.         return m_VolList.back().OIDEnd();
  305.     }
  306.     
  307.     void x_AddVolume(CSeqDBMemPool & mempool,
  308.                      const string  & nm,
  309.                      char            pn,
  310.                      bool            use_mm)
  311.     {
  312.         CVolEntry new_vol( new CSeqDBVol(mempool, nm, pn, use_mm) );
  313.         new_vol.SetStartEnd( x_GetNumSeqs() );
  314.         m_VolList.push_back( new_vol );
  315.     }
  316.     
  317.     const CVolEntry * x_FindVolName(const string & volname) const
  318.     {
  319.         for(Uint4 i = 0; i<m_VolList.size(); i++) {
  320.             if (volname == m_VolList[i].Vol()->GetVolName()) {
  321.                 return & m_VolList[i];
  322.             }
  323.         }
  324.         
  325.         return 0;
  326.     }
  327.     
  328.     CVolEntry * x_FindVolName(const string & volname)
  329.     {
  330.         for(Uint4 i = 0; i<m_VolList.size(); i++) {
  331.             if (volname == m_VolList[i].Vol()->GetVolName()) {
  332.                 return & m_VolList[i];
  333.             }
  334.         }
  335.         
  336.         return 0;
  337.     }
  338.     
  339.     // Data
  340.     
  341.     // m_RecentVol is mutable and volatile, but is not protected by
  342.     // locking.  Instead the following precautions are always taken:
  343.     // 
  344.     // 1. First, the value is copied into a local variable.
  345.     // 2. Secondly, the range is always checked.
  346.     // 3. It is always treated as a hint; there is always fallback
  347.     //    code to search for the correct volume.
  348.     
  349.     vector<CVolEntry>      m_VolList;
  350.     mutable volatile Uint4 m_RecentVol;
  351. };
  352. END_NCBI_SCOPE
  353. #endif // OBJTOOLS_READERS_SEQDB__SEQDBVOLSET_HPP