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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: range.hpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 19:38:28  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.17
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef RANGE__HPP
  10. #define RANGE__HPP
  11. /*  $Id: range.hpp,v 1000.2 2004/06/01 19:38:28 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. *   CRange<> class represents interval
  40. *
  41. * ===========================================================================
  42. */
  43. #include <corelib/ncbistd.hpp>
  44. #include <corelib/ncbi_limits.hpp>
  45. /** @addtogroup RangeSupport
  46.  *
  47.  * @{
  48.  */
  49. BEGIN_NCBI_SCOPE
  50. // range
  51. template<class Position>
  52. class COpenRange
  53. {
  54. public:
  55.     typedef Position position_type;
  56.     typedef COpenRange<Position> TThisType;
  57.     // constructors
  58.     COpenRange(void)
  59.         : m_From(GetEmptyFrom()), m_ToOpen(GetEmptyToOpen())
  60.         {
  61.         }
  62.     COpenRange(position_type from, position_type toOpen)
  63.         : m_From(from), m_ToOpen(toOpen)
  64.         {
  65.         }
  66.     
  67.     // parameters
  68.     position_type GetFrom(void) const
  69.         {
  70.             return m_From;
  71.         }
  72.     position_type GetToOpen(void) const
  73.         {
  74.             return m_ToOpen;
  75.         }
  76.     position_type GetTo(void) const
  77.         {
  78.             return GetToOpen()-1;
  79.         }
  80.     // state
  81.     bool Empty(void) const
  82.         {
  83.             return GetToOpen() <= GetFrom();
  84.         }
  85.     bool NotEmpty(void) const
  86.         {
  87.             return GetToOpen() > GetFrom();
  88.         }
  89.     // return length of regular region
  90.     position_type GetLength(void) const
  91.         {
  92.             position_type from = GetFrom(), toOpen = GetToOpen();
  93.             if ( toOpen <= from )
  94.                 return 0;
  95.             position_type len = toOpen - from;
  96.             if ( len < 0 )
  97.                 len = GetWholeLength();
  98.             return len;
  99.         }
  100.     // modifiers
  101.     TThisType& SetFrom(position_type from)
  102.         {
  103.             m_From = from;
  104.             return *this;
  105.         }
  106.     TThisType& SetToOpen(position_type toOpen)
  107.         {
  108.             m_ToOpen = toOpen;
  109.             return *this;
  110.         }
  111.     TThisType& SetTo(position_type to)
  112.         {
  113.             return SetToOpen(to+1);
  114.         }
  115.     TThisType& SetOpen(position_type from, position_type toOpen)
  116.         {
  117.             return SetFrom(from).SetToOpen(toOpen);
  118.         }
  119.     TThisType& Set(position_type from, position_type to)
  120.         {
  121.             return SetFrom(from).SetTo(to);
  122.         }
  123.     // length must be >= 0
  124.     TThisType& SetLength(position_type length)
  125.         {
  126.             _ASSERT(length >= 0);
  127.             position_type from = GetFrom();
  128.             position_type toOpen = from + length;
  129.             if ( toOpen < from )
  130.                 toOpen = GetWholeToOpen();
  131.             return SetToOpen(toOpen);
  132.         }
  133.     // length must be >= 0
  134.     TThisType& SetLengthDown(position_type length)
  135.         {
  136.             _ASSERT(length >= 0);
  137.             position_type toOpen = GetToOpen();
  138.             position_type from = toOpen - length;
  139.             if ( from > toOpen )
  140.                 from = GetWholeFrom();
  141.             return SetFrom(from);
  142.         }
  143.     // comparison
  144.     bool operator==(const TThisType& r) const
  145.         {
  146.             return GetFrom() == r.GetFrom() && GetToOpen() == r.GetToOpen();
  147.         }
  148.     bool operator!=(const TThisType& r) const
  149.         {
  150.             return !(*this == r);
  151.         }
  152.     bool operator<(const TThisType& r) const
  153.         {
  154.             return GetFrom() < r.GetFrom() ||
  155.                 GetFrom() == r.GetFrom() && GetToOpen() < r.GetToOpen();
  156.         }
  157.     bool operator<=(const TThisType& r) const
  158.         {
  159.             return GetFrom() < r.GetFrom() ||
  160.                 GetFrom() == r.GetFrom() && GetToOpen() <= r.GetToOpen();
  161.         }
  162.     bool operator>(const TThisType& r) const
  163.         {
  164.             return GetFrom() > r.GetFrom() ||
  165.                 GetFrom() == r.GetFrom() && GetToOpen() > r.GetToOpen();
  166.         }
  167.     bool operator>=(const TThisType& r) const
  168.         {
  169.             return GetFrom() > r.GetFrom() ||
  170.                 GetFrom() == r.GetFrom() && GetToOpen() >= r.GetToOpen();
  171.         }
  172.     // special values
  173.     static position_type GetPositionMin(void)
  174.         {
  175.             return numeric_limits<position_type>::min();
  176.         }
  177.     static position_type GetPositionMax(void)
  178.         {
  179.             return numeric_limits<position_type>::max();
  180.         }
  181.     // whole range
  182.     static position_type GetWholeFrom(void)
  183.         {
  184.             return GetPositionMin();
  185.         }
  186.     static position_type GetWholeToOpen(void)
  187.         {
  188.             return GetPositionMax();
  189.         }
  190.     static position_type GetWholeTo(void)
  191.         {
  192.             return GetWholeToOpen()-1;
  193.         }
  194.     static position_type GetWholeLength(void)
  195.         {
  196.             return GetPositionMax();
  197.         }
  198.     static TThisType GetWhole(void)
  199.         {
  200.             return TThisType(GetWholeFrom(), GetWholeToOpen());
  201.         }
  202.     bool IsWholeFrom(void) const
  203.         {
  204.             return GetFrom() == GetWholeFrom();
  205.         }
  206.     bool IsWholeTo(void) const
  207.         {
  208.             return GetToOpen() == GetWholeToOpen();
  209.         }
  210.     bool IsWhole(void) const
  211.         {
  212.             return IsWholeFrom() && IsWholeTo();
  213.         }
  214.     // empty range
  215.     static position_type GetEmptyFrom(void)
  216.         {
  217.             return GetPositionMax();
  218.         }
  219.     static position_type GetEmptyToOpen(void)
  220.         {
  221.             return GetPositionMax();
  222.         }
  223.     static position_type GetEmptyTo(void)
  224.         {
  225.             return GetEmptyToOpen()-1;
  226.         }
  227.     static position_type GetEmptyLength(void)
  228.         {
  229.             return 0;
  230.         }
  231.     static TThisType GetEmpty(void)
  232.         {
  233.             return TThisType(GetEmptyFrom(), GetEmptyToOpen());
  234.         }
  235.     // intersecting ranges
  236.     TThisType IntersectionWith(const TThisType& r) const
  237.         {
  238.             return TThisType(max(GetFrom(), r.GetFrom()),
  239.                              min(GetToOpen(), r.GetToOpen()));
  240.         }
  241.     TThisType& IntersectWith(const TThisType& r)
  242.         {
  243.             m_From = max(GetFrom(), r.GetFrom());
  244.             m_ToOpen = min(GetToOpen(), r.GetToOpen());
  245.             return *this;
  246.         }
  247.     TThisType operator&(const TThisType& r) const
  248.         {
  249.             return IntersectionWith(r);
  250.         }
  251.     TThisType& operator&=(const TThisType& r)
  252.         {
  253.             return IntersectWith(r);
  254.         }
  255.     bool IntersectingWith(const TThisType& r) const
  256.         {
  257.             return IntersectionWith(r).NotEmpty();
  258.         }
  259.     // combine ranges
  260.     TThisType& CombineWith(const TThisType& r)
  261.         {
  262.             if ( !r.Empty() ) {
  263.                 if ( !Empty() ) {
  264.                     m_From = min(m_From, r.GetFrom());
  265.                     m_ToOpen = max(m_ToOpen, r.GetToOpen());
  266.                 }
  267.                 else {
  268.                     *this = r;
  269.                 }
  270.             }
  271.             return *this;
  272.         }
  273.     TThisType CombinationWith(const TThisType& r) const
  274.         {
  275.             if ( !r.Empty() ) {
  276.                 if ( !Empty() ) {
  277.                     return TThisType(min(m_From, r.GetFrom()),
  278.                                      max(m_ToOpen, r.GetToOpen()));
  279.                 }
  280.                 else {
  281.                     return r;
  282.                 }
  283.             }
  284.             return *this;
  285.         }
  286.     TThisType& operator+=(const TThisType& r)
  287.         {
  288.             return CombineWith(r);
  289.         }
  290.     TThisType operator+(const TThisType& r) const
  291.         {
  292.             return CombinationWith(r);
  293.         }
  294. private:
  295.     position_type m_From, m_ToOpen;
  296. };
  297. // range
  298. template<class Position>
  299. class CRange : public COpenRange<Position>
  300. {
  301. public:
  302.     typedef COpenRange<Position> TParent;
  303.     typedef typename TParent::position_type position_type;
  304.     typedef CRange<Position> TThisType;
  305.     // constructors
  306.     CRange(void)
  307.         {
  308.         }
  309.     CRange(position_type from, position_type to)
  310.         : TParent(from, to+1)
  311.         {
  312.         }
  313.     CRange(const TParent& range)
  314.         : TParent(range)
  315.         {
  316.         }
  317.     
  318.     // modifiers
  319.     TThisType& operator=(const TParent& range)
  320.         {
  321.             static_cast<TParent&>(*this) = range;
  322.             return *this;
  323.         }
  324. };
  325. ///
  326. /// typedefs for sequence ranges
  327. ///
  328. typedef CRange<TSeqPos>       TSeqRange;
  329. typedef CRange<TSignedSeqPos> TSignedSeqRange;
  330. /* @} */
  331. //#include <util/range.inl>
  332. END_NCBI_SCOPE
  333. /*
  334. * ---------------------------------------------------------------------------
  335. * $Log: range.hpp,v $
  336. * Revision 1000.2  2004/06/01 19:38:28  gouriano
  337. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.17
  338. *
  339. * Revision 1.17  2004/04/20 19:13:33  jcherry
  340. * Made TParent typedef public
  341. *
  342. * Revision 1.16  2004/01/16 17:21:44  vasilche
  343. * Added & to return value of IntersectWith().
  344. *
  345. * Revision 1.15  2003/10/27 16:57:59  dicuccio
  346. * Added typedefs for T{Signed}SeqRange
  347. *
  348. * Revision 1.14  2003/04/17 17:50:24  siyan
  349. * Added doxygen support
  350. *
  351. * Revision 1.13  2003/02/07 16:54:01  vasilche
  352. * Pass all structures with size > sizeof int by reference.
  353. * Move cvs log to the end of files.
  354. *
  355. * Revision 1.12  2003/01/23 21:24:22  vasilche
  356. * Fixed reference to operator=() on IRIX.
  357. *
  358. * Revision 1.11  2003/01/22 21:14:52  vasilche
  359. * Added missing typename.
  360. *
  361. * Revision 1.10  2003/01/22 20:05:24  vasilche
  362. * Simplified CRange<> implementation.
  363. * Removed special handling of Empty & Whole bounds.
  364. * Added simplier COpenRange<> template.
  365. *
  366. * Revision 1.9  2002/12/20 20:53:28  grichenk
  367. * Removed range normalization
  368. *
  369. * Revision 1.8  2002/12/19 20:24:06  grichenk
  370. * Added normalization of intervals (from <= to).
  371. * Removed SetFrom() and SetTo(), added Set().
  372. *
  373. * Revision 1.7  2002/06/04 19:36:33  ucko
  374. * More fixes for empty ranges; CSeq_loc::GetTotalRange() now works again.
  375. *
  376. * Revision 1.6  2002/05/24 14:56:14  grichenk
  377. * Fixed Empty() for unsigned intervals
  378. *
  379. * Revision 1.5  2002/04/22 20:02:33  grichenk
  380. * Fixed CombineFrom(), CombineTo(), operator+=()
  381. *
  382. * Revision 1.4  2001/09/05 14:50:28  grichenk
  383. * Fixed comparison of "whole" ranges
  384. *
  385. * Revision 1.3  2001/01/05 20:08:53  vasilche
  386. * Added util directory for various algorithms and utility classes.
  387. *
  388. * Revision 1.2  2001/01/03 17:24:52  vasilche
  389. * Fixed typo.
  390. *
  391. * Revision 1.1  2001/01/03 16:39:18  vasilche
  392. * Added CAbstractObjectManager - stub for object manager.
  393. * CRange extracted to separate file.
  394. *
  395. * ===========================================================================
  396. */
  397. #endif  /* RANGE__HPP */