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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: itree.hpp,v $
  4.  * PRODUCTION Revision 1000.0  2003/10/29 15:29:42  gouriano
  5.  * PRODUCTION PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R1.6
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef ITREE__HPP
  10. #define ITREE__HPP
  11. /*  $Id: itree.hpp,v 1000.0 2003/10/29 15:29:42 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: Eugene Vasilchenko
  37. *
  38. * File Description:
  39. *   Implementation of interval search tree based on McCreight's algorithm.
  40. *
  41. * ===========================================================================
  42. */
  43. #include <corelib/ncbistd.hpp>
  44. #include <corelib/ncbiobj.hpp>
  45. #include <corelib/ncbiutil.hpp>
  46. #include <corelib/ncbi_limits.hpp>
  47. #include <util/range.hpp>
  48. #include <util/linkedset.hpp>
  49. /** @addtogroup IntervalTree
  50.  *
  51.  * @{
  52.  */
  53. BEGIN_NCBI_SCOPE
  54. // forward declarations
  55. class CIntervalTreeTraits;
  56. template<class Traits> class CIntervalTreeConstIteratorTraits;
  57. template<class Traits> class CIntervalTreeIteratorTraits;
  58. class CIntervalTree;
  59. template<class Traits> struct SIntervalTreeNode;
  60. template<class Traits> struct SIntervalTreeNodeIntervals;
  61. template<class Traits> class CIntervalTreeIterator;
  62. // parameter class for CIntervalTree
  63. class NCBI_XUTIL_EXPORT CIntervalTreeTraits
  64. {
  65. public:
  66.     typedef CIntervalTreeTraits TTraits;
  67.     typedef CIntervalTreeIteratorTraits<TTraits> TIteratorTraits;
  68.     typedef CIntervalTreeConstIteratorTraits<TTraits> TConstIteratorTraits;
  69.     typedef CIntervalTree TMap;
  70.     typedef CIntervalTreeIterator<TIteratorTraits> TNCIterator;
  71.     typedef int coordinate_type;
  72.     typedef CRange<coordinate_type> interval_type;
  73.     typedef CConstRef<CObject> mapped_type;
  74.     typedef SLinkedSetValue<coordinate_type> TMapValue;
  75.     struct STreeMapValue : public TMapValue
  76.     {
  77.         STreeMapValue(coordinate_type key, coordinate_type y,
  78.                       const mapped_type& value)
  79.             : TMapValue(key), m_Y(y), m_Value(value)
  80.             {
  81.             }
  82.         coordinate_type m_Y;
  83.         mapped_type m_Value;
  84.         interval_type GetInterval(void) const
  85.             {
  86.                 return interval_type(GetKey(), m_Y);
  87.             }
  88.     };
  89.     typedef STreeMapValue TTreeMapValue;
  90.     typedef CLinkedMultiset<TTreeMapValue> TTreeMap;
  91.     typedef TTreeMap::iterator TTreeMapI;
  92.     typedef TTreeMap::const_iterator TTreeMapCI;
  93.     struct SNodeMapValue : public TMapValue
  94.     {
  95.         SNodeMapValue(coordinate_type key, TTreeMapI value)
  96.             : TMapValue(key), m_Value(value)
  97.             {
  98.             }
  99.         TTreeMapI m_Value;
  100.     };
  101.     typedef SNodeMapValue TNodeMapValue;
  102.     typedef CLinkedMultiset<TNodeMapValue> TNodeMap;
  103.     typedef TNodeMap::iterator TNodeMapI;
  104.     typedef TNodeMap::const_iterator TNodeMapCI;
  105.     typedef SIntervalTreeNode<TTraits> TTreeNode;
  106.     typedef SIntervalTreeNodeIntervals<TTraits> TTreeNodeInts;
  107.     static coordinate_type GetMax(void);
  108.     static coordinate_type GetMaxCoordinate(void);
  109.     static bool IsNormal(const interval_type& interval);
  110. };
  111. // parameter class for CIntervalTree
  112. template<class Traits>
  113. class CIntervalTreeIteratorTraits : public Traits
  114. {
  115.     typedef Traits TParent;
  116. public:
  117.     typedef TParent TTreeTraits;
  118.     typedef typename TParent::mapped_type& reference;
  119.     typedef typename TParent::TTreeNode* TTreeNodeP;
  120.     typedef typename TParent::TTreeNodeInts* TTreeNodeIntsP;
  121.     typedef typename TParent::TMapValue* TMapValueP;
  122.     typedef typename TParent::TTreeMapValue* TTreeMapValueP;
  123.     typedef typename TParent::TNodeMapValue* TNodeMapValueP;
  124. };
  125. template<class Traits>
  126. class CIntervalTreeConstIteratorTraits : public Traits
  127. {
  128.     typedef Traits TParent;
  129. public:
  130.     typedef TParent TTreeTraits;
  131.     typedef const typename TParent::mapped_type& reference;
  132.     typedef const typename TParent::TTreeNode* TTreeNodeP;
  133.     typedef const typename TParent::TTreeNodeInts* TTreeNodeIntsP;
  134.     typedef const typename TParent::TMapValue* TMapValueP;
  135.     typedef const typename TParent::TTreeMapValue* TTreeMapValueP;
  136.     typedef const typename TParent::TNodeMapValue* TNodeMapValueP;
  137. };
  138. // interval search tree structures
  139. template<typename Traits>
  140. struct SIntervalTreeNode
  141. {
  142.     typedef Traits TTraits;
  143.     typedef typename TTraits::coordinate_type coordinate_type;
  144.     typedef typename TTraits::interval_type interval_type;
  145.     typedef typename TTraits::mapped_type mapped_type;
  146.     typedef typename TTraits::TTreeNode TTreeNode;
  147.     typedef typename TTraits::TTreeNodeInts TTreeNodeInts;
  148.     coordinate_type m_Key;
  149.     TTreeNode* m_Left;
  150.     TTreeNode* m_Right;
  151.     TTreeNodeInts* m_NodeIntervals;
  152. };
  153. template<typename Traits>
  154. struct SIntervalTreeNodeIntervals
  155. {
  156.     typedef Traits TTraits;
  157.     typedef typename TTraits::coordinate_type coordinate_type;
  158.     typedef typename TTraits::interval_type interval_type;
  159.     typedef typename TTraits::mapped_type mapped_type;
  160.     typedef typename TTraits::TTreeNode TTreeNode;
  161.     typedef typename TTraits::TTreeNodeInts TTreeNodeInts;
  162.     typedef typename TTraits::TNodeMap TNodeMap;
  163.     typedef typename TTraits::TNodeMapValue TNodeMapValue;
  164.     typedef typename TTraits::TNodeMapI TNodeMapI;
  165.     typedef typename TTraits::TTreeMapI TTreeMapI;
  166.     bool Empty(void) const;
  167.     
  168.     void Insert(const interval_type& interval, TTreeMapI value);
  169.     bool Delete(const interval_type& interval, TTreeMapI value);
  170.     static void Delete(TNodeMap& m, const TNodeMapValue& v);
  171.     
  172.     TNodeMap m_ByX;
  173.     TNodeMap m_ByY;
  174. };
  175. template<class Traits>
  176. class CIntervalTreeIterator
  177. {
  178. public:
  179.     typedef Traits TTraits;
  180.     typedef CIntervalTreeIterator<TTraits> TThis;
  181.     typedef typename TTraits::coordinate_type coordinate_type;
  182.     typedef typename TTraits::interval_type interval_type;
  183.     typedef typename TTraits::reference reference;
  184.     typedef typename TTraits::TMapValueP TMapValueP;
  185.     typedef typename TTraits::TTreeMapValueP TTreeMapValueP;
  186.     typedef typename TTraits::TNodeMapValueP TNodeMapValueP;
  187.     typedef typename TTraits::TTreeNodeP TTreeNodeP;
  188.     typedef typename TTraits::TTreeNodeIntsP TTreeNodeIntsP;
  189.     typedef typename TTraits::TMap TMap;
  190.     typedef typename TTraits::TNCIterator TNCIterator;
  191.     CIntervalTreeIterator(coordinate_type search_x = 0,
  192.                           coordinate_type searchLimit = 0,
  193.                           TMapValueP currentMapValue = 0,
  194.                           TTreeNodeP nextNode = 0);
  195.     CIntervalTreeIterator(const TNCIterator& iter);
  196.     bool Valid(void) const;
  197.     operator bool(void) const;
  198.     bool operator!(void) const;
  199.     void Next(void);
  200.     TThis& operator++(void);
  201.     // get current state
  202.     interval_type GetInterval(void) const;
  203.     reference GetValue(void) const;
  204. protected:
  205.     bool InAuxMap(void) const;
  206.     friend class CIntervalTree;
  207.     TTreeMapValueP GetTreeMapValue(void) const;
  208.     void NextLevel(void);
  209. private:
  210.     // iterator can be in four states:
  211.     // 1. scanning auxList
  212.     //      m_SearchX == X of search interval (>= 0)
  213.     //      m_SearchLimit == Y of search interval (> X)
  214.     //      m_CurrentMapValue = current node in AuxMap (!= 0)
  215.     //      m_NextNode == root node pointer (!= 0)
  216.     // 2. scanning node by X
  217.     //      m_SearchX == X of search interval (>= 0)
  218.     //      m_SearchLimit == X of search interval (>= 0)
  219.     //      m_CurrentMapValue = current node in NodeMap (!= 0)
  220.     //      m_NextNode == next node pointer (may be 0)
  221.     // 3. scanning node by Y
  222.     //      m_SearchX == X of search interval (>= 0)
  223.     //      m_SearchLimit = -X of search interval (<= 0)
  224.     //      m_CurrentMapValue = current node in NodeMap (!= 0)
  225.     //      m_NextNode == next node pointer (may be 0)
  226.     // 4. end of scan
  227.     //      m_CurrentMapValue == 0
  228.     // So state determination will be:
  229.     // if ( m_CurrentMapValue == 0 ) state = END
  230.     // else if ( m_SearchLimit > m_SearchX ) state = AUX
  231.     // else if ( m_SearchLimit >= 0 ) state = NODE_BY_X
  232.     // else state = NODE_BY_Y
  233.     coordinate_type m_SearchX;
  234.     coordinate_type m_SearchLimit;
  235.     TMapValueP m_CurrentMapValue;
  236.     TTreeNodeP m_NextNode;
  237. };
  238. // deal with intervals with coordinates in range [0, max], where max is
  239. // CIntervalTree constructor argument.
  240. class NCBI_XUTIL_EXPORT CIntervalTree
  241. {
  242. public:
  243.     typedef CIntervalTreeTraits TTraits;
  244.     typedef TTraits::TIteratorTraits TIteratorTraits;
  245.     typedef TTraits::TConstIteratorTraits TConstIteratorTraits;
  246.     typedef size_t size_type;
  247.     typedef TTraits::coordinate_type coordinate_type;
  248.     typedef TTraits::interval_type interval_type;
  249.     typedef TTraits::mapped_type mapped_type;
  250.     typedef TTraits::TTreeMap TTreeMap;
  251.     typedef TTraits::TTreeMapI TTreeMapI;
  252.     typedef TTraits::TTreeMapCI TTreeMapCI;
  253.     typedef TTraits::TTreeMapValue TTreeMapValue;
  254.     typedef TTraits::TTreeNode TTreeNode;
  255.     typedef TTraits::TTreeNodeInts TTreeNodeInts;
  256.     typedef CIntervalTreeIterator<TIteratorTraits> iterator;
  257.     typedef CIntervalTreeIterator<TConstIteratorTraits> const_iterator;
  258.     CIntervalTree(void);
  259.     ~CIntervalTree(void);
  260.     // check state of tree
  261.     bool Empty(void) const;
  262.     size_type Size(void) const;
  263.     pair<double, size_type> Stat(void) const;
  264.     // remove all elements
  265.     void Clear(void);
  266.     // insert
  267.     iterator Insert(const interval_type& interval, const mapped_type& value);
  268.     // set value in tree independently of old value in slot
  269.     // return true if element was added to tree
  270.     bool Set(const interval_type& interval, const mapped_type& value);
  271.     // remove value from tree independently of old value in slot
  272.     // return true if id element was removed from tree
  273.     bool Reset(const interval_type& interval);
  274.     // add new value to tree, throw runtime_error if this slot is not empty
  275.     void Add(const interval_type& interval, const mapped_type& value);
  276.     // replace old value in tree, throw runtime_error if this slot is empty
  277.     void Replace(const interval_type& interval, const mapped_type& value);
  278.     // delete existing value from tree, throw runtime_error if slot is empty
  279.     void Delete(const interval_type& interval);
  280.     // versions of methods without throwing runtime_error
  281.     // add new value to tree, return false if this slot is not empty
  282.     bool Add(const interval_type& interval, const mapped_type& value,
  283.              const nothrow_t&);
  284.     // replace old value in tree, return false if this slot is empty
  285.     bool Replace(const interval_type& interval, const mapped_type& value,
  286.                  const nothrow_t&);
  287.     // delete existing value from tree, return false if slot is empty
  288.     bool Delete(const interval_type& interval,
  289.                 const nothrow_t&);
  290.     // end
  291.     const_iterator End(void) const;
  292.     iterator End(void);
  293.     // find
  294.     const_iterator Find(void) const;
  295.     iterator Find(void);
  296.     // list intervals containing specified point
  297.     const_iterator AllIntervals(void) const;
  298.     iterator AllIntervals(void);
  299.     // list intervals containing specified point
  300.     const_iterator IntervalsContaining(coordinate_type point) const;
  301.     iterator IntervalsContaining(coordinate_type point);
  302.     // list intervals overlapping with specified interval
  303.     const_iterator IntervalsOverlapping(const interval_type& interval) const;
  304.     iterator IntervalsOverlapping(const interval_type& interval);
  305.     static void Assign(const_iterator& dst, const iterator& src);
  306.     static void Assign(iterator& dst, const iterator& src);
  307. private:
  308.     void Init(void);
  309.     void Destroy(void);
  310.     struct SStat {
  311.         size_type count;
  312.         size_type total;
  313.         size_type max;
  314.     };
  315.     void Stat(const TTreeNode* node, SStat& stat) const;
  316.     void DoInsert(const interval_type& interval, TTreeMapI value);
  317.     bool DoDelete(TTreeNode* node, const interval_type& interval, TTreeMapI value);
  318.     // root managing
  319.     coordinate_type GetMaxRootCoordinate(void) const;
  320.     coordinate_type GetNextRootKey(void) const;
  321.     // node allocation
  322.     TTreeNode* AllocNode(void);
  323.     void DeallocNode(TTreeNode* node);
  324.     // node creation/deletion
  325.     TTreeNode* InitNode(TTreeNode* node, coordinate_type key) const;
  326.     void ClearNode(TTreeNode* node);
  327.     void DeleteNode(TTreeNode* node);
  328.     // node intervals allocation
  329.     TTreeNodeInts* AllocNodeIntervals(void);
  330.     void DeallocNodeIntervals(TTreeNodeInts* nodeIntervals);
  331.     // node intervals creation/deletion
  332.     TTreeNodeInts* CreateNodeIntervals(void);
  333.     void DeleteNodeIntervals(TTreeNodeInts* nodeIntervals);
  334.     TTreeNode m_Root;
  335.     TTreeMap m_ByX;
  336. #if defined(_RWSTD_VER) && !defined(_RWSTD_ALLOCATOR)
  337.     // BW_1: non standard Sun's allocators
  338.     typedef allocator_interface<allocator<TTreeNode>,TTreeNode> TNodeAllocator;
  339.     typedef allocator_interface<allocator<TTreeNodeInts>,TTreeNodeInts> TNodeIntervalsAllocator;
  340. #else
  341.     typedef allocator<TTreeNode> TNodeAllocator;
  342.     typedef allocator<TTreeNodeInts> TNodeIntervalsAllocator;
  343. #endif
  344.     TNodeAllocator m_NodeAllocator;
  345.     TNodeIntervalsAllocator m_NodeIntervalsAllocator;
  346. };
  347. /* @} */
  348. #include <util/itree.inl>
  349. END_NCBI_SCOPE
  350. /*
  351. * ---------------------------------------------------------------------------
  352. * $Log: itree.hpp,v $
  353. * Revision 1000.0  2003/10/29 15:29:42  gouriano
  354. * PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R1.6
  355. *
  356. * Revision 1.6  2003/04/17 17:50:16  siyan
  357. * Added doxygen support
  358. *
  359. * Revision 1.5  2003/02/07 16:54:01  vasilche
  360. * Pass all structures with size > sizeof int by reference.
  361. * Move cvs log to the end of files.
  362. *
  363. * Revision 1.4  2002/12/19 14:51:00  dicuccio
  364. * Added export specifier for Win32 DLL builds.
  365. *
  366. * Revision 1.3  2001/05/17 15:01:19  lavr
  367. * Typos corrected
  368. *
  369. * Revision 1.2  2001/01/29 15:18:38  vasilche
  370. * Cleaned CRangeMap and CIntervalTree classes.
  371. *
  372. * Revision 1.1  2001/01/11 15:00:37  vasilche
  373. * Added CIntervalTree for seraching on set of intervals.
  374. *
  375. * ===========================================================================
  376. */
  377. #endif  /* ITREE__HPP */