WhatObsoletes.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/base/Tr1hash.h"
00016 #include "zypp/sat/WhatObsoletes.h"
00017 #include "zypp/sat/detail/PoolImpl.h"
00018 #include "zypp/PoolItem.h"
00019
00020 using std::endl;
00021
00023 namespace zypp
00024 {
00025
00026 namespace sat
00027 {
00028
00029
00030
00031 #ifdef _RPM_5
00032 bool obsoleteUsesProvides = true;
00033 #else
00034 bool obsoleteUsesProvides = false;
00035 #endif
00036
00038 namespace
00039 {
00040
00041 typedef std::tr1::unordered_set<detail::IdType> set_type;
00042 typedef std::vector<sat::detail::IdType> vector_type;
00043
00045 }
00047
00048 WhatObsoletes::WhatObsoletes( Solvable item_r )
00049 : _begin( 0 )
00050 {
00051 ctorAdd( item_r );
00052 ctorDone();
00053 }
00054
00055 WhatObsoletes::WhatObsoletes( const PoolItem & item_r )
00056 : _begin( 0 )
00057 {
00058 ctorAdd( item_r );
00059 ctorDone();
00060 }
00061
00062 WhatObsoletes::WhatObsoletes( const ResObject::constPtr item_r )
00063 : _begin( 0 )
00064 {
00065 if ( item_r )
00066 {
00067 ctorAdd( item_r->satSolvable() );
00068 ctorDone();
00069 }
00070 }
00071
00072 void WhatObsoletes::ctorAdd( const PoolItem & item_r )
00073 { ctorAdd( item_r->satSolvable() ); }
00074
00075 void WhatObsoletes::ctorAdd( ResObject_constPtr item_r )
00076 { if ( item_r ) ctorAdd( item_r->satSolvable() ); }
00077
00078
00079 namespace
00080 {
00082 inline void addToSet( Solvable item, set_type *& pdata, shared_ptr<void>& _private )
00083 {
00084 if ( ! pdata )
00085 {
00086 _private.reset( (pdata = new set_type) );
00087 }
00088 pdata->insert( item.id() );
00089 }
00090 }
00091
00092 void WhatObsoletes::ctorAdd( Solvable item_r )
00093 {
00094 if ( item_r.multiversionInstall() )
00095 return;
00096
00097 if ( obsoleteUsesProvides )
00098 {
00099 WhatProvides obsoleted( item_r.obsoletes() );
00100 if ( obsoleted.empty() )
00101 return;
00102
00103
00104 set_type * pdata = ( _private ? reinterpret_cast<set_type*>( _private.get() ) : 0 );
00105 for_( it, obsoleted.begin(), obsoleted.end() )
00106 {
00107 if ( it->isSystem() )
00108 addToSet( *it, pdata, _private );
00109 }
00110 }
00111 else
00112 {
00113 Capabilities obsoletes( item_r.obsoletes() );
00114 if ( obsoletes.empty() )
00115 return;
00116
00117
00118 set_type * pdata = ( _private ? reinterpret_cast<set_type*>( _private.get() ) : 0 );
00119 for_( it, obsoletes.begin(), obsoletes.end() )
00120 {
00121
00122 IdString ident( it->detail().name() );
00123 WhatProvides obsoleted( *it );
00124 for_( iit, obsoleted.begin(), obsoleted.end() )
00125 {
00126 if ( iit->isSystem() && iit->ident() == ident )
00127 addToSet( *iit, pdata, _private );
00128 }
00129 }
00130 }
00131 }
00132
00133 void WhatObsoletes::ctorDone()
00134 {
00135 if ( _private )
00136 {
00137
00138 set_type * sdata = reinterpret_cast<set_type*>( _private.get() );
00139
00140 vector_type * pdata = new vector_type( sdata->begin(), sdata->end() );
00141 pdata->push_back( sat::detail::noId );
00142 _begin = &pdata->front();
00143
00144 _private.reset( pdata );
00145 }
00146 }
00147
00148 WhatObsoletes::size_type WhatObsoletes::size() const
00149 {
00150 if ( ! _begin )
00151 return 0;
00152
00153 Capabilities::size_type ret = 0;
00154 for ( const sat::detail::IdType * end = _begin; *end; ++end )
00155 {
00156 ++ret;
00157 }
00158 return ret;
00159 }
00160
00161
00162
00163
00164
00165
00166 std::ostream & operator<<( std::ostream & str, const WhatObsoletes & obj )
00167 {
00168 return dumpRange( str << "(" << obj.size() << ")", obj.begin(), obj.end() );
00169 }
00170
00172 }
00175 }