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 libsolv 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 /** Return whether \a lhs matches at least one capability in set. */
79 bool matches( const Capability & lhs ) const;
82 const sat::detail::IdType * _begin;
84 ///////////////////////////////////////////////////////////////////
86 /** \relates Capabilities Stream output */
87 std::ostream & operator<<( std::ostream & str, const Capabilities & obj );
89 ///////////////////////////////////////////////////////////////////
91 // CLASS NAME : Capabilities::const_iterator
93 /** \ref Capabilities iterator.
95 class Capabilities::const_iterator : public boost::iterator_adaptor<
96 const_iterator // Derived
97 , const sat::detail::IdType * // Base
98 , const Capability // Value
99 , boost::forward_traversal_tag // CategoryOrTraversal
100 , const Capability // Reference
105 : const_iterator::iterator_adaptor_( 0 )
108 explicit const_iterator( const sat::detail::IdType * _idx )
109 : const_iterator::iterator_adaptor_( _idx )
111 if ( base_reference() && sat::detail::isDepMarkerId( *base_reference() ) )
119 /** Return \c true if the \ref Capability is \c tagged.
120 * The meaning of \c tagged depends on the kind of dependency you
121 * are processing. It is a hint that the iteratir skipped some
122 * internal marker, indicating that subsequent cabailities have
123 * a special property. Within a \ref Solvables requirements e.g.
124 * the pre-requirements are tagged.
126 * Capabilities req( solvable.requires() );
127 * for_( it, req.begin(), req.end() )
130 * cout << *it << " (is prereq)" << endl;
132 * cout << *it << endl;
136 bool tagged() const { return _tagged; }
139 friend class boost::iterator_core_access;
141 reference dereference() const
142 { return ( base() ) ? Capability( *base() ) : Capability::Null; }
144 template <class OtherDerived, class OtherIterator, class V, class C, class R, class D>
145 bool equal( const boost::iterator_adaptor<OtherDerived, OtherIterator, V, C, R, D> & rhs ) const
146 { // NULL pointer is eqal pointer to Id 0
147 return ( base() == rhs.base() // includes both NULL...
148 || ( !rhs.base() && !*base() )
149 || ( !base() && !*rhs.base() ) );
153 { // jump over libsolvs internal ids.
154 if ( sat::detail::isDepMarkerId( *(++base_reference()) ) )
162 DefaultIntegral<bool,false> _tagged;
164 ///////////////////////////////////////////////////////////////////
166 inline Capabilities::const_iterator Capabilities::begin() const
167 { return const_iterator( _begin ); }
169 inline Capabilities::const_iterator Capabilities::end() const
170 { return const_iterator( 0 ); }
172 inline bool Capabilities::matches( const Capability & lhs ) const
174 for ( const Capability & rhs : *this )
175 if ( lhs.matches( rhs ) == CapMatch::yes )
179 /////////////////////////////////////////////////////////////////
181 ///////////////////////////////////////////////////////////////////
182 #endif // ZYPP_SAT_CAPABILITIES_H