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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: attr_range_coll.hpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 19:51:46  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef GUI_WIDGETS_ALN_MULTIPLE___ATTR_RANGE_COLL__HPP
  10. #define GUI_WIDGETS_ALN_MULTIPLE___ATTR_RANGE_COLL__HPP
  11. /*  $Id: attr_range_coll.hpp,v 1000.2 2004/06/01 19:51:46 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.  * Authors:  Andrey Yazhuk
  37.  *
  38.  */
  39. #include <corelib/ncbistd.hpp>
  40. #include <corelib/ncbistl.hpp>
  41. #include <algorithm>
  42. BEGIN_NCBI_SCOPE
  43. ///////////////////////////////////////////////////////////////////////////////
  44. /// TAttrRangeCollection represents a sequence of continious attributed intervals.
  45. /// Intervals are neither intersecting nor separated by gaps.
  46. template<class Attr, class Position>
  47.     class CAttrRangeCollection
  48. {
  49. public:
  50.     typedef Attr        attr_type;
  51.     typedef Position    position_type;
  52.     typedef CAttrRangeCollection<attr_type, position_type>  TThisType;
  53.     
  54. protected:
  55.     struct SElement
  56.     {
  57.         position_type   m_Start;
  58.         attr_type       m_Attr;
  59.         bool operator<(position_type pos) const
  60.         {
  61.             return m_Start < pos;
  62.         }
  63.     };  
  64.       
  65.     typedef vector<SElement>    TElementVector;
  66.     TElementVector m_vElems; 
  67.     /// contains one extra element that is used to represent open end pos
  68. public:
  69.     typedef typename TElementVector::size_type   size_type;
  70.     typedef typename TElementVector::const_iterator vec_const_iterator;
  71.     class const_iterator;
  72.     class element_proxy;
  73.     CAttrRangeCollection()
  74.     {
  75.         SetFrom(0);
  76.     }
  77.     CAttrRangeCollection(TSeqPos start)
  78.     {
  79.         SetFrom(start);
  80.     }
  81.     void    SetFrom(TSeqPos start)
  82.     {
  83.         if(m_vElems.size() == 0)    {
  84.             m_vElems.push_back(SElement());
  85.         }
  86.         else if(m_vElems.size() > 1) {
  87.             clear();
  88.         }
  89.         m_vElems.back().m_Start = start;
  90.     }
  91.     void    push_back(const attr_type& attr)
  92.     {
  93.         push_back(attr, 1);
  94.     }
  95.     void    push_back(const attr_type& attr, TSeqPos len)
  96.     {
  97.         int N = m_vElems.size();
  98.         if((N > 1)  && (m_vElems[N-2].m_Attr == attr)) {
  99.             m_vElems[N-1].m_Start += len; //extend
  100.         } else {
  101.             m_vElems[N-1].m_Attr = attr;
  102.             m_vElems.push_back(SElement());
  103.             m_vElems.back().m_Start = m_vElems[N-1].m_Start + len;
  104.         }
  105.     }
  106.     const_iterator  begin() const   
  107.     {   
  108.         return const_iterator(m_vElems.begin());
  109.     }
  110.     const_iterator  end() const     
  111.     {   
  112.         return const_iterator(m_vElems.end() - 1);
  113.     }
  114.     size_type size() const  
  115.     {   
  116.         return m_vElems.size() - 1;    
  117.     }
  118.     bool    empty() const   
  119.     {   
  120.         return m_vElems.size() == 1;   
  121.     }
  122.     const element_proxy operator[](size_type pos)   const   
  123.     {  
  124.         return element_proxy(m_vElems.begin() + pos);  
  125.     }
  126.     void    clear()
  127.     {
  128.         m_vElems.begin()->m_Start = m_vElems.back().m_Start;
  129.         m_vElems.resize(1);
  130.     }    
  131.     const_iterator  find(position_type pos)   const
  132.     {
  133.         vec_const_iterator it = x_Find(m_vElems.begin(), m_vElems.end(), pos);
  134.         return const_iterator(it);
  135.     }   
  136.     const_iterator  find(const_iterator first, const_iterator last, position_type pos)   const
  137.     {
  138.         vec_const_iterator it = x_Find(*first, *last, pos);
  139.         return const_iterator(it);
  140.     }   
  141.     position_type   GetFrom() const
  142.     {
  143.         return m_vElems.begin()->m_Start;
  144.     }
  145.     position_type   GetToOpen() const
  146.     {
  147.         return m_vElems.back().m_Start;
  148.     }
  149.     position_type   GetTo() const
  150.     {
  151.         return m_vElems.back().m_Start - 1;
  152.     }    
  153.     position_type   GetLength (void) const
  154.     {
  155.        return m_vElems.back().m_Start - m_vElems.begin().m_Start;
  156.     }
  157. protected:
  158.     vec_const_iterator x_Find(vec_const_iterator first, vec_const_iterator last, 
  159.                               position_type pos) const
  160.     {
  161.         if(first != last)   {            
  162.             if(pos >= first->m_Start  &&  pos < last->m_Start)    { 
  163.                 // pos lies with in the collection
  164.                 vec_const_iterator it = lower_bound(first, last, pos);
  165.                 return (it->m_Start > pos) ? --it : it;
  166.             }
  167.         }
  168.         return  m_vElems.end() - 1;
  169.     }
  170. public:
  171.     // represents virtual element
  172.     class element_proxy
  173.     {        
  174.     public:
  175.         element_proxy(vec_const_iterator it)
  176.         : m_itEl(it)
  177.         {
  178.         }
  179.         element_proxy(const element_proxy& ep)
  180.         : m_itEl(ep.m_itEl)
  181.         {
  182.         }
  183.         TSeqPos GetStart() const
  184.         {
  185.             return m_itEl->m_Start;
  186.         }
  187.         TSeqPos GetTo()   const
  188.         {
  189.             return (m_itEl + 1)->m_Start - 1;
  190.         }
  191.         TSeqPos GetToOpen()   const
  192.         {
  193.             return (m_itEl + 1)->m_Start;
  194.         }
  195.         TSeqPos GetLength()   const
  196.         {
  197.             return (m_itEl + 1)->m_Start - m_itEl->m_Start;
  198.         }   
  199.         const attr_type& GetAttr() const
  200.         {
  201.             return m_itEl->m_Attr;
  202.         }
  203.         bool    RefEquals(const element_proxy& ep) const     
  204.         {
  205.             return m_itEl == ep.m_itEl;
  206.         }
  207.         operator vec_const_iterator ()    const
  208.         {
  209.             return m_itEl;
  210.         }
  211.         void    Inc()
  212.         {
  213.             ++m_itEl;
  214.         }
  215.         void    Dec()
  216.         {
  217.             --m_itEl;
  218.         }
  219.     protected:
  220.         vec_const_iterator m_itEl;
  221.     };
  222.     class const_iterator
  223.     {
  224.         friend class CAttrRangeCollection;
  225.     public:
  226.         const_iterator(vec_const_iterator itEl)
  227.             : m_proxy(itEl)
  228.         {
  229.         }
  230.         const_iterator(const const_iterator& it)
  231.             : m_proxy(it.m_proxy)
  232.         {
  233.         }
  234.         const element_proxy& operator*()  const   
  235.         { 
  236.             return m_proxy;   
  237.         }
  238.         const element_proxy* operator->()  const   
  239.         { 
  240.             return &m_proxy;   
  241.         }
  242.         const_iterator& operator++()
  243.     {
  244.             Inc();
  245. return (*this); 
  246.         }
  247. const_iterator operator++(int)
  248. {
  249.             const_iterator Tmp = *this;
  250. Inc();
  251. return Tmp; 
  252.         }
  253.         const_iterator& operator--()
  254.     {
  255.             Dec();
  256. return (*this); 
  257.         }
  258. const_iterator operator--(int)
  259. {
  260.             const_iterator Tmp = *this;
  261. Dec();
  262. return Tmp; 
  263.         }        
  264.         bool operator==(const const_iterator& it) const
  265.     {
  266.             return m_proxy.RefEquals(it.m_proxy);
  267.         }
  268.         bool operator!=(const const_iterator& it) const
  269.         {
  270.             return ! (*this==it);
  271.         }
  272.     protected:
  273.         void    Inc()
  274.         {
  275.             m_proxy.Inc();
  276.         }
  277.         void    Dec()
  278.         {
  279.             m_proxy.Dec();
  280.         }
  281.     protected:
  282.         element_proxy m_proxy;
  283.     };
  284. protected:
  285.     
  286. };
  287. END_NCBI_SCOPE
  288. /*
  289.  * ===========================================================================
  290.  * $Log: attr_range_coll.hpp,v $
  291.  * Revision 1000.2  2004/06/01 19:51:46  gouriano
  292.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4
  293.  *
  294.  * Revision 1.4  2004/04/26 17:31:25  ucko
  295.  * Fix a typo in operator[].
  296.  *
  297.  * Revision 1.3  2003/11/17 21:16:50  yazhuk
  298.  * Cosmetic changes to function argument names
  299.  *
  300.  * Revision 1.2  2003/10/29 23:37:20  yazhuk
  301.  * Changed comments
  302.  *
  303.  * Revision 1.1  2003/10/10 18:56:26  yazhuk
  304.  * Initial revision
  305.  *
  306.  * ===========================================================================
  307.  */
  308. #endif  // GUI_WIDGETS_ALN_MULTIPLE___ATTR_RANGE_COLL__HPP