WhatProvides.cc
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00012 #include <iostream>
00013
00014 #include "zypp/base/LogTools.h"
00015 #include "zypp/sat/WhatProvides.h"
00016 #include "zypp/sat/detail/PoolImpl.h"
00017
00018 using std::endl;
00019
00021 namespace zypp
00022 {
00023
00024 namespace sat
00025 {
00026
00028
00029
00030
00041 class WhatProvides::Impl : protected detail::PoolMember
00042 {
00043 public:
00044 Impl()
00045 : _offset( 0 ), _private( 0 )
00046 {}
00047
00048 Impl( unsigned offset_r )
00049 : _offset( offset_r ), _private( 0 )
00050 {}
00051
00052 Impl( const std::tr1::unordered_set<detail::IdType> & ids_r )
00053 : _offset( 0 ), _private( 0 )
00054 {
00055
00056 _pdata.reserve( ids_r.size()+1 );
00057 _pdata.insert( _pdata.begin(), ids_r.begin(), ids_r.end() );
00058 _pdata.push_back( detail::noId );
00059
00060 _private = &_pdata.front();
00061 }
00062
00063 public:
00064 unsigned _offset;
00065 const detail::IdType * _private;
00066
00067 private:
00068 std::vector<sat::detail::IdType> _pdata;
00069 };
00071
00073 namespace
00074 {
00075
00077 template <class Iterator>
00078 void collectProviders( Iterator begin_r, Iterator end_r, std::tr1::unordered_set<detail::IdType> & collect_r )
00079 {
00080 for_( it, begin_r, end_r )
00081 {
00082 WhatProvides providers( *it );
00083 for_( prv, providers.begin(), providers.end() )
00084 {
00085 collect_r.insert( prv->id() );
00086 }
00087 }
00088 }
00089
00091 }
00093
00094 WhatProvides::WhatProvides()
00095 {}
00096
00097 WhatProvides::WhatProvides( Capability cap_r )
00098 {
00099 unsigned res( myPool().whatProvides( cap_r ) );
00100 if ( myPool().whatProvidesData( res ) )
00101 {
00102 _pimpl.reset( new Impl( res ) );
00103 }
00104
00105 }
00106
00107 WhatProvides::WhatProvides( Capabilities caps_r )
00108 {
00109 std::tr1::unordered_set<detail::IdType> ids;
00110 collectProviders( caps_r.begin(), caps_r.end(), ids );
00111 if ( ! ids.empty() )
00112 {
00113 _pimpl.reset( new Impl( ids ) );
00114 }
00115
00116 }
00117
00118 WhatProvides::WhatProvides( const CapabilitySet & caps_r )
00119 {
00120 std::tr1::unordered_set<detail::IdType> ids;
00121 collectProviders( caps_r.begin(), caps_r.end(), ids );
00122 if ( ! ids.empty() )
00123 {
00124 _pimpl.reset( new Impl( ids ) );
00125 }
00126
00127 }
00128
00129 bool WhatProvides::empty() const
00130 {
00131 return !_pimpl;
00132 }
00133
00134 WhatProvides::size_type WhatProvides::size() const
00135 {
00136 if ( !_pimpl )
00137 return 0;
00138
00139 size_type count = 0;
00140 for_( it, begin(), end() )
00141 ++count;
00142 return count;
00143 }
00144
00145 WhatProvides::const_iterator WhatProvides::begin() const
00146 {
00147 if ( !_pimpl )
00148 return const_iterator();
00149
00150 if ( _pimpl->_private )
00151 return const_iterator( _pimpl->_private );
00152
00153
00154 return const_iterator( &myPool().getPool()->whatprovidesdata, _pimpl->_offset );
00155 }
00156
00157
00158
00159
00160
00161
00162 std::ostream & operator<<( std::ostream & str, const WhatProvides & obj )
00163 {
00164 return dumpRange( str << "(" << obj.size() << ")", obj.begin(), obj.end() );
00165 }
00166
00168 namespace detail
00169 {
00170
00171 std::ostream & operator<<( std::ostream & str, const WhatProvidesIterator & obj )
00172 {
00173 str << str::form( "[%5u]", obj._offset );
00174 str << str::form( "<%p(%p)>", obj.base_reference(), &obj.base_reference() );
00175 str << str::form( "<%p(%p)>", obj._baseRef, (obj._baseRef ? *obj._baseRef : 0) );
00176 return str;
00177 }
00178
00180 }
00182
00184 }
00187 }