00001
00002
00003
00004
00005
00006
00007
00008
00012 #ifndef ZYPP_CAPABILITY_H
00013 #define ZYPP_CAPABILITY_H
00014
00015 #include <iosfwd>
00016
00017 #include "zypp/base/SafeBool.h"
00018 #include "zypp/base/Deprecated.h"
00019
00020 #include "zypp/sat/detail/PoolMember.h"
00021
00022 #include "zypp/IdString.h"
00023 #include "zypp/Edition.h"
00024 #include "zypp/Rel.h"
00025 #include "zypp/ResTraits.h"
00026
00027 #include "zypp/CapMatch.h"
00028
00030 namespace zypp
00031 {
00032
00033 class Capability;
00034 class CapDetail;
00035 class Arch;
00036
00037 typedef std::tr1::unordered_set<Capability> CapabilitySet;
00038
00040
00041
00042
00061 class Capability: protected sat::detail::PoolMember,
00062 private base::SafeBool<Capability>
00063 {
00064 public:
00065 enum CtorFlag { PARSED, UNPARSED };
00066
00067 public:
00069 Capability() : _id( sat::detail::emptyId ) {}
00070
00072 explicit Capability( sat::detail::IdType id_r ) : _id( id_r ) {}
00073
00082 explicit Capability( const char * str_r, const ResKind & prefix_r = ResKind(), CtorFlag flag_r = UNPARSED );
00084 explicit Capability( const std::string & str_r, const ResKind & prefix_r = ResKind(), CtorFlag flag_r = UNPARSED );
00086 Capability( const Arch & arch_r, const char * str_r, const ResKind & prefix_r = ResKind(), CtorFlag flag_r = UNPARSED );
00088 Capability( const Arch & arch_r, const std::string & str_r, const ResKind & prefix_r = ResKind(), CtorFlag flag_r = UNPARSED );
00089
00091 Capability( const char * str_r, CtorFlag flag_r, const ResKind & prefix_r = ResKind() );
00093 Capability( const std::string & str_r, CtorFlag flag_r, const ResKind & prefix_r = ResKind() );
00095 Capability( const Arch & arch_r, const char * str_r, CtorFlag flag_r, const ResKind & prefix_r = ResKind() );
00097 Capability( const Arch & arch_r, const std::string & str_r, CtorFlag flag_r, const ResKind & prefix_r = ResKind() );
00099
00100
00105 Capability( const std::string & name_r, const std::string & op_r, const std::string & ed_r, const ResKind & prefix_r = ResKind() );
00107 Capability( const std::string & name_r, Rel op_r, const std::string & ed_r, const ResKind & prefix_r = ResKind() );
00109 Capability( const std::string & name_r, Rel op_r, const Edition & ed_r, const ResKind & prefix_r = ResKind() );
00111
00116 Capability( const std::string & arch_r, const std::string & name_r, const std::string & op_r, const std::string & ed_r, const ResKind & prefix_r = ResKind() );
00118 Capability( const std::string & arch_r, const std::string & name_r, Rel op_r, const std::string & ed_r, const ResKind & prefix_r = ResKind() );
00120 Capability( const std::string & arch_r, const std::string & name_r, Rel op_r, const Edition & ed_r, const ResKind & prefix_r = ResKind() );
00122 Capability( const Arch & arch_r, const std::string & name_r, const std::string & op_r, const std::string & ed_r, const ResKind & prefix_r = ResKind() );
00124 Capability( const Arch & arch_r, const std::string & name_r, Rel op_r, const std::string & ed_r, const ResKind & prefix_r = ResKind() );
00126 Capability( const Arch & arch_r, const std::string & name_r, Rel op_r, const Edition & ed_r, const ResKind & prefix_r = ResKind() );
00128
00129 public:
00131 static const Capability Null;
00132
00134 static const Capability Empty;
00135
00136 public:
00137 #ifndef SWIG // Swig treats it as syntax error
00138
00139 using base::SafeBool<Capability>::operator bool_type;
00140 #endif
00141
00144 bool empty() const
00145 { return( _id == sat::detail::emptyId || _id == sat::detail::noId ); }
00146
00147 public:
00149 const char * c_str() const;
00150
00152 std::string asString() const
00153 { return c_str(); }
00154
00155 public:
00157 CapDetail detail() const;
00158
00159 public:
00170 static CapMatch matches( const Capability & lhs, const Capability & rhs ) { return _doMatch( lhs.id(), rhs.id() ); }
00171 static CapMatch matches( const Capability & lhs, const IdString & rhs ) { return _doMatch( lhs.id(), rhs.id() ); }
00172 static CapMatch matches( const Capability & lhs, const std::string & rhs ) { return _doMatch( lhs.id(), Capability(rhs).id() ); }
00173 static CapMatch matches( const Capability & lhs, const char * rhs ) { return _doMatch( lhs.id(), Capability(rhs).id() );}
00174
00175 static CapMatch matches( const IdString & lhs, const Capability & rhs ) { return _doMatch( lhs.id(), rhs.id() ); }
00176 static CapMatch matches( const IdString & lhs, const IdString & rhs ) { return _doMatch( lhs.id(), rhs.id() ); }
00177 static CapMatch matches( const IdString & lhs, const std::string & rhs ) { return _doMatch( lhs.id(), Capability(rhs).id() ); }
00178 static CapMatch matches( const IdString & lhs, const char * rhs ) { return _doMatch( lhs.id(), Capability(rhs).id() ); }
00179
00180 static CapMatch matches( const std::string & lhs, const Capability & rhs ) { return _doMatch( Capability(lhs).id(), rhs.id() );}
00181 static CapMatch matches( const std::string & lhs, const IdString & rhs ) { return _doMatch( Capability(lhs).id(), rhs.id() ); }
00182 static CapMatch matches( const std::string & lhs, const std::string & rhs ) { return _doMatch( Capability(lhs).id(), Capability(rhs).id() ); }
00183 static CapMatch matches( const std::string & lhs, const char * rhs ) { return _doMatch( Capability(lhs).id(), Capability(rhs).id() ); }
00184
00185 static CapMatch matches( const char * lhs, const Capability & rhs ) { return _doMatch( Capability(lhs).id(), rhs.id() );}
00186 static CapMatch matches( const char * lhs, const IdString & rhs ) { return _doMatch( Capability(lhs).id(), rhs.id() ); }
00187 static CapMatch matches( const char * lhs, const std::string & rhs ) { return _doMatch( Capability(lhs).id(), Capability(rhs).id() ); }
00188 static CapMatch matches( const char * lhs, const char * rhs ) { return _doMatch( Capability(lhs).id(), Capability(rhs).id() ); }
00189
00190 CapMatch matches( const Capability & rhs ) const { return _doMatch( id(), rhs.id() ); }
00191 CapMatch matches( const IdString & rhs ) const { return _doMatch( id(), rhs.id() ); }
00192 CapMatch matches( const std::string & rhs ) const { return _doMatch( id(), Capability(rhs).id() ); }
00193 CapMatch matches( const char * rhs ) const { return _doMatch( id(), Capability(rhs).id() ); }
00195
00198 struct Matches: public std::binary_function<Capability,Capability,CapMatch>
00199 {
00200 CapMatch operator()( const Capability & lhs, const Capability & rhs ) const
00201 { return Capability::matches( lhs, rhs ); }
00202 };
00203
00204 public:
00210 static bool isInterestingFileSpec( const IdString & name_r ) { return isInterestingFileSpec( name_r.c_str() ); }
00211 static bool isInterestingFileSpec( const std::string & name_r ) { return isInterestingFileSpec( name_r.c_str() ); }
00212 static bool isInterestingFileSpec( const char * name_r );
00213
00238 static Capability guessPackageSpec( const std::string & str_r );
00243 static Capability guessPackageSpec( const std::string & str_r, bool & rewrote_r );
00244
00245 public:
00247 sat::detail::IdType id() const
00248 { return _id; }
00249 private:
00251 static CapMatch _doMatch( sat::detail::IdType lhs, sat::detail::IdType rhs );
00252 private:
00253 #ifndef SWIG // Swig treats it as syntax error
00254 friend base::SafeBool<Capability>::operator bool_type() const;
00255 #endif
00256 bool boolTest() const { return ! empty(); }
00257 private:
00258 sat::detail::IdType _id;
00259 };
00261
00263 std::ostream & operator<<( std::ostream & str, const Capability & obj );
00264
00266 std::ostream & dumpOn( std::ostream & str, const Capability & obj );
00267
00269 inline bool operator==( const Capability & lhs, const Capability & rhs )
00270 { return lhs.id() == rhs.id(); }
00271
00273 inline bool operator!=( const Capability & lhs, const Capability & rhs )
00274 { return lhs.id() != rhs.id(); }
00275
00277 inline bool operator<( const Capability & lhs, const Capability & rhs )
00278 { return lhs.id() < rhs.id(); }
00279
00281
00282
00283
00297 class CapDetail: protected sat::detail::PoolMember
00298 {
00299 public:
00300 enum Kind
00301 {
00302 NOCAP = 0x00,
00303 NAMED = 0x01,
00304 VERSIONED = 0x02,
00305 EXPRESSION = 0x04
00306 };
00307
00311 enum CapRel
00312 {
00313 REL_NONE = 0,
00314 CAP_AND = 16,
00315 CAP_OR = 17,
00316 CAP_WITH = 18,
00317 CAP_NAMESPACE = 19,
00318 CAP_ARCH = 20
00319 };
00320
00321 public:
00322 CapDetail()
00323 : _kind( NOCAP ), _lhs( 0 ), _rhs( 0 ), _flag( 0 ), _archIfSimple( 0 )
00324 {}
00325 explicit CapDetail( const Capability & cap_r )
00326 : _kind( NOCAP ), _lhs( cap_r.id() ), _rhs( 0 ), _flag( 0 ), _archIfSimple( 0 )
00327 { _init(); }
00328 explicit CapDetail( sat::detail::IdType id_r )
00329 : _kind( NOCAP ), _lhs( id_r ), _rhs( 0 ), _flag( 0 ), _archIfSimple( 0 )
00330 { _init(); }
00331
00332 public:
00333 Kind kind() const { return _kind; }
00334 bool isNull() const { return _kind == NOCAP; }
00335 bool isNamed() const { return _kind == NAMED; }
00336 bool isVersioned() const { return _kind == VERSIONED; }
00337 bool isSimple() const { return _kind & (NAMED|VERSIONED); }
00338 bool isExpression() const { return _kind == EXPRESSION; }
00339
00342 bool hasArch() const { return _archIfSimple; }
00343 IdString arch() const { return _archIfSimple ? IdString( _archIfSimple ) : IdString(); }
00344 IdString name() const { return isSimple() ? IdString( _lhs ) : IdString(); }
00345 Rel op() const { return isVersioned() ? Rel( _flag ) : Rel::ANY; }
00346 Edition ed() const { return isVersioned() ? Edition( _rhs ) : Edition(); }
00348
00351 Capability lhs() const { return isExpression() ? Capability( _lhs ) : Capability::Null; }
00352 CapRel capRel() const { return isExpression() ? CapRel(_flag) : REL_NONE; }
00353 Capability rhs() const { return isExpression() ? Capability( _rhs ) : Capability::Null; }
00355
00356 private:
00357 void _init();
00358 private:
00359 Kind _kind;
00360 sat::detail::IdType _lhs;
00361 sat::detail::IdType _rhs;
00362 unsigned _flag;
00363 sat::detail::IdType _archIfSimple;
00364 };
00366
00368 std::ostream & operator<<( std::ostream & str, const CapDetail & obj );
00369
00371 std::ostream & operator<<( std::ostream & str, CapDetail::Kind obj );
00372
00374 std::ostream & operator<<( std::ostream & str, CapDetail::CapRel obj );
00375
00377
00378 inline CapDetail Capability::detail() const { return CapDetail( _id ); }
00379
00381 }
00383
00384 ZYPP_DEFINE_ID_HASHABLE( ::zypp::Capability );
00385
00386 #endif // ZYPP_CAPABILITY_H