WhatObsoletes.cc

Go to the documentation of this file.
00001 /*---------------------------------------------------------------------\
00002 |                          ____ _   __ __ ___                          |
00003 |                         |__  / \ / / . \ . \                         |
00004 |                           / / \ V /|  _/  _/                         |
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     // Obsoletes may either match against provides, or names.
00030     // Configuration depends on the behaviour of rpm.
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     } // namespace
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; // multiversion (rpm -i) does not evaluate any obsoletes
00096 
00097       if ( obsoleteUsesProvides )
00098       {
00099         WhatProvides obsoleted( item_r.obsoletes() );
00100         if ( obsoleted.empty() )
00101           return;
00102 
00103         // use allocated private data to collect the results
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 // Obsoletes match names
00112       {
00113         Capabilities obsoletes( item_r.obsoletes() );
00114         if ( obsoletes.empty() )
00115           return;
00116 
00117         // use allocated private data to collect the results
00118         set_type * pdata = ( _private ? reinterpret_cast<set_type*>( _private.get() ) : 0 );
00119         for_( it, obsoletes.begin(), obsoletes.end() )
00120         {
00121           // For each obsoletes find providers, but with the same name
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         // copy set to vector and terminate _private
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     **  FUNCTION NAME : operator<<
00164     **  FUNCTION TYPE : std::ostream &
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   } // namespace sat
00175 } // namespace zypp

Generated on Tue May 5 14:43:19 2015 for libzypp by  doxygen 1.5.6