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::tr1::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::tr1::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::tr1::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::tr1::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
///////////////////////////////////////////////////////////////////