libzypp
10.5.0
|
00001 /*---------------------------------------------------------------------\ 00002 | ____ _ __ __ ___ | 00003 | |__ / \ / / . \ . \ | 00004 | / / \ V /| _/ _/ | 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 // CLASS NAME : WhatProvides::Impl 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 // use private data to store the result (incl. trailing NULL) 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(); // ptr to 1st element 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 } //namespace 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 // else: no Impl for empty result. 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 // else: no Impl for empty result. 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 // else: no Impl for empty result. 00127 } 00128 00129 bool WhatProvides::empty() const 00130 { 00131 return !_pimpl; // Ctor asserts no Impl for empty result. 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 // for libsolvs index use one more indirection, as it might get relocated. 00154 return const_iterator( &myPool().getPool()->whatprovidesdata, _pimpl->_offset ); 00155 } 00156 00157 /****************************************************************** 00158 ** 00159 ** FUNCTION NAME : operator<< 00160 ** FUNCTION TYPE : std::ostream & 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 } //namespace detail 00182 00184 } // namespace sat 00187 } // namespace zypp