Imported Upstream version 14.45.0
[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 _Compare = 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       {
61         return range_detail::overlaps( op, rhs.op,
62                                        _Compare()( value, rhs.value ) );
63       }
64     };
65   ///////////////////////////////////////////////////////////////////
66
67   template<class _Tp, class _Compare>
68     inline bool overlaps( const Range<_Tp,_Compare> & lhs,
69                           const Range<_Tp,_Compare> & rhs )
70     { return lhs.overlaps( rhs ); }
71
72   ///////////////////////////////////////////////////////////////////
73
74   template<class _Tp, class _Compare>
75     inline bool operator==( const Range<_Tp,_Compare> & lhs,
76                             const Range<_Tp,_Compare> & rhs )
77     {
78       return( lhs.op == rhs.op
79               && (    lhs.op == Rel::ANY
80                    || lhs.op == Rel::NONE
81                    || relCompare( Rel::EQ, lhs.value, rhs.value,
82                                   _Compare() )
83                  )
84             );
85     }
86
87   template<class _Tp, class _Compare>
88     inline bool operator!=( const Range<_Tp,_Compare> & lhs,
89                             const Range<_Tp,_Compare> & rhs )
90     { return ! ( lhs == rhs ); }
91
92   /////////////////////////////////////////////////////////////////
93 } // namespace zypp
94 ///////////////////////////////////////////////////////////////////
95 #endif // ZYPP_RANGE_H