⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 attr_range_coll.hpp

📁 ncbi源码
💻 HPP
字号:
/* * =========================================================================== * PRODUCTION $Log: attr_range_coll.hpp,v $ * PRODUCTION Revision 1000.2  2004/06/01 19:51:46  gouriano * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4 * PRODUCTION * =========================================================================== */#ifndef GUI_WIDGETS_ALN_MULTIPLE___ATTR_RANGE_COLL__HPP#define GUI_WIDGETS_ALN_MULTIPLE___ATTR_RANGE_COLL__HPP/*  $Id: attr_range_coll.hpp,v 1000.2 2004/06/01 19:51:46 gouriano Exp $ * =========================================================================== * *                            PUBLIC DOMAIN NOTICE *               National Center for Biotechnology Information * *  This software/database is a "United States Government Work" under the *  terms of the United States Copyright Act.  It was written as part of *  the author's official duties as a United States Government employee and *  thus cannot be copyrighted.  This software/database is freely available *  to the public for use. The National Library of Medicine and the U.S. *  Government have not placed any restriction on its use or reproduction. * *  Although all reasonable efforts have been taken to ensure the accuracy *  and reliability of the software and data, the NLM and the U.S. *  Government do not and cannot warrant the performance or results that *  may be obtained by using this software or data. The NLM and the U.S. *  Government disclaim all warranties, express or implied, including *  warranties of performance, merchantability or fitness for any particular *  purpose. * *  Please cite the author in any work or product based on this material. * * =========================================================================== * * Authors:  Andrey Yazhuk * */#include <corelib/ncbistd.hpp>#include <corelib/ncbistl.hpp>#include <algorithm>BEGIN_NCBI_SCOPE////////////////////////////////////////////////////////////////////////////////// TAttrRangeCollection represents a sequence of continious attributed intervals./// Intervals are neither intersecting nor separated by gaps.template<class Attr, class Position>    class CAttrRangeCollection{public:    typedef Attr        attr_type;    typedef Position    position_type;    typedef CAttrRangeCollection<attr_type, position_type>  TThisType;    protected:    struct SElement    {        position_type   m_Start;        attr_type       m_Attr;        bool operator<(position_type pos) const        {            return m_Start < pos;        }    };            typedef vector<SElement>    TElementVector;    TElementVector m_vElems;     /// contains one extra element that is used to represent open end pospublic:    typedef typename TElementVector::size_type   size_type;    typedef typename TElementVector::const_iterator vec_const_iterator;    class const_iterator;    class element_proxy;    CAttrRangeCollection()    {        SetFrom(0);    }    CAttrRangeCollection(TSeqPos start)    {        SetFrom(start);    }    void    SetFrom(TSeqPos start)    {        if(m_vElems.size() == 0)    {            m_vElems.push_back(SElement());        }        else if(m_vElems.size() > 1) {            clear();        }        m_vElems.back().m_Start = start;    }    void    push_back(const attr_type& attr)    {        push_back(attr, 1);    }    void    push_back(const attr_type& attr, TSeqPos len)    {        int N = m_vElems.size();        if((N > 1)  && (m_vElems[N-2].m_Attr == attr)) {            m_vElems[N-1].m_Start += len; //extend        } else {            m_vElems[N-1].m_Attr = attr;            m_vElems.push_back(SElement());            m_vElems.back().m_Start = m_vElems[N-1].m_Start + len;        }    }    const_iterator  begin() const       {           return const_iterator(m_vElems.begin());    }    const_iterator  end() const         {           return const_iterator(m_vElems.end() - 1);    }    size_type size() const      {           return m_vElems.size() - 1;        }    bool    empty() const       {           return m_vElems.size() == 1;       }    const element_proxy operator[](size_type pos)   const       {          return element_proxy(m_vElems.begin() + pos);      }    void    clear()    {        m_vElems.begin()->m_Start = m_vElems.back().m_Start;        m_vElems.resize(1);    }        const_iterator  find(position_type pos)   const    {        vec_const_iterator it = x_Find(m_vElems.begin(), m_vElems.end(), pos);        return const_iterator(it);    }       const_iterator  find(const_iterator first, const_iterator last, position_type pos)   const    {        vec_const_iterator it = x_Find(*first, *last, pos);        return const_iterator(it);    }       position_type   GetFrom() const    {        return m_vElems.begin()->m_Start;    }    position_type   GetToOpen() const    {        return m_vElems.back().m_Start;    }    position_type   GetTo() const    {        return m_vElems.back().m_Start - 1;    }        position_type   GetLength (void) const    {       return m_vElems.back().m_Start - m_vElems.begin().m_Start;    }protected:    vec_const_iterator x_Find(vec_const_iterator first, vec_const_iterator last,                               position_type pos) const    {        if(first != last)   {                        if(pos >= first->m_Start  &&  pos < last->m_Start)    {                 // pos lies with in the collection                vec_const_iterator it = lower_bound(first, last, pos);                return (it->m_Start > pos) ? --it : it;            }        }        return  m_vElems.end() - 1;    }public:    // represents virtual element    class element_proxy    {            public:        element_proxy(vec_const_iterator it)        : m_itEl(it)        {        }        element_proxy(const element_proxy& ep)        : m_itEl(ep.m_itEl)        {        }        TSeqPos GetStart() const        {            return m_itEl->m_Start;        }        TSeqPos GetTo()   const        {            return (m_itEl + 1)->m_Start - 1;        }        TSeqPos GetToOpen()   const        {            return (m_itEl + 1)->m_Start;        }        TSeqPos GetLength()   const        {            return (m_itEl + 1)->m_Start - m_itEl->m_Start;        }           const attr_type& GetAttr() const        {            return m_itEl->m_Attr;        }        bool    RefEquals(const element_proxy& ep) const             {            return m_itEl == ep.m_itEl;        }        operator vec_const_iterator ()    const        {            return m_itEl;        }        void    Inc()        {            ++m_itEl;        }        void    Dec()        {            --m_itEl;        }    protected:        vec_const_iterator m_itEl;    };    class const_iterator    {        friend class CAttrRangeCollection;    public:        const_iterator(vec_const_iterator itEl)            : m_proxy(itEl)        {        }        const_iterator(const const_iterator& it)            : m_proxy(it.m_proxy)        {        }        const element_proxy& operator*()  const           {             return m_proxy;           }        const element_proxy* operator->()  const           {             return &m_proxy;           }        const_iterator& operator++()	    {            Inc();			return (*this);         }		const_iterator operator++(int)		{            const_iterator Tmp = *this;			Inc();			return Tmp;         }        const_iterator& operator--()	    {            Dec();			return (*this);         }		const_iterator operator--(int)		{            const_iterator Tmp = *this;			Dec();			return Tmp;         }        		        bool operator==(const const_iterator& it) const	    {            return m_proxy.RefEquals(it.m_proxy);        }        bool operator!=(const const_iterator& it) const        {            return ! (*this==it);        }    protected:        void    Inc()        {            m_proxy.Inc();        }        void    Dec()        {            m_proxy.Dec();        }    protected:        element_proxy m_proxy;    };protected:    };END_NCBI_SCOPE/* * =========================================================================== * $Log: attr_range_coll.hpp,v $ * Revision 1000.2  2004/06/01 19:51:46  gouriano * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4 * * Revision 1.4  2004/04/26 17:31:25  ucko * Fix a typo in operator[]. * * Revision 1.3  2003/11/17 21:16:50  yazhuk * Cosmetic changes to function argument names * * Revision 1.2  2003/10/29 23:37:20  yazhuk * Changed comments * * Revision 1.1  2003/10/10 18:56:26  yazhuk * Initial revision * * =========================================================================== */#endif  // GUI_WIDGETS_ALN_MULTIPLE___ATTR_RANGE_COLL__HPP

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -