Imported Upstream version 16.3.2
[platform/upstream/libzypp.git] / zypp / Range.h
1 /*---------------------------------------------------------------------\
2 |                          ____ _   __ __ ___                          |
3 |                         |__  / \ / / . \ . \                         |
4 |                           / / \ V /|  _/  _/                         |
5 |                          / /__ | | | | | |                           |
6 |                         /_____||_| |_| |_|                           |
7 |                                                                      |
8 \---------------------------------------------------------------------*/
9 /** \file       zypp/Range.h
10  *
11 */
12 #ifndef ZYPP_RANGE_H
13 #define ZYPP_RANGE_H
14
15 #include "zypp/RelCompare.h"
16
17 ///////////////////////////////////////////////////////////////////
18 namespace zypp
19 { /////////////////////////////////////////////////////////////////
20
21   namespace range_detail
22   {
23     bool overlaps( Rel lhs, Rel rhs, int cmp );
24   }
25
26   ///////////////////////////////////////////////////////////////////
27   //
28   //    CLASS NAME : Range
29   //
30   /**
31    *
32   */
33   template<class Tp, class TCompare = Compare<Tp> >
34     struct Range
35     {
36       /** */
37       Rel op;
38       /** */
39       Tp value;
40
41       /** Default ctor: \ref Rel::ANY. */
42       Range()
43       : op( Rel::ANY )
44       {}
45
46       /** Ctor taking \a Tp (\ref Rel::EQ). */
47       Range( const Tp & value_r )
48       : op( Rel::EQ )
49       , value( value_r )
50       {}
51
52       /** Ctor taking \ref Rel and \a Tp. */
53       Range( Rel op_r, const Tp & value_r )
54       : op( op_r )
55       , value( value_r )
56       {}
57
58       /** Return whether two Ranges overlap. */
59       bool overlaps( const Range & rhs ) const
60       { return range_detail::overlaps( op, rhs.op, TCompare()( value, rhs.value ) ); }
61     };
62   ///////////////////////////////////////////////////////////////////
63
64   template<class Tp, class TCompare>
65     inline bool overlaps( const Range<Tp,TCompare> & lhs,
66                           const Range<Tp,TCompare> & rhs )
67     { return lhs.overlaps( rhs ); }
68
69   ///////////////////////////////////////////////////////////////////
70
71   template<class Tp, class TCompare>
72     inline bool operator==( const Range<Tp,TCompare> & lhs,
73                             const Range<Tp,TCompare> & rhs )
74     {
75       return( lhs.op == rhs.op
76               && (    lhs.op == Rel::ANY
77                    || lhs.op == Rel::NONE
78                    || relCompare( Rel::EQ, lhs.value, rhs.value, TCompare() )
79                  )
80             );
81     }
82
83   template<class Tp, class TCompare>
84     inline bool operator!=( const Range<Tp,TCompare> & lhs,
85                             const Range<Tp,TCompare> & rhs )
86     { return ! ( lhs == rhs ); }
87
88   /////////////////////////////////////////////////////////////////
89 } // namespace zypp
90 ///////////////////////////////////////////////////////////////////
91 #endif // ZYPP_RANGE_H