moving sourcefiles
[platform/upstream/libzypp.git] / zypp / Capabilities.h
1 /*---------------------------------------------------------------------\
2 |                          ____ _   __ __ ___                          |
3 |                         |__  / \ / / . \ . \                         |
4 |                           / / \ V /|  _/  _/                         |
5 |                          / /__ | | | | | |                           |
6 |                         /_____||_| |_| |_|                           |
7 |                                                                      |
8 \---------------------------------------------------------------------*/
9 /** \file       zypp/sat/Capabilities.h
10  *
11 */
12 #ifndef ZYPP_SAT_CAPABILITIES_H
13 #define ZYPP_SAT_CAPABILITIES_H
14
15 #include <iosfwd>
16
17 #include "zypp/sat/detail/PoolMember.h"
18 #include "zypp/Capability.h"
19
20 ///////////////////////////////////////////////////////////////////
21 namespace zypp
22 { /////////////////////////////////////////////////////////////////
23
24   ///////////////////////////////////////////////////////////////////
25   //
26   //    CLASS NAME : Capabilities
27   //
28   /** Container of \ref Capability (currently read only).
29    *
30    * \note satsolver dependency lists may include internal ids
31    * which must be skipped on iteration or size calculation
32    * (\see \ref detail::isDepMarkerId).
33    */
34   class Capabilities
35   {
36     public:
37       typedef Capability value_type;
38       typedef unsigned   size_type;
39
40       enum Mode { SKIP_TO_INTERNAL };
41
42     public:
43       /** Default ctor */
44       Capabilities()
45       : _begin( 0 )
46       {}
47
48       /** Ctor from Id pointer (friend \ref Solvable). */
49       explicit
50       Capabilities( const sat::detail::IdType * base_r )
51       : _begin( base_r )
52       {}
53
54       /** Ctor from Id pointer (friend \ref Solvable).
55        * Jump behind skip_r (e.g. behind prereqMarker).
56        */
57       Capabilities( const sat::detail::IdType * base_r, sat::detail::IdType skip_r );
58
59     public:
60       /** Whether the container is empty. */
61       bool empty() const
62       { return ! ( _begin && *_begin ); }
63
64       /** Number of capabilities inside. */
65       size_type size() const;
66
67     public:
68       class const_iterator;
69
70       /** Iterator pointing to the first \ref Capability. */
71       const_iterator begin() const;
72
73       /** Iterator pointing bhind the last \ref Capability. */
74       const_iterator end() const;
75
76     private:
77       const sat::detail::IdType * _begin;
78   };
79   ///////////////////////////////////////////////////////////////////
80
81   /** \relates Capabilities Stream output */
82   std::ostream & operator<<( std::ostream & str, const Capabilities & obj );
83
84   ///////////////////////////////////////////////////////////////////
85   //
86   //    CLASS NAME : Capabilities::const_iterator
87   //
88   /** \ref Capabilities iterator.
89    */
90   class Capabilities::const_iterator : public boost::iterator_adaptor<
91         const_iterator                   // Derived
92       , const sat::detail::IdType *      // Base
93       , const Capability                 // Value
94       , boost::forward_traversal_tag     // CategoryOrTraversal
95       , const Capability &               // Reference
96       >
97   {
98     public:
99       const_iterator()
100       : const_iterator::iterator_adaptor_( 0 )
101       {}
102
103       explicit const_iterator( const sat::detail::IdType * _idx )
104       : const_iterator::iterator_adaptor_( _idx )
105       { assignVal(); }
106
107     private:
108       friend class boost::iterator_core_access;
109
110       reference dereference() const
111       { return _val; }
112
113       template <class OtherDerived, class OtherIterator, class V, class C, class R, class D>
114           bool equal( const boost::iterator_adaptor<OtherDerived, OtherIterator, V, C, R, D> & rhs ) const
115           { // NULL pointer is eqal pointer to Id 0
116             return ( base() == rhs.base() // includes both NULL...
117                 || ( !rhs.base() && !*base()     )
118                 || ( !base()     && !*rhs.base() ) );
119           }
120
121           void increment()
122           { // jump over satsolvers internal ids.
123             if ( sat::detail::isDepMarkerId( *(++base_reference()) ) ) ++base_reference();
124             assignVal();
125           }
126
127     private:
128       void assignVal()
129       { _val = ( base() ) ? Capability( *base() ) : Capability::Null; }
130
131       mutable Capability _val;
132   };
133   ///////////////////////////////////////////////////////////////////
134
135   inline Capabilities::const_iterator Capabilities::begin() const
136   { return const_iterator( _begin ); }
137
138   inline Capabilities::const_iterator Capabilities::end() const
139   { return const_iterator( 0 ); }
140
141   /////////////////////////////////////////////////////////////////
142 } // namespace zypp
143 ///////////////////////////////////////////////////////////////////
144 #endif // ZYPP_SAT_CAPABILITIES_H