1 /*---------------------------------------------------------------------\
3 | |__ / \ / / . \ . \ |
8 \---------------------------------------------------------------------*/
9 /** \file zypp/sat/WhatProvides.cc
14 #include "zypp/base/LogTools.h"
15 #include "zypp/sat/WhatProvides.h"
16 #include "zypp/sat/detail/PoolImpl.h"
20 ///////////////////////////////////////////////////////////////////
22 { /////////////////////////////////////////////////////////////////
23 ///////////////////////////////////////////////////////////////////
25 { /////////////////////////////////////////////////////////////////
27 ///////////////////////////////////////////////////////////////////
29 // CLASS NAME : WhatProvides::Impl
31 /** WhatProvides implementation date.
32 * Stores the offset into a O terminated Id array. Per default
33 * libsolvs whatprovidesdata, otherwise private data.
35 * As libsolvs whatprovidesdata might be realocated
36 * while iterating a result, the iterator takes an
37 * <tt>const IdType *const*</tt>. Thats why we explicitly
38 * provide _private and pass its adress to the iterator,
39 * even if private data are not reallocated.
41 class WhatProvides::Impl : protected detail::PoolMember
45 : _offset( 0 ), _private( 0 )
48 Impl( unsigned offset_r )
49 : _offset( offset_r ), _private( 0 )
52 Impl( const std::unordered_set<detail::IdType> & ids_r )
53 : _offset( 0 ), _private( 0 )
55 // use private data to store the result (incl. trailing NULL)
56 _pdata.reserve( ids_r.size()+1 );
57 _pdata.insert( _pdata.begin(), ids_r.begin(), ids_r.end() );
58 _pdata.push_back( detail::noId );
60 _private = &_pdata.front(); // ptr to 1st element
65 const detail::IdType * _private;
68 std::vector<sat::detail::IdType> _pdata;
70 ///////////////////////////////////////////////////////////////////
72 ///////////////////////////////////////////////////////////////////
74 { /////////////////////////////////////////////////////////////////
76 /** WhatProvides ctor helper collecting providers from Capabilies. */
77 template <class Iterator>
78 void collectProviders( Iterator begin_r, Iterator end_r, std::unordered_set<detail::IdType> & collect_r )
80 for_( it, begin_r, end_r )
82 WhatProvides providers( *it );
83 for_( prv, providers.begin(), providers.end() )
85 collect_r.insert( prv->id() );
90 /////////////////////////////////////////////////////////////////
92 ///////////////////////////////////////////////////////////////////
94 WhatProvides::WhatProvides()
97 WhatProvides::WhatProvides( Capability cap_r )
99 unsigned res( myPool().whatProvides( cap_r ) );
100 if ( myPool().whatProvidesData( res ) )
102 _pimpl.reset( new Impl( res ) );
104 // else: no Impl for empty result.
107 WhatProvides::WhatProvides( Capabilities caps_r )
109 std::unordered_set<detail::IdType> ids;
110 collectProviders( caps_r.begin(), caps_r.end(), ids );
113 _pimpl.reset( new Impl( ids ) );
115 // else: no Impl for empty result.
118 WhatProvides::WhatProvides( const CapabilitySet & caps_r )
120 std::unordered_set<detail::IdType> ids;
121 collectProviders( caps_r.begin(), caps_r.end(), ids );
124 _pimpl.reset( new Impl( ids ) );
126 // else: no Impl for empty result.
129 bool WhatProvides::empty() const
131 return !_pimpl; // Ctor asserts no Impl for empty result.
134 WhatProvides::size_type WhatProvides::size() const
140 for_( it, begin(), end() )
145 WhatProvides::const_iterator WhatProvides::begin() const
148 return const_iterator();
150 if ( _pimpl->_private )
151 return const_iterator( _pimpl->_private );
153 // for libsolvs index use one more indirection, as it might get relocated.
154 return const_iterator( &myPool().getPool()->whatprovidesdata, _pimpl->_offset );
157 /******************************************************************
159 ** FUNCTION NAME : operator<<
160 ** FUNCTION TYPE : std::ostream &
162 std::ostream & operator<<( std::ostream & str, const WhatProvides & obj )
164 return dumpRange( str << "(" << obj.size() << ")", obj.begin(), obj.end() );
167 ///////////////////////////////////////////////////////////////////
169 { /////////////////////////////////////////////////////////////////
171 std::ostream & operator<<( std::ostream & str, const WhatProvidesIterator & obj )
173 str << str::form( "[%5u]", obj._offset );
174 str << str::form( "<%p(%p)>", obj.base_reference(), &obj.base_reference() );
175 str << str::form( "<%p(%p)>", obj._baseRef, (obj._baseRef ? *obj._baseRef : 0) );
179 /////////////////////////////////////////////////////////////////
181 ///////////////////////////////////////////////////////////////////
183 /////////////////////////////////////////////////////////////////
185 ///////////////////////////////////////////////////////////////////
186 /////////////////////////////////////////////////////////////////
188 ///////////////////////////////////////////////////////////////////