Imported Upstream version 16.3.2
[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/Hash.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 additional convenience iterators.
34      */
35     class SolvableSet : public SolvIterMixin<SolvableSet,std::unordered_set<Solvable>::const_iterator>
36     {
37       friend std::ostream & operator<<( std::ostream & str, const SolvableSet & obj );
38
39       public:
40         typedef std::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 TInputIterator>
53         SolvableSet( TInputIterator begin_r, TInputIterator 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 TSolv>
68         bool contains( const TSolv & solv_r ) const
69         { return( get().count( asSolvable()( solv_r ) ) ); }
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         /** Clear the container */
81         void clear()
82         { get().clear(); }
83
84         /** Insert a Solvable.
85          * \return \c true if it was actually inserted, or \c false if already present.
86          */
87         template<class TSolv>
88         bool insert( const TSolv & solv_r )
89         { return get().insert( asSolvable()( solv_r ) ).second; }
90
91         /** Insert a range of Solvables. */
92         template<class TIterator>
93         void insert( TIterator begin_r, TIterator end_r )
94         { for_( it, begin_r, end_r ) insert( *it ); }
95
96       public:
97         /** The set. */
98         Container & get()
99         { return *_pimpl; }
100
101         /** The set. */
102         const Container & get() const
103         { return *_pimpl; }
104
105       private:
106         /** Pointer to implementation */
107         RWCOW_pointer<Container> _pimpl;
108     };
109     ///////////////////////////////////////////////////////////////////
110
111     /** \relates SolvableSet Stream output */
112     std::ostream & operator<<( std::ostream & str, const SolvableSet & obj );
113
114     /////////////////////////////////////////////////////////////////
115   } // namespace sat
116   ///////////////////////////////////////////////////////////////////
117   /////////////////////////////////////////////////////////////////
118 } // namespace zypp
119 ///////////////////////////////////////////////////////////////////
120 #endif // ZYPP_SAT_SOLVABLESET_H