CapabilityImpl.h

Go to the documentation of this file.
00001 /*---------------------------------------------------------------------\
00002 |                          ____ _   __ __ ___                          |
00003 |                         |__  / \ / / . \ . \                         |
00004 |                           / / \ V /|  _/  _/                         |
00005 |                          / /__ | | | | | |                           |
00006 |                         /_____||_| |_| |_|                           |
00007 |                                                                      |
00008 \---------------------------------------------------------------------*/
00012 #ifndef ZYPP_CAPABILITY_CAPABILITYIMPL_H
00013 #define ZYPP_CAPABILITY_CAPABILITYIMPL_H
00014 
00015 #include "zypp/base/ReferenceCounted.h"
00016 #include "zypp/base/NonCopyable.h"
00017 
00018 #include "zypp/Capability.h"
00019 #include "zypp/Resolvable.h"
00020 #include "zypp/CapMatch.h"
00021 
00023 namespace zypp
00024 { 
00025 
00026   namespace capability
00027   { 
00028     DEFINE_PTR_TYPE(CapabilityImpl)
00029 
00030     
00031     //
00032     //  CLASS NAME : CapabilityImpl
00033     //
00036     class CapabilityImpl : public base::ReferenceCounted, private base::NonCopyable
00037     {
00038     public:
00039       typedef CapabilityImpl           Self;
00040       typedef CapabilityImpl_Ptr       Ptr;
00041       typedef CapabilityImpl_constPtr  constPtr;
00042 
00043       typedef CapabilityTraits::KindType  Kind;
00044 
00045     public:
00047       virtual const Kind & kind() const = 0;
00048 
00050       const Resolvable::Kind & refers() const
00051       { return _refers; }
00052 
00054       virtual bool relevant() const
00055       { return true; }
00056 
00060       virtual CapMatch matches( const constPtr & rhs ) const = 0;
00061 
00066       virtual std::string encode() const = 0;
00067 
00072       virtual std::string asString() const
00073       { return encode(); }
00074 
00080       virtual std::string index() const
00081       { return encode(); }
00083      virtual std::string indexname() const
00084       { return index(); }
00086       virtual Rel op() const
00087       { return Rel::NONE; }
00089       virtual Edition edition() const
00090       { return Edition::noedition; }
00091 
00092     public:
00094       struct SplitInfo
00095       {
00096         std::string name;
00097         std::string path;
00098       };
00100       static SplitInfo getSplitInfo( const Capability & cap );
00101 
00103       static constPtr backdoor( const Capability & cap )
00104       { return cap._pimpl.getPtr(); }
00105 
00106     protected:
00108       CapabilityImpl( const Resolvable::Kind & refers_r );
00109 
00110     protected: // Match helpers
00111       bool sameKind( const constPtr & rhs ) const
00112       { return kind() == rhs->kind(); }
00113 
00114       bool sameRefers( const constPtr & rhs ) const
00115       { return _refers == rhs->_refers; }
00116 
00117       bool sameKindAndRefers( const constPtr & rhs ) const
00118       { return sameKind( rhs ) && sameRefers( rhs ); }
00119 
00120     protected:
00122       virtual std::ostream & dumpOn( std::ostream & str ) const;
00123 
00124     private:
00126       Resolvable::Kind _refers;
00127 
00128     private:
00129       friend struct CapImplOrder;
00137       virtual bool capImplOrderLess( const constPtr & rhs ) const;
00138     };
00140 
00146     template<class _Cap>
00147       inline bool isKind( const CapabilityImpl::constPtr & cap )
00148       { return cap && cap->kind() == CapTraits<_Cap>::kind; }
00149 
00151     template<class _Cap>
00152       inline intrusive_ptr<const _Cap> asKind( const CapabilityImpl::constPtr & cap )
00153       { return dynamic_pointer_cast<const _Cap>(cap); }
00154 
00156     template<class _Cap>
00157       inline intrusive_ptr<const _Cap> asKind( const Capability & cap )
00158       { return dynamic_pointer_cast<const _Cap>( CapabilityImpl::backdoor(cap) ); }
00159 
00161 
00163     struct CapImplOrder : public std::binary_function<CapabilityImpl::constPtr, CapabilityImpl::constPtr, bool>
00164     {
00166       bool operator()( const CapabilityImpl::constPtr & lhs,
00167                        const CapabilityImpl::constPtr & rhs ) const
00168       {
00169         if ( lhs->refers() != rhs->refers() )
00170           return lhs->refers() < rhs->refers();
00171         if ( lhs->kind() != rhs->kind() )
00172           return lhs->kind() < rhs->kind();
00173         return lhs->capImplOrderLess( rhs );
00174       }
00175     };
00176 
00178   } // namespace capability
00181 } // namespace zypp
00183 #endif // ZYPP_CAPABILITY_CAPABILITYIMPL_H

Generated on Thu Apr 24 02:24:48 2008 for zypp by  doxygen 1.4.6