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

📄 itree.hpp

📁 ncbi源码
💻 HPP
字号:
/* * =========================================================================== * PRODUCTION $Log: itree.hpp,v $ * PRODUCTION Revision 1000.0  2003/10/29 15:29:42  gouriano * PRODUCTION PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R1.6 * PRODUCTION * =========================================================================== */#ifndef ITREE__HPP#define ITREE__HPP/*  $Id: itree.hpp,v 1000.0 2003/10/29 15:29:42 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.** ===========================================================================** Author: Eugene Vasilchenko** File Description:*   Implementation of interval search tree based on McCreight's algorithm.** ===========================================================================*/#include <corelib/ncbistd.hpp>#include <corelib/ncbiobj.hpp>#include <corelib/ncbiutil.hpp>#include <corelib/ncbi_limits.hpp>#include <util/range.hpp>#include <util/linkedset.hpp>/** @addtogroup IntervalTree * * @{ */BEGIN_NCBI_SCOPE// forward declarationsclass CIntervalTreeTraits;template<class Traits> class CIntervalTreeConstIteratorTraits;template<class Traits> class CIntervalTreeIteratorTraits;class CIntervalTree;template<class Traits> struct SIntervalTreeNode;template<class Traits> struct SIntervalTreeNodeIntervals;template<class Traits> class CIntervalTreeIterator;// parameter class for CIntervalTreeclass NCBI_XUTIL_EXPORT CIntervalTreeTraits{public:    typedef CIntervalTreeTraits TTraits;    typedef CIntervalTreeIteratorTraits<TTraits> TIteratorTraits;    typedef CIntervalTreeConstIteratorTraits<TTraits> TConstIteratorTraits;    typedef CIntervalTree TMap;    typedef CIntervalTreeIterator<TIteratorTraits> TNCIterator;    typedef int coordinate_type;    typedef CRange<coordinate_type> interval_type;    typedef CConstRef<CObject> mapped_type;    typedef SLinkedSetValue<coordinate_type> TMapValue;    struct STreeMapValue : public TMapValue    {        STreeMapValue(coordinate_type key, coordinate_type y,                      const mapped_type& value)            : TMapValue(key), m_Y(y), m_Value(value)            {            }        coordinate_type m_Y;        mapped_type m_Value;        interval_type GetInterval(void) const            {                return interval_type(GetKey(), m_Y);            }    };    typedef STreeMapValue TTreeMapValue;    typedef CLinkedMultiset<TTreeMapValue> TTreeMap;    typedef TTreeMap::iterator TTreeMapI;    typedef TTreeMap::const_iterator TTreeMapCI;    struct SNodeMapValue : public TMapValue    {        SNodeMapValue(coordinate_type key, TTreeMapI value)            : TMapValue(key), m_Value(value)            {            }        TTreeMapI m_Value;    };    typedef SNodeMapValue TNodeMapValue;    typedef CLinkedMultiset<TNodeMapValue> TNodeMap;    typedef TNodeMap::iterator TNodeMapI;    typedef TNodeMap::const_iterator TNodeMapCI;    typedef SIntervalTreeNode<TTraits> TTreeNode;    typedef SIntervalTreeNodeIntervals<TTraits> TTreeNodeInts;    static coordinate_type GetMax(void);    static coordinate_type GetMaxCoordinate(void);    static bool IsNormal(const interval_type& interval);};// parameter class for CIntervalTreetemplate<class Traits>class CIntervalTreeIteratorTraits : public Traits{    typedef Traits TParent;public:    typedef TParent TTreeTraits;    typedef typename TParent::mapped_type& reference;    typedef typename TParent::TTreeNode* TTreeNodeP;    typedef typename TParent::TTreeNodeInts* TTreeNodeIntsP;    typedef typename TParent::TMapValue* TMapValueP;    typedef typename TParent::TTreeMapValue* TTreeMapValueP;    typedef typename TParent::TNodeMapValue* TNodeMapValueP;};template<class Traits>class CIntervalTreeConstIteratorTraits : public Traits{    typedef Traits TParent;public:    typedef TParent TTreeTraits;    typedef const typename TParent::mapped_type& reference;    typedef const typename TParent::TTreeNode* TTreeNodeP;    typedef const typename TParent::TTreeNodeInts* TTreeNodeIntsP;    typedef const typename TParent::TMapValue* TMapValueP;    typedef const typename TParent::TTreeMapValue* TTreeMapValueP;    typedef const typename TParent::TNodeMapValue* TNodeMapValueP;};// interval search tree structurestemplate<typename Traits>struct SIntervalTreeNode{    typedef Traits TTraits;    typedef typename TTraits::coordinate_type coordinate_type;    typedef typename TTraits::interval_type interval_type;    typedef typename TTraits::mapped_type mapped_type;    typedef typename TTraits::TTreeNode TTreeNode;    typedef typename TTraits::TTreeNodeInts TTreeNodeInts;    coordinate_type m_Key;    TTreeNode* m_Left;    TTreeNode* m_Right;    TTreeNodeInts* m_NodeIntervals;};template<typename Traits>struct SIntervalTreeNodeIntervals{    typedef Traits TTraits;    typedef typename TTraits::coordinate_type coordinate_type;    typedef typename TTraits::interval_type interval_type;    typedef typename TTraits::mapped_type mapped_type;    typedef typename TTraits::TTreeNode TTreeNode;    typedef typename TTraits::TTreeNodeInts TTreeNodeInts;    typedef typename TTraits::TNodeMap TNodeMap;    typedef typename TTraits::TNodeMapValue TNodeMapValue;    typedef typename TTraits::TNodeMapI TNodeMapI;    typedef typename TTraits::TTreeMapI TTreeMapI;    bool Empty(void) const;        void Insert(const interval_type& interval, TTreeMapI value);    bool Delete(const interval_type& interval, TTreeMapI value);    static void Delete(TNodeMap& m, const TNodeMapValue& v);        TNodeMap m_ByX;    TNodeMap m_ByY;};template<class Traits>class CIntervalTreeIterator{public:    typedef Traits TTraits;    typedef CIntervalTreeIterator<TTraits> TThis;    typedef typename TTraits::coordinate_type coordinate_type;    typedef typename TTraits::interval_type interval_type;    typedef typename TTraits::reference reference;    typedef typename TTraits::TMapValueP TMapValueP;    typedef typename TTraits::TTreeMapValueP TTreeMapValueP;    typedef typename TTraits::TNodeMapValueP TNodeMapValueP;    typedef typename TTraits::TTreeNodeP TTreeNodeP;    typedef typename TTraits::TTreeNodeIntsP TTreeNodeIntsP;    typedef typename TTraits::TMap TMap;    typedef typename TTraits::TNCIterator TNCIterator;    CIntervalTreeIterator(coordinate_type search_x = 0,                          coordinate_type searchLimit = 0,                          TMapValueP currentMapValue = 0,                          TTreeNodeP nextNode = 0);    CIntervalTreeIterator(const TNCIterator& iter);    bool Valid(void) const;    operator bool(void) const;    bool operator!(void) const;    void Next(void);    TThis& operator++(void);    // get current state    interval_type GetInterval(void) const;    reference GetValue(void) const;protected:    bool InAuxMap(void) const;    friend class CIntervalTree;    TTreeMapValueP GetTreeMapValue(void) const;    void NextLevel(void);private:    // iterator can be in four states:    // 1. scanning auxList    //      m_SearchX == X of search interval (>= 0)    //      m_SearchLimit == Y of search interval (> X)    //      m_CurrentMapValue = current node in AuxMap (!= 0)    //      m_NextNode == root node pointer (!= 0)    // 2. scanning node by X    //      m_SearchX == X of search interval (>= 0)    //      m_SearchLimit == X of search interval (>= 0)    //      m_CurrentMapValue = current node in NodeMap (!= 0)    //      m_NextNode == next node pointer (may be 0)    // 3. scanning node by Y    //      m_SearchX == X of search interval (>= 0)    //      m_SearchLimit = -X of search interval (<= 0)    //      m_CurrentMapValue = current node in NodeMap (!= 0)    //      m_NextNode == next node pointer (may be 0)    // 4. end of scan    //      m_CurrentMapValue == 0    // So state determination will be:    // if ( m_CurrentMapValue == 0 ) state = END    // else if ( m_SearchLimit > m_SearchX ) state = AUX    // else if ( m_SearchLimit >= 0 ) state = NODE_BY_X    // else state = NODE_BY_Y    coordinate_type m_SearchX;    coordinate_type m_SearchLimit;    TMapValueP m_CurrentMapValue;    TTreeNodeP m_NextNode;};// deal with intervals with coordinates in range [0, max], where max is// CIntervalTree constructor argument.class NCBI_XUTIL_EXPORT CIntervalTree{public:    typedef CIntervalTreeTraits TTraits;    typedef TTraits::TIteratorTraits TIteratorTraits;    typedef TTraits::TConstIteratorTraits TConstIteratorTraits;    typedef size_t size_type;    typedef TTraits::coordinate_type coordinate_type;    typedef TTraits::interval_type interval_type;    typedef TTraits::mapped_type mapped_type;    typedef TTraits::TTreeMap TTreeMap;    typedef TTraits::TTreeMapI TTreeMapI;    typedef TTraits::TTreeMapCI TTreeMapCI;    typedef TTraits::TTreeMapValue TTreeMapValue;    typedef TTraits::TTreeNode TTreeNode;    typedef TTraits::TTreeNodeInts TTreeNodeInts;    typedef CIntervalTreeIterator<TIteratorTraits> iterator;    typedef CIntervalTreeIterator<TConstIteratorTraits> const_iterator;    CIntervalTree(void);    ~CIntervalTree(void);    // check state of tree    bool Empty(void) const;    size_type Size(void) const;    pair<double, size_type> Stat(void) const;    // remove all elements    void Clear(void);    // insert    iterator Insert(const interval_type& interval, const mapped_type& value);    // set value in tree independently of old value in slot    // return true if element was added to tree    bool Set(const interval_type& interval, const mapped_type& value);    // remove value from tree independently of old value in slot    // return true if id element was removed from tree    bool Reset(const interval_type& interval);    // add new value to tree, throw runtime_error if this slot is not empty    void Add(const interval_type& interval, const mapped_type& value);    // replace old value in tree, throw runtime_error if this slot is empty    void Replace(const interval_type& interval, const mapped_type& value);    // delete existing value from tree, throw runtime_error if slot is empty    void Delete(const interval_type& interval);    // versions of methods without throwing runtime_error    // add new value to tree, return false if this slot is not empty    bool Add(const interval_type& interval, const mapped_type& value,             const nothrow_t&);    // replace old value in tree, return false if this slot is empty    bool Replace(const interval_type& interval, const mapped_type& value,                 const nothrow_t&);    // delete existing value from tree, return false if slot is empty    bool Delete(const interval_type& interval,                const nothrow_t&);    // end    const_iterator End(void) const;    iterator End(void);    // find    const_iterator Find(void) const;    iterator Find(void);    // list intervals containing specified point    const_iterator AllIntervals(void) const;    iterator AllIntervals(void);    // list intervals containing specified point    const_iterator IntervalsContaining(coordinate_type point) const;    iterator IntervalsContaining(coordinate_type point);    // list intervals overlapping with specified interval    const_iterator IntervalsOverlapping(const interval_type& interval) const;    iterator IntervalsOverlapping(const interval_type& interval);    static void Assign(const_iterator& dst, const iterator& src);    static void Assign(iterator& dst, const iterator& src);private:    void Init(void);    void Destroy(void);    struct SStat {        size_type count;        size_type total;        size_type max;    };    void Stat(const TTreeNode* node, SStat& stat) const;    void DoInsert(const interval_type& interval, TTreeMapI value);    bool DoDelete(TTreeNode* node, const interval_type& interval, TTreeMapI value);    // root managing    coordinate_type GetMaxRootCoordinate(void) const;    coordinate_type GetNextRootKey(void) const;    // node allocation    TTreeNode* AllocNode(void);    void DeallocNode(TTreeNode* node);    // node creation/deletion    TTreeNode* InitNode(TTreeNode* node, coordinate_type key) const;    void ClearNode(TTreeNode* node);    void DeleteNode(TTreeNode* node);    // node intervals allocation    TTreeNodeInts* AllocNodeIntervals(void);    void DeallocNodeIntervals(TTreeNodeInts* nodeIntervals);    // node intervals creation/deletion    TTreeNodeInts* CreateNodeIntervals(void);    void DeleteNodeIntervals(TTreeNodeInts* nodeIntervals);    TTreeNode m_Root;    TTreeMap m_ByX;#if defined(_RWSTD_VER) && !defined(_RWSTD_ALLOCATOR)    // BW_1: non standard Sun's allocators    typedef allocator_interface<allocator<TTreeNode>,TTreeNode> TNodeAllocator;    typedef allocator_interface<allocator<TTreeNodeInts>,TTreeNodeInts> TNodeIntervalsAllocator;#else    typedef allocator<TTreeNode> TNodeAllocator;    typedef allocator<TTreeNodeInts> TNodeIntervalsAllocator;#endif    TNodeAllocator m_NodeAllocator;    TNodeIntervalsAllocator m_NodeIntervalsAllocator;};/* @} */#include <util/itree.inl>END_NCBI_SCOPE/** ---------------------------------------------------------------------------* $Log: itree.hpp,v $* Revision 1000.0  2003/10/29 15:29:42  gouriano* PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R1.6** Revision 1.6  2003/04/17 17:50:16  siyan* Added doxygen support** Revision 1.5  2003/02/07 16:54:01  vasilche* Pass all structures with size > sizeof int by reference.* Move cvs log to the end of files.** Revision 1.4  2002/12/19 14:51:00  dicuccio* Added export specifier for Win32 DLL builds.** Revision 1.3  2001/05/17 15:01:19  lavr* Typos corrected** Revision 1.2  2001/01/29 15:18:38  vasilche* Cleaned CRangeMap and CIntervalTree classes.** Revision 1.1  2001/01/11 15:00:37  vasilche* Added CIntervalTree for seraching on set of intervals.** ===========================================================================*/#endif  /* ITREE__HPP */

⌨️ 快捷键说明

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