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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: rangemap.hpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 19:38:35  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.24
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef RANGEMAP__HPP
  10. #define RANGEMAP__HPP
  11. /*  $Id: rangemap.hpp,v 1000.2 2004/06/01 19:38:35 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. *   Generic map with range as key
  40. *
  41. * ===========================================================================
  42. */
  43. #include <corelib/ncbistd.hpp>
  44. #include <corelib/ncbi_limits.h>
  45. #include <util/range.hpp>
  46. #include <util/util_exception.hpp>
  47. #include <map>
  48. /** @addtogroup RangeSupport
  49.  *
  50.  * @{
  51.  */
  52. BEGIN_NCBI_SCOPE
  53. // range map forward declaration
  54. template<class Traits> class CRangeMapBase;
  55. template<class Traits> class CRangeMapIterator;
  56. template<typename Mapped, typename Position> class CRangeMap;
  57. template<typename Mapped, typename Position> class CRangeMultimap;
  58. // range map traits
  59. template<typename Position, typename Mapped>
  60. class CRangeMapTraitsBase
  61. {
  62. public:
  63.     typedef Position position_type;
  64.     typedef CRange<position_type> range_type;
  65.     typedef Mapped mapped_type;
  66.     typedef pair<const range_type, mapped_type> value_type;
  67.     
  68.     // The idea is to split a set of intervals into groups of similar
  69.     // lengths.  Then, when searching, we can use our knowledge about
  70.     // minimum and maximum possible lengths of intervals in the group for
  71.     // later optimizations.
  72.     // There is little gain with splitting small groups, so the small
  73.     // intervals are all grouped into the group with maximum length 63
  74.     // (which is also a bit-mask of 6 bits set, which is equal to 2^6 - 1).
  75.     // The other groups have maximum length of 2^n - 1, where n > 6.  The
  76.     // minimum length in the group is one greater than the maximum in the
  77.     // group below, so we get
  78.     //    length range              maximum value in group
  79.     //    1-63                      63
  80.     //    64-127                    127
  81.     //    ...                       ...
  82.     //    2^n...(2^(n+1)-1)         (2^(n+1)-1)  [n > 6]
  83.     //    ...                       ...
  84.     static position_type get_max_length(const range_type& key)
  85.         {
  86.             position_type len = position_type(key.GetLength() | 32);
  87.             len |= (len >> 1);
  88.             len |= (len >> 2);
  89.             len |= (len >> 4);
  90.             if ( sizeof(position_type) * CHAR_BIT > 8 ) {
  91.                 len |= (len >> 8);
  92.                 if ( sizeof(position_type) * CHAR_BIT > 16 ) {
  93.                     len |= (len >> 16);
  94. #if 0
  95.                     if ( sizeof(position_type) * CHAR_BIT > 32 ) {
  96.                         len |= (len >> 32);
  97.                     }
  98. #endif
  99.                 }
  100.             }
  101.             return len;
  102.         }
  103. };
  104. template<typename Position, typename Mapped>
  105. class CRangeMapTraits : public CRangeMapTraitsBase<Position, Mapped>
  106. {
  107.     typedef CRangeMapTraitsBase<Position, Mapped> TParent;
  108. public:
  109.     typedef CRangeMap<Mapped, Position> TRangeMap;
  110.     typedef map<typename TParent::range_type, Mapped> TLevelMap;
  111.     typedef map<Position, TLevelMap> TSelectMap;
  112. };
  113. template<typename Position, typename Mapped>
  114. class CRangeMultimapTraits : public CRangeMapTraitsBase<Position, Mapped>
  115. {
  116.     typedef CRangeMapTraitsBase<Position, Mapped> TParent;
  117. public:
  118.     typedef CRangeMultimap<Mapped, Position> TRangeMap;
  119.     typedef multimap<typename TParent::range_type, Mapped> TLevelMap;
  120.     typedef map<Position, TLevelMap> TSelectMap;
  121. };
  122. // range map iterators traits
  123. template<typename MapTraits>
  124. class CRangeMapIteratorTraits : public MapTraits
  125. {
  126. public:
  127.     typedef MapTraits TMapTraits;
  128.     typedef CRangeMapIteratorTraits<TMapTraits> TIteratorTraits;
  129.     typedef CRangeMapIteratorTraits<TMapTraits> TNCIteratorTraits;
  130.     typedef typename TMapTraits::TRangeMap& TRangeMapRef;
  131.     typedef typename TMapTraits::TSelectMap& TSelectMapRef;
  132.     typedef typename TMapTraits::TLevelMap& TLevelMapRef;
  133.     typedef typename TMapTraits::TSelectMap::iterator TSelectIter;
  134.     typedef typename TMapTraits::TLevelMap::iterator TLevelIter;
  135.     typedef typename TMapTraits::value_type& reference;
  136.     typedef typename TMapTraits::value_type* pointer;
  137.     typedef CRangeMapIterator<TIteratorTraits> iterator;
  138.     typedef CRangeMapIterator<TNCIteratorTraits> non_const_iterator;
  139. };
  140. template<typename MapTraits>
  141. class CRangeMapConstIteratorTraits : public MapTraits
  142. {
  143. public:
  144.     typedef MapTraits TMapTraits;
  145.     typedef CRangeMapConstIteratorTraits<TMapTraits> TIteratorTraits;
  146.     typedef CRangeMapIteratorTraits<TMapTraits> TNCIteratorTraits;
  147.     typedef const typename TMapTraits::TRangeMap& TRangeMapRef;
  148.     typedef const typename TMapTraits::TSelectMap& TSelectMapRef;
  149.     typedef const typename TMapTraits::TLevelMap& TLevelMapRef;
  150.     typedef typename TMapTraits::TSelectMap::const_iterator TSelectIter;
  151.     typedef typename TMapTraits::TLevelMap::const_iterator TLevelIter;
  152.     typedef const typename TMapTraits::value_type& reference;
  153.     typedef const typename TMapTraits::value_type* pointer;
  154.     typedef CRangeMapIterator<TIteratorTraits> iterator;
  155.     typedef CRangeMapIterator<TNCIteratorTraits> non_const_iterator;
  156. };
  157. // range map iterator base
  158. template<class Traits>
  159. class CRangeMapIterator
  160. {
  161. public:
  162.     // typedefs
  163.     typedef Traits TTraits;
  164.     typedef typename TTraits::position_type position_type;
  165.     typedef typename TTraits::range_type range_type;
  166.     typedef typename TTraits::mapped_type mapped_type;
  167.     typedef typename TTraits::value_type value_type;
  168.     typedef typename TTraits::reference reference;
  169.     typedef typename TTraits::pointer pointer;
  170.     typedef typename TTraits::TRangeMap TRangeMap;
  171.     typedef typename TTraits::TSelectMapRef TSelectMapRef;
  172.     typedef typename TTraits::TSelectIter TSelectIter;
  173.     typedef typename TTraits::TLevelIter TLevelIter;
  174.     // internal typedefs
  175.     typedef typename TTraits::iterator TThisType;
  176.     // friends
  177.     friend class CRangeMapBase<typename TTraits::TMapTraits>;
  178.     friend class CRangeMap<mapped_type, position_type>;
  179.     friend class CRangeMultimap<mapped_type, position_type>;
  180.     // constructors
  181.     // singular
  182.     CRangeMapIterator(void)
  183.         {
  184.             m_SelectIter = m_SelectIterEnd;
  185.         }
  186.     // copy from non const iterator
  187.     CRangeMapIterator(const typename TTraits::non_const_iterator& iter)
  188.         : m_Range(iter.GetRange()),
  189.           m_SelectIter(iter.GetSelectIter()),
  190.           m_SelectIterEnd(iter.GetSelectIterEnd()),
  191.           m_LevelIter(iter.GetLevelIter())
  192.         {
  193.         }
  194.     // get range to search
  195.     const range_type& GetRange(void) const
  196.         {
  197.             return m_Range;
  198.         }
  199.     // get state (for copying)
  200.     TSelectIter GetSelectIter(void) const
  201.         {
  202.             return m_SelectIter;
  203.         }
  204.     TSelectIter GetSelectIterEnd(void) const
  205.         {
  206.             return m_SelectIterEnd;
  207.         }
  208.     TLevelIter GetLevelIter(void) const
  209.         {
  210.             return m_LevelIter;
  211.         }
  212.     TLevelIter GetLevelIterEnd(void) const
  213.         {
  214.             return GetSelectIter()->second.end();
  215.         }
  216.     // check state
  217.     bool Valid(void) const
  218.         {
  219.             return m_SelectIter != m_SelectIterEnd;
  220.         }
  221.     operator bool(void) const
  222.         {
  223.             return Valid();
  224.         }
  225.     bool operator!(void) const
  226.         {
  227.             return !Valid();
  228.         }
  229.     bool operator==(const TThisType& iter) const
  230.         {
  231.             _ASSERT(GetSelectIterEnd() == iter.GetSelectIterEnd());
  232.             return GetSelectIter() == iter.GetSelectIter() &&
  233.                 (!*this || GetLevelIter() == iter.GetLevelIter());
  234.         }
  235.     bool operator!=(const TThisType& iter) const
  236.         {
  237.             return !(*this == iter);
  238.         }
  239.     // dereference
  240.     range_type GetInterval(void) const
  241.         {
  242.             return GetLevelIter()->first;
  243.         }
  244.     reference operator*(void) const
  245.         {
  246.             return *GetLevelIter();
  247.         }
  248.     pointer operator->(void) const
  249.         {
  250.             return &*GetLevelIter();
  251.         }
  252. private:
  253.     // Move level iterator to the first entry following or equal to
  254.     // the levelIter and intersecting with the range to search
  255.     bool SetLevelIter(TLevelIter levelIter)
  256.         {
  257.             TLevelIter levelIterEnd = GetLevelIterEnd();
  258.             while ( levelIter != levelIterEnd ) {
  259.                 // find an entry intersecting with the range
  260.                 if ( levelIter->first.GetToOpen() > m_Range.GetFrom() ) {
  261.                     if ( levelIter->first.GetFrom() < m_Range.GetToOpen() ) {
  262.                         m_LevelIter = levelIter; // set the iterator
  263.                         return true; // found
  264.                     }
  265.                     return false; // no such entry
  266.                 }
  267.                 ++levelIter; // check next entry
  268.             }
  269.             return false; // entry not found
  270.         }
  271.     // Find the first level entry, which can (but not always does)
  272.     // intersect with the range to search.
  273.     TLevelIter FirstLevelIter(void)
  274.         {
  275.             position_type from = m_Range.GetFrom();
  276.             position_type shift = m_SelectIter->first - 1;
  277.             if ( from <= range_type::GetWholeFrom() + shift ) {
  278.                 // special case: from overflow: start from beginning
  279.                 return m_SelectIter->second.begin();
  280.             }
  281.             else {
  282.                 // get maximum length of ranges in the level
  283.                 return m_SelectIter->second.lower_bound(range_type(from - shift, from));
  284.             }
  285.         }
  286.     // Go to the last element, reset range to empty
  287.     void SetEnd(TSelectMapRef selectMap)
  288.         {
  289.             m_Range = range_type::GetEmpty();
  290.             m_SelectIter = m_SelectIterEnd = selectMap.end();
  291.         }
  292.     // Go to the very first element, reset range to whole
  293.     void SetBegin(TSelectMapRef selectMap)
  294.         {
  295.             m_Range = range_type::GetWhole();
  296.             TSelectIter selectIter = m_SelectIter = selectMap.begin();
  297.             TSelectIter selectIterEnd = m_SelectIterEnd = selectMap.end();
  298.             if ( selectIter != selectIterEnd ) {
  299.                 m_LevelIter = selectIter->second.begin();
  300.             }
  301.         }
  302.     // Set range, find the first element possibly intersecting the range
  303.     void SetBegin(const range_type& range, TSelectMapRef selectMap)
  304.         {
  305.             m_Range = range;
  306.             TSelectIter selectIter = m_SelectIter = selectMap.begin();
  307.             TSelectIter selectIterEnd = m_SelectIterEnd = selectMap.end();
  308.             // Go through all select map elements, search for a "good"
  309.             // level entry
  310.             while ( selectIter != selectIterEnd &&
  311.                     !SetLevelIter(FirstLevelIter()) ) {
  312.                 m_SelectIter = ++selectIter;
  313.             }
  314.         }
  315.     // Find an entry specified by the key in the 2-level map
  316.     void Find(const range_type& key, TSelectMapRef selectMap);
  317. public:
  318.     // move
  319.     TThisType& operator++(void)
  320.         {
  321.             TLevelIter levelIter = m_LevelIter;
  322.             TSelectIter selectIterEnd = m_SelectIterEnd;
  323.             ++levelIter;
  324.             while ( !SetLevelIter(levelIter) &&
  325.                     ++m_SelectIter != selectIterEnd ) {
  326.                 levelIter = FirstLevelIter();
  327.             }
  328.             return *this;
  329.         }
  330. private:
  331.     // iterator data
  332.     range_type m_Range;          // range to search
  333.     TSelectIter m_SelectIter;    // first level iter
  334.     TSelectIter m_SelectIterEnd; // first level iter limit
  335.     TLevelIter m_LevelIter;      // second level iter
  336. };
  337. template<class Traits>
  338. void CRangeMapIterator<Traits>::Find(const range_type& key, TSelectMapRef selectMap)
  339. {
  340.     TSelectIter selectIterEnd = selectMap.end();
  341.     if ( !key.Empty() ) {
  342.         TSelectIter selectIter = selectMap.find(TTraits::get_max_length(key));
  343.         // now selectIter->first >= key.length
  344.         if ( selectIter != selectIterEnd ) {
  345.             TLevelIter levelIter = selectIter->second.find(key);
  346.             if ( levelIter != selectIter->second.end() ) {
  347.                 // found the key
  348.                 m_Range = range_type::GetWhole();
  349.                 m_SelectIter = selectIter;
  350.                 m_SelectIterEnd = selectIterEnd;
  351.                 m_LevelIter = levelIter;
  352.                 return;
  353.             }
  354.         }
  355.     }
  356.     // not found
  357.     m_Range = range_type::GetEmpty();
  358.     m_SelectIter = m_SelectIterEnd = selectIterEnd;
  359. }
  360. // range map
  361. template<class Traits>
  362. class CRangeMapBase
  363. {
  364. public:
  365.     // standard typedefs
  366.     typedef Traits TRangeMapTraits;
  367.     typedef CRangeMapIteratorTraits<TRangeMapTraits> TIteratorTraits;
  368.     typedef CRangeMapConstIteratorTraits<TRangeMapTraits> TConstIteratorTraits;
  369.     typedef size_t size_type;
  370.     typedef typename TRangeMapTraits::position_type position_type;
  371.     typedef typename TRangeMapTraits::range_type range_type;
  372.     typedef typename TRangeMapTraits::mapped_type mapped_type;
  373.     typedef typename TRangeMapTraits::value_type value_type;
  374.     typedef range_type key_type;
  375.     typedef typename TRangeMapTraits::TRangeMap TThisType;
  376.     typedef typename TIteratorTraits::iterator iterator;
  377.     typedef typename TConstIteratorTraits::iterator const_iterator;
  378. protected:
  379.     // internal typedefs
  380.     typedef typename TRangeMapTraits::TSelectMap TSelectMap;
  381.     typedef typename TSelectMap::value_type select_value;
  382.     typedef typename TSelectMap::iterator TSelectMapI;
  383.     typedef typename TRangeMapTraits::TLevelMap TLevelMap;
  384.     typedef typename TLevelMap::iterator TLevelMapI;
  385.     // constructor
  386.     CRangeMapBase(void)
  387.         {
  388. #if defined(_RWSTD_VER) && !defined(_RWSTD_STRICT_ANSI)
  389.             m_SelectMap.allocation_size(8);
  390. #endif
  391.         }
  392.     TSelectMapI insertLevel(position_type key)
  393.         {
  394.             TSelectMapI iter = m_SelectMap.lower_bound(key);
  395.             if ( iter == m_SelectMap.end() || iter->first != key ) {
  396.                 iter = m_SelectMap.insert(iter,
  397.                                           select_value(key, TLevelMap()));
  398.             }
  399.             return iter;
  400.         }
  401. public:
  402.     // capacity
  403.     bool empty(void) const
  404.         {
  405.             return m_SelectMap.empty();
  406.         }
  407.     size_type size(void) const
  408.         {
  409.             typedef typename TSelectMap::const_iterator TSelectMapCI;
  410.             size_type size = 0;
  411.             for ( TSelectMapCI i = m_SelectMap.begin(),
  412.                       end = m_SelectMap.end(); i != end; ++i ) {
  413.                 size += i->second.size();
  414.             }
  415.             return size;
  416.         }
  417.     pair<double, size_type> stat(void) const
  418.         {
  419.             return make_pair(0.0, size_type(0));
  420.         }
  421.     
  422.     // iterators
  423.     const_iterator end(void) const
  424.         {
  425.             const_iterator iter;
  426.             iter.SetEnd(m_SelectMap);
  427.             return iter;
  428.         }
  429.     const_iterator begin(void) const
  430.         {
  431.             const_iterator iter;
  432.             iter.SetBegin(m_SelectMap);
  433.             return iter;
  434.         }
  435.     const_iterator begin(const range_type& range) const
  436.         {
  437.             const_iterator iter;
  438.             iter.SetBegin(range, m_SelectMap);
  439.             return iter;
  440.         }
  441.     iterator end(void)
  442.         {
  443.             iterator iter;
  444.             iter.SetEnd(m_SelectMap);
  445.             return iter;
  446.         }
  447.     iterator begin(void)
  448.         {
  449.             iterator iter;
  450.             iter.SetBegin(m_SelectMap);
  451.             return iter;
  452.         }
  453.     iterator begin(const range_type& range)
  454.         {
  455.             iterator iter;
  456.             iter.SetBegin(range, m_SelectMap);
  457.             return iter;
  458.         }
  459.     // element search
  460.     const_iterator find(const key_type& key) const
  461.         {
  462.             const_iterator iter;
  463.             iter.Find(key, m_SelectMap);
  464.             return iter;
  465.         }
  466.     iterator find(const key_type& key)
  467.         {
  468.             iterator iter;
  469.             iter.Find(key, m_SelectMap);
  470.             return iter;
  471.         }
  472.     // modification
  473.     void erase(iterator iter)
  474.         {
  475.             _ASSERT(iter != end());
  476.             // get element's level
  477.             TLevelMap& level = iter.GetSelectIter()->second;
  478.             // erase element on level
  479.             level.erase(iter.GetLevelIter());
  480.             if ( level.empty() ) // end of level
  481.                 m_SelectMap.erase(iter.GetSelectIter()); // remove level
  482.         }
  483.     size_type erase(const key_type& key)
  484.         {
  485.             size_type count = 0;
  486.             iterator iter = find(key);
  487.             while ( iter && iter.GetInterval() == key ) {
  488.                 iterator toErase = iter;
  489.                 ++iter;
  490.                 ++count;
  491.                 erase(toErase);
  492.             }
  493.             return count;
  494.         }
  495.     void clear(void)
  496.         {
  497.             m_SelectMap.clear();
  498.         }
  499.     void swap(TThisType& rangeMap)
  500.         {
  501.             m_SelectMap.swap(rangeMap.m_SelectMap);
  502.         }
  503. protected:
  504.     // data
  505.     TSelectMap m_SelectMap;
  506. };
  507. // range map
  508. template<typename Mapped, typename Position = int>
  509. class CRangeMap : public CRangeMapBase< CRangeMapTraits<Position, Mapped> >
  510. {
  511.     typedef CRangeMapBase< CRangeMapTraits<Position, Mapped> > TParent;
  512. public:
  513.     // standard typedefs
  514.     typedef typename TParent::size_type size_type;
  515.     typedef typename TParent::position_type position_type;
  516.     typedef typename TParent::range_type range_type;
  517.     typedef typename TParent::mapped_type mapped_type;
  518.     typedef typename TParent::value_type value_type;
  519.     typedef typename TParent::key_type key_type;
  520.     typedef typename TParent::iterator iterator;
  521.     typedef typename TParent::const_iterator const_iterator;
  522.     typedef typename TParent::TRangeMapTraits TRangeMapTraits;
  523.     typedef typename TParent::TSelectMap TSelectMap;
  524.     typedef typename TParent::select_value select_value;
  525.     typedef typename TParent::TSelectMapI TSelectMapI;
  526.     typedef typename TParent::TLevelMap TLevelMap;
  527.     typedef typename TParent::TLevelMapI TLevelMapI;
  528.     // constructor
  529.     explicit CRangeMap(void)
  530.         {
  531.         }
  532.     pair<iterator, bool> insert(const value_type& value)
  533.         {
  534.             if ( value.first.Empty() ) {
  535. //                THROW1_TRACE(runtime_error, "empty key range");
  536.                 NCBI_THROW(CUtilException,eWrongData,"empty key range");
  537.             }
  538.             // key in select map
  539.             position_type selectKey =
  540.                 TRangeMapTraits::get_max_length(value.first);
  541.             // get level
  542.             // insert element
  543.             TSelectMapI selectIter = insertLevel(selectKey);
  544.             pair<TLevelMapI, bool> levelIns = selectIter->second.insert(value);
  545.             
  546.             pair<iterator, bool> ret;
  547.             ret.second = levelIns.second;
  548.             ret.first.m_Range = range_type::GetWhole();
  549.             ret.first.m_SelectIter = selectIter;
  550.             ret.first.m_SelectIterEnd = this->m_SelectMap.end();
  551.             ret.first.m_LevelIter = levelIns.first;
  552.             return ret;
  553.         }
  554.     // element access
  555.     mapped_type& operator[](const key_type& key)
  556.         {
  557.             return insert(value_type(key, mapped_type())).first->second;
  558.         }
  559. };
  560. // range map
  561. template<typename Mapped, typename Position = int>
  562. class CRangeMultimap : public CRangeMapBase< CRangeMultimapTraits<Position, Mapped> >
  563. {
  564.     typedef CRangeMapBase< CRangeMultimapTraits<Position, Mapped> > TParent;
  565. public:
  566.     // standard typedefs
  567.     typedef typename TParent::size_type size_type;
  568.     typedef typename TParent::position_type position_type;
  569.     typedef typename TParent::range_type range_type;
  570.     typedef typename TParent::mapped_type mapped_type;
  571.     typedef typename TParent::value_type value_type;
  572.     typedef typename TParent::key_type key_type;
  573.     typedef typename TParent::iterator iterator;
  574.     typedef typename TParent::const_iterator const_iterator;
  575.     typedef typename TParent::TRangeMapTraits TRangeMapTraits;
  576.     typedef typename TParent::TSelectMap TSelectMap;
  577.     typedef typename TParent::select_value select_value;
  578.     typedef typename TParent::TSelectMapI TSelectMapI;
  579.     typedef typename TParent::TLevelMap TLevelMap;
  580.     typedef typename TParent::TLevelMapI TLevelMapI;
  581.     // constructor
  582.     explicit CRangeMultimap(void)
  583.         {
  584.         }
  585.     iterator insert(const value_type& value)
  586.         {
  587.             if ( value.first.Empty() ) {
  588. //                THROW1_TRACE(runtime_error, "empty key range");
  589.                 NCBI_THROW(CUtilException,eWrongData,"empty key range");
  590.             }
  591.             // select key
  592.             position_type selectKey =
  593.                 TRangeMapTraits::get_max_length(value.first);
  594.             // insert element
  595.             iterator ret;
  596.             ret.m_Range = range_type::GetWhole();
  597.             ret.m_SelectIter = insertLevel(selectKey);
  598.             ret.m_SelectIterEnd = this->m_SelectMap.end();
  599.             ret.m_LevelIter = ret.m_SelectIter->second.insert(value);
  600.             return ret;
  601.         }
  602. };
  603. /* @} */
  604. //#include <util/rangemap.inl>
  605. END_NCBI_SCOPE
  606. /*
  607. * ---------------------------------------------------------------------------
  608. * $Log: rangemap.hpp,v $
  609. * Revision 1000.2  2004/06/01 19:38:35  gouriano
  610. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.24
  611. *
  612. * Revision 1.24  2004/04/26 14:52:03  ucko
  613. * Add "this->" as needed to accommodate GCC 3.4's stricter treatment of
  614. * templates.
  615. *
  616. * Revision 1.23  2004/01/13 17:23:14  vasilche
  617. * Performance fix - do not create level node until it's really needed.
  618. *
  619. * Revision 1.22  2003/04/22 17:21:02  ucko
  620. * Clarified comment for get_max_length (taken from an exchange between
  621. * Eugene and Karl).
  622. *
  623. * Revision 1.21  2003/04/17 17:50:26  siyan
  624. * Added doxygen support
  625. *
  626. * Revision 1.20  2003/02/26 21:34:06  gouriano
  627. * modify C++ exceptions thrown by this library
  628. *
  629. * Revision 1.19  2003/02/07 16:54:01  vasilche
  630. * Pass all structures with size > sizeof int by reference.
  631. * Move cvs log to the end of files.
  632. *
  633. * Revision 1.18  2003/01/22 20:05:25  vasilche
  634. * Simplified CRange<> implementation.
  635. * Removed special handling of Empty & Whole bounds.
  636. * Added simplier COpenRange<> template.
  637. *
  638. * Revision 1.17  2002/05/06 20:38:56  grichenk
  639. * Fixed unsigned values handling
  640. *
  641. * Revision 1.16  2002/02/13 22:39:15  ucko
  642. * Support AIX.
  643. *
  644. * Revision 1.15  2001/09/18 16:22:21  grichenk
  645. * Fixed problem with the default constructor for CRangeMapIterator
  646. * (Valid() returned unpredictable value)
  647. *
  648. * Revision 1.14  2001/09/17 18:26:32  grichenk
  649. * Fixed processing of "Whole" ranges in the range map iterator.
  650. *
  651. * Revision 1.13  2001/06/28 12:44:56  grichenk
  652. * Added some comments
  653. *
  654. * Revision 1.12  2001/01/29 15:18:39  vasilche
  655. * Cleaned CRangeMap and CIntervalTree classes.
  656. *
  657. * Revision 1.11  2001/01/16 21:37:22  vasilche
  658. * Fixed warning.
  659. *
  660. * Revision 1.10  2001/01/16 20:52:24  vasilche
  661. * Simplified some CRangeMap code.
  662. *
  663. * Revision 1.9  2001/01/11 15:00:39  vasilche
  664. * Added CIntervalTree for seraching on set of intervals.
  665. *
  666. * Revision 1.8  2001/01/05 20:08:53  vasilche
  667. * Added util directory for various algorithms and utility classes.
  668. *
  669. * Revision 1.7  2001/01/05 16:29:02  vasilche
  670. * Fixed incompatibility with MIPS C++ compiler.
  671. *
  672. * Revision 1.6  2001/01/05 13:59:04  vasilche
  673. * Reduced CRangeMap* templates size.
  674. * Added CRangeMultimap template.
  675. *
  676. * Revision 1.5  2001/01/03 21:29:41  vasilche
  677. * Fixed wrong typedef.
  678. *
  679. * Revision 1.4  2001/01/03 18:58:39  vasilche
  680. * Some typedefs are missing on MSVC.
  681. *
  682. * Revision 1.3  2001/01/03 16:39:18  vasilche
  683. * Added CAbstractObjectManager - stub for object manager.
  684. * CRange extracted to separate file.
  685. *
  686. * Revision 1.2  2000/12/26 17:27:42  vasilche
  687. * Implemented CRangeMap<> template for sorting Seq-loc objects.
  688. *
  689. * Revision 1.1  2000/12/21 21:52:41  vasilche
  690. * Added CRangeMap<> template for sorting integral ranges (Seq-loc).
  691. *
  692. * ===========================================================================
  693. */
  694. #endif  /* RANGEMAP__HPP */