libzypp  10.5.0
WhatProvides.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/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