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.
31 bool obsoleteUsesProvides = false;
33 ///////////////////////////////////////////////////////////////////
35 { /////////////////////////////////////////////////////////////////
37 typedef std::tr1::unordered_set<detail::IdType> set_type;
38 typedef std::vector<sat::detail::IdType> vector_type;
40 /////////////////////////////////////////////////////////////////
42 ///////////////////////////////////////////////////////////////////
44 WhatObsoletes::WhatObsoletes( Solvable item_r )
51 WhatObsoletes::WhatObsoletes( const PoolItem & item_r )
58 WhatObsoletes::WhatObsoletes( const ResObject::constPtr item_r )
63 ctorAdd( item_r->satSolvable() );
68 void WhatObsoletes::ctorAdd( const PoolItem & item_r )
69 { ctorAdd( item_r->satSolvable() ); }
71 void WhatObsoletes::ctorAdd( ResObject_constPtr item_r )
72 { if ( item_r ) ctorAdd( item_r->satSolvable() ); }
77 /** Add item to the set created on demand. */
78 inline void addToSet( Solvable item, set_type *& pdata, shared_ptr<void>& _private )
82 _private.reset( (pdata = new set_type) );
84 pdata->insert( item.id() );
88 void WhatObsoletes::ctorAdd( Solvable item_r )
90 if ( obsoleteUsesProvides )
92 WhatProvides obsoleted( item_r.obsoletes() );
93 if ( obsoleted.empty() )
96 // use allocated private data to collect the results
97 set_type * pdata = ( _private ? reinterpret_cast<set_type*>( _private.get() ) : 0 );
98 for_( it, obsoleted.begin(), obsoleted.end() )
100 if ( it->isSystem() )
101 addToSet( *it, pdata, _private );
104 else // Obsoletes match names
106 Capabilities obsoletes( item_r.obsoletes() );
107 if ( obsoletes.empty() )
110 // use allocated private data to collect the results
111 set_type * pdata = ( _private ? reinterpret_cast<set_type*>( _private.get() ) : 0 );
112 for_( it, obsoletes.begin(), obsoletes.end() )
114 // For each obsoletes find providers, but with the same name
115 IdString ident( it->detail().name() );
116 WhatProvides obsoleted( *it );
117 for_( iit, obsoleted.begin(), obsoleted.end() )
119 if ( iit->isSystem() && iit->ident() == ident )
120 addToSet( *iit, pdata, _private );
126 void WhatObsoletes::ctorDone()
130 // copy set to vector and terminate _private
131 set_type * sdata = reinterpret_cast<set_type*>( _private.get() );
133 vector_type * pdata = new vector_type( sdata->begin(), sdata->end() );
134 pdata->push_back( sat::detail::noId );
135 _begin = &pdata->front();
137 _private.reset( pdata );
141 WhatObsoletes::size_type WhatObsoletes::size() const
146 Capabilities::size_type ret = 0;
147 for ( const sat::detail::IdType * end = _begin; *end; ++end )
154 /******************************************************************
156 ** FUNCTION NAME : operator<<
157 ** FUNCTION TYPE : std::ostream &
159 std::ostream & operator<<( std::ostream & str, const WhatObsoletes & obj )
161 return dumpRange( str << "(" << obj.size() << ")", obj.begin(), obj.end() );
164 /////////////////////////////////////////////////////////////////
166 ///////////////////////////////////////////////////////////////////
167 /////////////////////////////////////////////////////////////////
169 ///////////////////////////////////////////////////////////////////