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
1.4.6