Imported Upstream version 14.45.0
[platform/upstream/libzypp.git] / zypp / sat / SolvableSet.h
1 /*---------------------------------------------------------------------\
2 |                          ____ _   __ __ ___                          |
3 |                         |__  / \ / / . \ . \                         |
4 |                           / / \ V /|  _/  _/                         |
5 |                          / /__ | | | | | |                           |
6 |                         /_____||_| |_| |_|                           |
7 |                                                                      |
8 \---------------------------------------------------------------------*/
9 /** \file       zypp/sat/SolvableSet.h
10  *
11 */
12 #ifndef ZYPP_SAT_SOLVABLESET_H
13 #define ZYPP_SAT_SOLVABLESET_H
14
15 #include <iosfwd>
16
17 #include "zypp/base/PtrTypes.h"
18 #include "zypp/base/Tr1hash.h"
19 #include "zypp/sat/Solvable.h"
20 #include "zypp/sat/SolvIterMixin.h"
21
22 ///////////////////////////////////////////////////////////////////
23 namespace zypp
24 { /////////////////////////////////////////////////////////////////
25   ///////////////////////////////////////////////////////////////////
26   namespace sat
27   { /////////////////////////////////////////////////////////////////
28
29     ///////////////////////////////////////////////////////////////////
30     //
31     //  CLASS NAME : SolvableSet
32     //
33     /** Solvable set wrapper to allow adding additioanal convenience iterators.
34      */
35     class SolvableSet : public SolvIterMixin<SolvableSet,std::tr1::unordered_set<Solvable>::const_iterator>
36     {
37       friend std::ostream & operator<<( std::ostream & str, const SolvableSet & obj );
38
39       public:
40         typedef std::tr1::unordered_set<Solvable> Container;
41         typedef Container::value_type             value_type;
42         typedef Container::size_type              size_type;
43         typedef Solvable_iterator                 const_iterator; // from SolvIterMixin
44
45       public:
46         /** Default ctor */
47         SolvableSet()
48         : _pimpl( new Container )
49         {}
50
51         /** Ctor building a set from a range. */
52         template<class _InputIterator>
53         SolvableSet( _InputIterator begin_r, _InputIterator end_r )
54         : _pimpl( new Container( begin_r, end_r ) )
55         {}
56
57       public:
58         /** Whether the set is epmty. */
59         bool empty() const
60         { return _pimpl->empty(); }
61
62         /** Size of the set. */
63         size_type size() const
64         { return _pimpl->size(); }
65
66         /** */
67         template<class _Solv>
68         bool contains( const _Solv & solv_r ) const
69         { return( get().find( asSolvable()( solv_r ) ) != end() ); }
70
71         /** Iterator pointing to the first \ref Solvable. */
72         const_iterator begin() const
73         { return _pimpl->begin(); }
74
75         /** Iterator pointing behind the last \ref Solvable. */
76         const_iterator end() const
77         { return _pimpl->end(); }
78
79       public:
80
81         /** Insert a Solvable.
82          * \return \c true if it was actually inserted, or \c false if already present.
83         */
84         template<class _Solv>
85         bool insert( const _Solv & solv_r )
86         { return get().insert( asSolvable()( solv_r ) ).second; }
87
88       public:
89         /** The set. */
90         Container & get()
91         { return *_pimpl; }
92
93         /** The set. */
94         const Container & get() const
95         { return *_pimpl; }
96
97       private:
98         /** Pointer to implementation */
99         RWCOW_pointer<Container> _pimpl;
100     };
101     ///////////////////////////////////////////////////////////////////
102
103     /** \relates SolvableSet Stream output */
104     std::ostream & operator<<( std::ostream & str, const SolvableSet & obj );
105
106     /////////////////////////////////////////////////////////////////
107   } // namespace sat
108   ///////////////////////////////////////////////////////////////////
109   /////////////////////////////////////////////////////////////////
110 } // namespace zypp
111 ///////////////////////////////////////////////////////////////////
112 #endif // ZYPP_SAT_SOLVABLESET_H