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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: itree.inl,v $
  4.  * PRODUCTION Revision 1000.0  2003/10/29 15:29:49  gouriano
  5.  * PRODUCTION PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R1.6
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #if defined(ITREE__HPP)  &&  !defined(ITREE__INL)
  10. #define ITREE__INL
  11. /*  $Id: itree.inl,v 1000.0 2003/10/29 15:29:49 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. *   Inline methods of interval search tree.
  40. *
  41. * ===========================================================================
  42. */
  43. inline
  44. CIntervalTreeTraits::coordinate_type
  45. CIntervalTreeTraits::GetMax(void)
  46. {
  47.     return interval_type::GetPositionMax();
  48. }
  49. inline
  50. CIntervalTreeTraits::coordinate_type
  51. CIntervalTreeTraits::GetMaxCoordinate(void)
  52. {
  53.     return GetMax() - 1;
  54. }
  55. inline
  56. bool CIntervalTreeTraits::IsNormal(const interval_type& interval)
  57. {
  58.     return interval.GetFrom() >= 0 &&
  59.         interval.GetFrom() <= interval.GetTo() &&
  60.         interval.GetTo() <= GetMaxCoordinate();
  61. }
  62. template<typename Traits>
  63. inline
  64. CIntervalTreeIterator<Traits>::CIntervalTreeIterator(coordinate_type search_x,
  65.                                                      coordinate_type searchLimit,
  66.                                                      TMapValueP currentMapValue,
  67.                                                      TTreeNodeP nextNode)
  68.     : m_SearchX(search_x),
  69.       m_SearchLimit(searchLimit),
  70.       m_CurrentMapValue(currentMapValue),
  71.       m_NextNode(nextNode)
  72. {
  73. }
  74. template<typename Traits>
  75. inline
  76. CIntervalTreeIterator<Traits>::CIntervalTreeIterator(const TNCIterator& iter)
  77. {
  78.     TMap::Assign(*this, iter);
  79. }
  80. template<typename Traits>
  81. inline
  82. bool CIntervalTreeIterator<Traits>::Valid(void) const
  83. {
  84.     return m_CurrentMapValue != 0;
  85. }
  86. template<typename Traits>
  87. inline
  88. bool CIntervalTreeIterator<Traits>::InAuxMap(void) const
  89. {
  90.     return m_SearchLimit > m_SearchX;
  91. }
  92. template<typename Traits>
  93. inline
  94. CIntervalTreeIterator<Traits>::operator bool(void) const
  95. {
  96.     return Valid();
  97. }
  98. template<typename Traits>
  99. inline
  100. bool CIntervalTreeIterator<Traits>::operator!(void) const
  101. {
  102.     return !Valid();
  103. }
  104. template<typename Traits>
  105. inline
  106. typename CIntervalTreeIterator<Traits>::TTreeMapValueP
  107. CIntervalTreeIterator<Traits>::GetTreeMapValue(void) const
  108. {
  109.     if ( InAuxMap() )
  110.         return static_cast<TTreeMapValueP>(m_CurrentMapValue);
  111.     else
  112.         return &*static_cast<TNodeMapValueP>(m_CurrentMapValue)->m_Value;
  113. }
  114. template<typename Traits>
  115. inline
  116. void CIntervalTreeIterator<Traits>::Next(void)
  117. {
  118.     TMapValueP newMapValue = m_CurrentMapValue->GetNext();
  119.     if ( newMapValue && newMapValue->GetKey() <= m_SearchLimit )
  120.         m_CurrentMapValue = newMapValue;
  121.     else
  122.         NextLevel();
  123. }
  124. template<typename Traits>
  125. inline
  126. typename CIntervalTreeIterator<Traits>::interval_type
  127. CIntervalTreeIterator<Traits>::GetInterval(void) const
  128. {
  129.     return GetTreeMapValue()->GetInterval();
  130. }
  131. template<typename Traits>
  132. inline
  133. CIntervalTreeIterator<Traits>& CIntervalTreeIterator<Traits>::operator++(void)
  134. {
  135.     Next();
  136.     return *this;
  137. }
  138. template<typename Traits>
  139. inline
  140. typename CIntervalTreeIterator<Traits>::reference
  141. CIntervalTreeIterator<Traits>::GetValue(void) const
  142. {
  143.     return *GetTreeMapValue()->m_Value;
  144. }
  145. template<typename Traits>
  146. void CIntervalTreeIterator<Traits>::NextLevel(void)
  147. {
  148.     // get iterator values
  149.     coordinate_type x = m_SearchX;
  150.     TTreeNodeP nextNode = m_NextNode;
  151.     // 
  152.     while ( nextNode ) {
  153.         // get node values
  154.         coordinate_type key = nextNode->m_Key;
  155.         TTreeNodeIntsP nodeIntervals = nextNode->m_NodeIntervals;
  156.         // new iterator values
  157.         TMapValueP firstMapValue;
  158.         coordinate_type searchLimit;
  159.         if ( x < key ) {
  160.             // by X
  161.             if ( x == key )
  162.                 nextNode = 0;
  163.             else
  164.                 nextNode = nextNode->m_Left;
  165.             if ( !nodeIntervals )
  166.                 continue; // skip this node
  167.             firstMapValue = nodeIntervals->m_ByX.GetStart();
  168.             searchLimit = x;
  169.         }
  170.         else {
  171.             // by Y
  172.             nextNode = nextNode->m_Right;
  173.             if ( !nodeIntervals )
  174.                 continue; // skip this node
  175.             firstMapValue = nodeIntervals->m_ByY.GetStart();
  176.             searchLimit = -x;
  177.         }
  178.         _ASSERT(firstMapValue);
  179.         if ( firstMapValue->GetKey() <= searchLimit ) {
  180.             m_CurrentMapValue = firstMapValue;
  181.             m_SearchLimit = searchLimit;
  182.             m_NextNode = nextNode;
  183.             return; // found
  184.         }
  185.     }
  186.     m_CurrentMapValue = 0;
  187. }
  188. template<class Traits>
  189. inline
  190. bool SIntervalTreeNodeIntervals<Traits>::Empty(void) const
  191. {
  192.     return m_ByX.empty();
  193. }
  194. template<class Traits>
  195. void SIntervalTreeNodeIntervals<Traits>::Delete(TNodeMap& m,
  196.                                                 const TNodeMapValue& value)
  197. {
  198.     TNodeMapI it = m.lower_bound(value);
  199.     _ASSERT(it != m.end());
  200.     while ( it->m_Value != value.m_Value ) {
  201.         ++it;
  202.         _ASSERT(it != m.end());
  203.         _ASSERT(it->GetKey() == value.GetKey());
  204.     }
  205.     m.erase(it);
  206. }
  207. template<class Traits>
  208. inline
  209. void SIntervalTreeNodeIntervals<Traits>::Insert(const interval_type& interval,
  210.                                                 TTreeMapI value)
  211. {
  212.     // insert interval
  213.     m_ByX.insert(TNodeMapValue(interval.GetFrom(), value));
  214.     m_ByY.insert(TNodeMapValue(-interval.GetTo(), value));
  215. }
  216. template<class Traits>
  217. inline
  218. bool SIntervalTreeNodeIntervals<Traits>::Delete(const interval_type& interval,
  219.                                                 TTreeMapI value)
  220. {
  221.     // erase interval
  222.     Delete(m_ByX, TNodeMapValue(interval.GetFrom(), value));
  223.     Delete(m_ByY, TNodeMapValue(-interval.GetTo(), value));
  224.     return Empty();
  225. }
  226. inline
  227. bool CIntervalTree::Empty(void) const
  228. {
  229.     return m_ByX.empty();
  230. }
  231. inline
  232. CIntervalTree::const_iterator
  233. CIntervalTree::End(void) const
  234. {
  235.     return const_iterator();
  236. }
  237. inline
  238. CIntervalTree::const_iterator
  239. CIntervalTree::AllIntervals(void) const
  240. {
  241.     if ( Empty() )
  242.         return End();
  243.     return const_iterator(0, TTraits::GetMaxCoordinate(), m_ByX.GetStart());
  244. }
  245. inline
  246. CIntervalTree::const_iterator
  247. CIntervalTree::IntervalsContaining(coordinate_type x) const
  248. {
  249.     const_iterator it(x, TTraits::GetMaxCoordinate(), 0, &m_Root);
  250.     it.NextLevel();
  251.     return it;
  252. }
  253. inline
  254. CIntervalTree::iterator
  255. CIntervalTree::End(void)
  256. {
  257.     return iterator();
  258. }
  259. inline
  260. CIntervalTree::iterator
  261. CIntervalTree::AllIntervals(void)
  262. {
  263.     if ( Empty() )
  264.         return End();
  265.     return iterator(0, TTraits::GetMaxCoordinate(), m_ByX.GetStart());
  266. }
  267. inline
  268. CIntervalTree::iterator
  269. CIntervalTree::IntervalsContaining(coordinate_type x)
  270. {
  271.     iterator it(x, TTraits::GetMaxCoordinate(), 0, &m_Root);
  272.     it.NextLevel();
  273.     return it;
  274. }
  275. inline
  276. void CIntervalTree::Init(void)
  277. {
  278. }
  279. inline
  280. CIntervalTree::size_type CIntervalTree::Size(void) const
  281. {
  282.     return m_ByX.size();
  283. }
  284. inline
  285. void CIntervalTree::DeleteNode(TTreeNode* node)
  286. {
  287.     if ( node ) {
  288.         ClearNode(node);
  289.         DeallocNode(node);
  290.     }
  291. }
  292. inline
  293. void CIntervalTree::Clear(void)
  294. {
  295.     Destroy();
  296.     Init();
  297. }
  298. inline
  299. CIntervalTree::TTreeNode* CIntervalTree::InitNode(TTreeNode* node,
  300.                                                   coordinate_type key) const
  301. {
  302.     node->m_Key = key;
  303.     node->m_Left = node->m_Right = 0;
  304.     node->m_NodeIntervals = 0;
  305.     return node;
  306. }
  307. inline
  308. CIntervalTree::CIntervalTree(void)
  309. {
  310.     InitNode(&m_Root, 2); // should be some power of 2
  311.     Init();
  312. }
  313. inline
  314. CIntervalTree::~CIntervalTree(void)
  315. {
  316.     Destroy();
  317. }
  318. inline
  319. void CIntervalTree::Assign(const_iterator& dst, const iterator& src)
  320. {
  321.     dst.m_SearchX = src.m_SearchX;
  322.     dst.m_SearchLimit = src.m_SearchLimit;
  323.     dst.m_CurrentMapValue = src.m_CurrentMapValue;
  324.     dst.m_NextNode = src.m_NextNode;
  325. }
  326. inline
  327. void CIntervalTree::Assign(iterator& dst, const iterator& src)
  328. {
  329.     dst.m_SearchX = src.m_SearchX;
  330.     dst.m_SearchLimit = src.m_SearchLimit;
  331.     dst.m_CurrentMapValue = src.m_CurrentMapValue;
  332.     dst.m_NextNode = src.m_NextNode;
  333. }
  334. /*
  335. * ---------------------------------------------------------------------------
  336. * $Log: itree.inl,v $
  337. * Revision 1000.0  2003/10/29 15:29:49  gouriano
  338. * PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R1.6
  339. *
  340. * Revision 1.6  2003/02/07 17:37:40  vasilche
  341. * Removed parameters' default values from method definition.
  342. *
  343. * Revision 1.5  2003/02/07 16:54:01  vasilche
  344. * Pass all structures with size > sizeof int by reference.
  345. * Move cvs log to the end of files.
  346. *
  347. * Revision 1.4  2002/04/29 17:33:59  ucko
  348. * Add explicit "typename" in three places.
  349. *
  350. * Revision 1.3  2001/05/17 15:01:19  lavr
  351. * Typos corrected
  352. *
  353. * Revision 1.2  2001/01/29 15:18:39  vasilche
  354. * Cleaned CRangeMap and CIntervalTree classes.
  355. *
  356. * Revision 1.1  2001/01/11 15:00:38  vasilche
  357. * Added CIntervalTree for seraching on set of intervals.
  358. *
  359. * ===========================================================================
  360. */
  361. #endif /* def ITREE__HPP  &&  ndef ITREE__INL */