1 /*---------------------------------------------------------------------\
3 | |__ / \ / / . \ . \ |
8 \---------------------------------------------------------------------*/
9 /** \file zypp/sat/Capabilities.h
12 #ifndef ZYPP_SAT_CAPABILITIES_H
13 #define ZYPP_SAT_CAPABILITIES_H
17 #include "zypp/base/DefaultIntegral.h"
18 #include "zypp/sat/detail/PoolMember.h"
19 #include "zypp/Capability.h"
21 ///////////////////////////////////////////////////////////////////
23 { /////////////////////////////////////////////////////////////////
25 ///////////////////////////////////////////////////////////////////
27 // CLASS NAME : Capabilities
29 /** Container of \ref Capability (currently read only).
31 * \note satsolver dependency lists may include internal ids
32 * which must be skipped on iteration or size calculation
33 * (\see \ref detail::isDepMarkerId).
38 typedef Capability value_type;
39 typedef unsigned size_type;
41 enum Mode { SKIP_TO_INTERNAL };
49 /** Ctor from Id pointer (friend \ref Solvable). */
51 Capabilities( const sat::detail::IdType * base_r )
55 /** Ctor from Id pointer (friend \ref Solvable).
56 * Jump behind skip_r (e.g. behind prereqMarker).
58 Capabilities( const sat::detail::IdType * base_r, sat::detail::IdType skip_r );
61 /** Whether the container is empty. */
63 { return ! ( _begin && *_begin ); }
65 /** Number of capabilities inside. */
66 size_type size() const;
71 /** Iterator pointing to the first \ref Capability. */
72 const_iterator begin() const;
74 /** Iterator pointing behind the last \ref Capability. */
75 const_iterator end() const;
78 const sat::detail::IdType * _begin;
80 ///////////////////////////////////////////////////////////////////
82 /** \relates Capabilities Stream output */
83 std::ostream & operator<<( std::ostream & str, const Capabilities & obj );
85 ///////////////////////////////////////////////////////////////////
87 // CLASS NAME : Capabilities::const_iterator
89 /** \ref Capabilities iterator.
91 class Capabilities::const_iterator : public boost::iterator_adaptor<
92 const_iterator // Derived
93 , const sat::detail::IdType * // Base
94 , const Capability // Value
95 , boost::forward_traversal_tag // CategoryOrTraversal
96 , const Capability // Reference
101 : const_iterator::iterator_adaptor_( 0 )
104 explicit const_iterator( const sat::detail::IdType * _idx )
105 : const_iterator::iterator_adaptor_( _idx )
107 if ( base_reference() && sat::detail::isDepMarkerId( *base_reference() ) )
115 /** Return \c true if the \ref Capability is \c tagged.
116 * The meaning of \c tagged depends on the kind of dependency you
117 * are processing. It is a hint that the iteratir skipped some
118 * internal marker, indicating that subsequent cabailities have
119 * a special property. Within a \ref Solvables requirements e.g.
120 * the pre-requirements are tagged.
122 * Capabilities req( solvable.requires() );
123 * for_( it, req.begin(), req.end() )
126 * cout << *it << " (is prereq)" << endl;
128 * cout << *it << endl;
132 bool tagged() const { return _tagged; }
135 friend class boost::iterator_core_access;
137 reference dereference() const
138 { return ( base() ) ? Capability( *base() ) : Capability::Null; }
140 template <class OtherDerived, class OtherIterator, class V, class C, class R, class D>
141 bool equal( const boost::iterator_adaptor<OtherDerived, OtherIterator, V, C, R, D> & rhs ) const
142 { // NULL pointer is eqal pointer to Id 0
143 return ( base() == rhs.base() // includes both NULL...
144 || ( !rhs.base() && !*base() )
145 || ( !base() && !*rhs.base() ) );
149 { // jump over satsolvers internal ids.
150 if ( sat::detail::isDepMarkerId( *(++base_reference()) ) )
158 DefaultIntegral<bool,false> _tagged;
160 ///////////////////////////////////////////////////////////////////
162 inline Capabilities::const_iterator Capabilities::begin() const
163 { return const_iterator( _begin ); }
165 inline Capabilities::const_iterator Capabilities::end() const
166 { return const_iterator( 0 ); }
168 /////////////////////////////////////////////////////////////////
170 ///////////////////////////////////////////////////////////////////
171 #endif // ZYPP_SAT_CAPABILITIES_H