Merge pull request #23 from openSUSE/drop_package_manager
[platform/upstream/libzypp.git] / zypp / CapMatch.h
1 /*---------------------------------------------------------------------\
2 |                          ____ _   __ __ ___                          |
3 |                         |__  / \ / / . \ . \                         |
4 |                           / / \ V /|  _/  _/                         |
5 |                          / /__ | | | | | |                           |
6 |                         /_____||_| |_| |_|                           |
7 |                                                                      |
8 \---------------------------------------------------------------------*/
9 /** \file       zypp/CapMatch.h
10  *
11 */
12 #ifndef ZYPP_CAPMATCH_H
13 #define ZYPP_CAPMATCH_H
14
15 #include <iosfwd>
16
17 ///////////////////////////////////////////////////////////////////
18 namespace zypp
19 { /////////////////////////////////////////////////////////////////
20
21   ///////////////////////////////////////////////////////////////////
22   //
23   //    CLASS NAME : CapMatch
24   //
25   /** Tri state Capability match result.
26    *
27    * CapMatch::irrelevant denotes a result value that should be ignored.
28    * Therfore it behaves neutral when used in <tt>! && ||</tt> expressions.
29    *
30    * \code
31    *   CapMatch any
32    *   (CapMatch::irrelevant && any) == any                  // true
33    *   (CapMatch::irrelevant || any) == any                  // true
34    *   ( !CapMatch::irrelevant )     == CapMatch::irrelevant // true
35    * \endcode
36   */
37   class CapMatch
38   {
39     enum Result { NOMATCH, MATCH, IRRELEVANT };
40
41   public:
42
43     CapMatch()
44     : _result( IRRELEVANT )
45     {}
46
47     CapMatch( bool val_r )
48     : _result( val_r ? MATCH : NOMATCH )
49     {}
50
51     static const CapMatch yes;
52     static const CapMatch no;
53     static const CapMatch irrelevant;
54
55     friend bool operator==( const CapMatch & lhs, const CapMatch & rhs )
56     { return lhs._result == rhs._result; }
57
58     friend bool operator!=( const CapMatch & lhs, const CapMatch & rhs )
59     { return lhs._result != rhs._result; }
60
61     friend CapMatch operator!( const CapMatch & lhs )
62     {
63       if ( lhs._result == CapMatch::IRRELEVANT )
64         return lhs;
65       return !(lhs._result == CapMatch::MATCH);
66     }
67
68     friend CapMatch operator&&( const CapMatch & lhs, const CapMatch & rhs )
69     {
70       if ( lhs._result == CapMatch::IRRELEVANT )
71         return rhs;
72       if ( rhs._result == CapMatch::IRRELEVANT )
73         return lhs;
74       return    (lhs._result == CapMatch::MATCH)
75              && (rhs._result == CapMatch::MATCH);
76     }
77
78     friend CapMatch operator||( const CapMatch & lhs, const CapMatch & rhs )
79     {
80       if ( lhs._result == CapMatch::IRRELEVANT )
81         return rhs;
82       if ( rhs._result == CapMatch::IRRELEVANT )
83         return lhs;
84       return    (lhs._result == CapMatch::MATCH)
85              || (rhs._result == CapMatch::MATCH);
86     }
87
88     friend std::ostream & operator<<( std::ostream & str, const CapMatch & obj );
89
90   private:
91     Result _result;
92   };
93   ///////////////////////////////////////////////////////////////////
94
95   /** \relates CapMatch Stream output */
96   std::ostream & operator<<( std::ostream & str, const CapMatch & obj );
97
98   /////////////////////////////////////////////////////////////////
99 } // namespace zypp
100 ///////////////////////////////////////////////////////////////////
101 #endif // ZYPP_CAPMATCH_H