1 /*---------------------------------------------------------------------\
3 | |__ / \ / / . \ . \ |
8 \---------------------------------------------------------------------*/
9 /** \file zypp/sat/WhatObsoletes.cc
14 #include "zypp/base/LogTools.h"
15 #include "zypp/base/Tr1hash.h"
16 #include "zypp/sat/WhatObsoletes.h"
17 #include "zypp/sat/detail/PoolImpl.h"
18 #include "zypp/PoolItem.h"
22 ///////////////////////////////////////////////////////////////////
24 { /////////////////////////////////////////////////////////////////
25 ///////////////////////////////////////////////////////////////////
27 { /////////////////////////////////////////////////////////////////
29 // Obsoletes may either match against provides, or names.
30 // Configuration depends on the behaviour of rpm.
32 bool obsoleteUsesProvides = true;
34 bool obsoleteUsesProvides = false;
37 ///////////////////////////////////////////////////////////////////
39 { /////////////////////////////////////////////////////////////////
41 typedef std::tr1::unordered_set<detail::IdType> set_type;
42 typedef std::vector<sat::detail::IdType> vector_type;
44 /////////////////////////////////////////////////////////////////
46 ///////////////////////////////////////////////////////////////////
48 WhatObsoletes::WhatObsoletes( Solvable item_r )
55 WhatObsoletes::WhatObsoletes( const PoolItem & item_r )
62 WhatObsoletes::WhatObsoletes( const ResObject::constPtr item_r )
67 ctorAdd( item_r->satSolvable() );
72 void WhatObsoletes::ctorAdd( const PoolItem & item_r )
73 { ctorAdd( item_r->satSolvable() ); }
75 void WhatObsoletes::ctorAdd( ResObject_constPtr item_r )
76 { if ( item_r ) ctorAdd( item_r->satSolvable() ); }
81 /** Add item to the set created on demand. */
82 inline void addToSet( Solvable item, set_type *& pdata, shared_ptr<void>& _private )
86 _private.reset( (pdata = new set_type) );
88 pdata->insert( item.id() );
92 void WhatObsoletes::ctorAdd( Solvable item_r )
94 if ( item_r.multiversionInstall() )
95 return; // multiversion (rpm -i) does not evaluate any obsoletes
97 if ( obsoleteUsesProvides )
99 WhatProvides obsoleted( item_r.obsoletes() );
100 if ( obsoleted.empty() )
103 // use allocated private data to collect the results
104 set_type * pdata = ( _private ? reinterpret_cast<set_type*>( _private.get() ) : 0 );
105 for_( it, obsoleted.begin(), obsoleted.end() )
107 if ( it->isSystem() )
108 addToSet( *it, pdata, _private );
111 else // Obsoletes match names
113 Capabilities obsoletes( item_r.obsoletes() );
114 if ( obsoletes.empty() )
117 // use allocated private data to collect the results
118 set_type * pdata = ( _private ? reinterpret_cast<set_type*>( _private.get() ) : 0 );
119 for_( it, obsoletes.begin(), obsoletes.end() )
121 // For each obsoletes find providers, but with the same name
122 IdString ident( it->detail().name() );
123 WhatProvides obsoleted( *it );
124 for_( iit, obsoleted.begin(), obsoleted.end() )
126 if ( iit->isSystem() && iit->ident() == ident )
127 addToSet( *iit, pdata, _private );
133 void WhatObsoletes::ctorDone()
137 // copy set to vector and terminate _private
138 set_type * sdata = reinterpret_cast<set_type*>( _private.get() );
140 vector_type * pdata = new vector_type( sdata->begin(), sdata->end() );
141 pdata->push_back( sat::detail::noId );
142 _begin = &pdata->front();
144 _private.reset( pdata );
148 WhatObsoletes::size_type WhatObsoletes::size() const
153 Capabilities::size_type ret = 0;
154 for ( const sat::detail::IdType * end = _begin; *end; ++end )
161 /******************************************************************
163 ** FUNCTION NAME : operator<<
164 ** FUNCTION TYPE : std::ostream &
166 std::ostream & operator<<( std::ostream & str, const WhatObsoletes & obj )
168 return dumpRange( str << "(" << obj.size() << ")", obj.begin(), obj.end() );
171 /////////////////////////////////////////////////////////////////
173 ///////////////////////////////////////////////////////////////////
174 /////////////////////////////////////////////////////////////////
176 ///////////////////////////////////////////////////////////////////