libzypp  17.38.7
Capability.h
Go to the documentation of this file.
1 /*---------------------------------------------------------------------\
2 | ____ _ __ __ ___ |
3 | |__ / \ / / . \ . \ |
4 | / / \ V /| _/ _/ |
5 | / /__ | | | | | | |
6 | /_____||_| |_| |_| |
7 | |
8 \---------------------------------------------------------------------*/
12 #ifndef ZYPP_CAPABILITY_H
13 #define ZYPP_CAPABILITY_H
14 
15 #include <iosfwd>
16 
17 #include <zypp-core/Globals.h>
19 
20 #include <zypp/IdString.h>
21 #include <zypp/Edition.h>
22 #include <zypp/Rel.h>
23 #include <zypp/ResTraits.h>
24 #include <zypp/ResolverNamespace.h>
25 #include <zypp/CapMatch.h>
26 
28 namespace zypp
29 {
30 
31  class Capability;
32  class CapDetail;
33  class Arch;
34 
35  using CapabilitySet = std::unordered_set<Capability>;
36 
38  //
39  // CLASS NAME : Capability
40  //
63  {
64  public:
65  enum CtorFlag { PARSED, UNPARSED };
66 
67  public:
69  Capability() : _id( sat::detail::emptyId ) {}
70 
72  explicit Capability( sat::detail::IdType id_r ) : _id( id_r ) {}
73 
89  explicit Capability( const char * str_r, const ResKind & prefix_r = ResKind(), CtorFlag flag_r = UNPARSED );
91  explicit Capability( const std::string & str_r, const ResKind & prefix_r = ResKind(), CtorFlag flag_r = UNPARSED );
93  Capability( const Arch & arch_r, const char * str_r, const ResKind & prefix_r = ResKind(), CtorFlag flag_r = UNPARSED );
95  Capability( const Arch & arch_r, const std::string & str_r, const ResKind & prefix_r = ResKind(), CtorFlag flag_r = UNPARSED );
96 
98  Capability( const char * str_r, CtorFlag flag_r, const ResKind & prefix_r = ResKind() );
100  Capability( const std::string & str_r, CtorFlag flag_r, const ResKind & prefix_r = ResKind() );
102  Capability( const Arch & arch_r, const char * str_r, CtorFlag flag_r, const ResKind & prefix_r = ResKind() );
104  Capability( const Arch & arch_r, const std::string & str_r, CtorFlag flag_r, const ResKind & prefix_r = ResKind() );
106 
107 
112  Capability( const std::string & name_r, const std::string & op_r, const std::string & ed_r, const ResKind & prefix_r = ResKind() );
114  Capability( const std::string & name_r, Rel op_r, const std::string & ed_r, const ResKind & prefix_r = ResKind() );
116  Capability( const std::string & name_r, Rel op_r, const Edition & ed_r, const ResKind & prefix_r = ResKind() );
118 
123  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() );
125  Capability( const std::string & arch_r, const std::string & name_r, Rel op_r, const std::string & ed_r, const ResKind & prefix_r = ResKind() );
127  Capability( const std::string & arch_r, const std::string & name_r, Rel op_r, const Edition & ed_r, const ResKind & prefix_r = ResKind() );
129  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() );
131  Capability( const Arch & arch_r, const std::string & name_r, Rel op_r, const std::string & ed_r, const ResKind & prefix_r = ResKind() );
133  Capability( const Arch & arch_r, const std::string & name_r, Rel op_r, const Edition & ed_r, const ResKind & prefix_r = ResKind() );
135 
141  Capability( ResolverNamespace namespace_r, IdString value_r = IdString::Null );
142  Capability( ResolverNamespace namespace_r, const char * value_r ) : Capability( namespace_r, IdString(value_r) ) {}
143  Capability( ResolverNamespace namespace_r, const std::string & value_r ) : Capability( namespace_r, IdString(value_r) ) {}
145 
151  enum CapRel
152  {
153  CAP_AND = 16,
154  CAP_OR = 17,
155 
156  CAP_COND = 22,
157  CAP_UNLESS = 29,
158  CAP_ELSE = 26,
159 
160  CAP_WITH = 18,
161  CAP_WITHOUT = 28,
162 
163  CAP_NAMESPACE = 19,
164  CAP_ARCH = 20,
165  };
166 
167  Capability( CapRel rel_r, const Capability & lhs_r, const Capability & rhs_r );
169 
170  public:
172  static const Capability Null;
173 
175  static const Capability Empty;
176 
177  public:
179  explicit operator bool() const
180  { return ! empty(); }
181 
185  bool empty() const
186  { return( _id == sat::detail::emptyId || _id == sat::detail::noId ); }
187 
188  public:
190  const char * c_str() const;
191 
193  std::string asString() const
194  { return c_str(); }
195 
196  public:
198  CapDetail detail() const;
199 
200  public:
211  static CapMatch matches( const Capability & lhs, const Capability & rhs ) { return _doMatch( lhs.id(), rhs.id() ); }
212  static CapMatch matches( const Capability & lhs, const IdString & rhs ) { return _doMatch( lhs.id(), rhs.id() ); }
213  static CapMatch matches( const Capability & lhs, const std::string & rhs ) { return _doMatch( lhs.id(), Capability(rhs).id() ); }
214  static CapMatch matches( const Capability & lhs, const char * rhs ) { return _doMatch( lhs.id(), Capability(rhs).id() );}
215 
216  static CapMatch matches( const IdString & lhs, const Capability & rhs ) { return _doMatch( lhs.id(), rhs.id() ); }
217  static CapMatch matches( const IdString & lhs, const IdString & rhs ) { return _doMatch( lhs.id(), rhs.id() ); }
218  static CapMatch matches( const IdString & lhs, const std::string & rhs ) { return _doMatch( lhs.id(), Capability(rhs).id() ); }
219  static CapMatch matches( const IdString & lhs, const char * rhs ) { return _doMatch( lhs.id(), Capability(rhs).id() ); }
220 
221  static CapMatch matches( const std::string & lhs, const Capability & rhs ) { return _doMatch( Capability(lhs).id(), rhs.id() );}
222  static CapMatch matches( const std::string & lhs, const IdString & rhs ) { return _doMatch( Capability(lhs).id(), rhs.id() ); }
223  static CapMatch matches( const std::string & lhs, const std::string & rhs ) { return _doMatch( Capability(lhs).id(), Capability(rhs).id() ); }
224  static CapMatch matches( const std::string & lhs, const char * rhs ) { return _doMatch( Capability(lhs).id(), Capability(rhs).id() ); }
225 
226  static CapMatch matches( const char * lhs, const Capability & rhs ) { return _doMatch( Capability(lhs).id(), rhs.id() );}
227  static CapMatch matches( const char * lhs, const IdString & rhs ) { return _doMatch( Capability(lhs).id(), rhs.id() ); }
228  static CapMatch matches( const char * lhs, const std::string & rhs ) { return _doMatch( Capability(lhs).id(), Capability(rhs).id() ); }
229  static CapMatch matches( const char * lhs, const char * rhs ) { return _doMatch( Capability(lhs).id(), Capability(rhs).id() ); }
230 
231  CapMatch matches( const Capability & rhs ) const { return _doMatch( id(), rhs.id() ); }
232  CapMatch matches( const IdString & rhs ) const { return _doMatch( id(), rhs.id() ); }
233  CapMatch matches( const std::string & rhs ) const { return _doMatch( id(), Capability(rhs).id() ); }
234  CapMatch matches( const char * rhs ) const { return _doMatch( id(), Capability(rhs).id() ); }
236 
239  struct Matches
240  {
241  CapMatch operator()( const Capability & lhs, const Capability & rhs ) const
242  { return Capability::matches( lhs, rhs ); }
243  };
244 
245  public:
251  static bool isInterestingFileSpec( const IdString & name_r ) { return isInterestingFileSpec( name_r.c_str() ); }
252  static bool isInterestingFileSpec( const std::string & name_r ) { return isInterestingFileSpec( name_r.c_str() ); }
253  static bool isInterestingFileSpec( const char * name_r );
254 
255 
280  static Capability guessPackageSpec( const std::string & str_r );
285  static Capability guessPackageSpec( const std::string & str_r, bool & rewrote_r );
286 
287  public:
290  { return _id; }
291  private:
293  static CapMatch _doMatch( sat::detail::IdType lhs, sat::detail::IdType rhs );
294  private:
296  };
298 
300  std::ostream & operator<<( std::ostream & str, const Capability & obj ) ZYPP_API;
301 
303  std::ostream & dumpOn( std::ostream & str, const Capability & obj ) ZYPP_API;
304 
306  std::ostream & operator<<( std::ostream & str, Capability::CapRel obj ) ZYPP_API;
307 
309  inline bool operator==( const Capability & lhs, const Capability & rhs )
310  { return lhs.id() == rhs.id(); }
311 
313  inline bool operator!=( const Capability & lhs, const Capability & rhs )
314  { return lhs.id() != rhs.id(); }
315 
317  inline bool operator<( const Capability & lhs, const Capability & rhs )
318  { return lhs.id() < rhs.id(); }
319 
332  {
334  : _cap { cap_r }
335  {}
336  private:
337  friend std::ostream & operator<<( std::ostream & str, const dumpCap & obj );
338  std::ostream & dumpOn( std::ostream & str ) const;
339  private:
340  std::ostream & _dumpRec( std::ostream & str, Capability cap_r, std::string lvl_r="" ) const;
342  };
344  inline std::ostream & operator<<( std::ostream & str, const dumpCap & obj )
345  { return obj.dumpOn( str ); }
346 
348  //
349  // CLASS NAME : CapDetail
350  //
366  {
367  public:
368  enum Kind
369  {
370  NOCAP = 0x00,
371  NAMED = 0x01,
372  VERSIONED = 0x02,
373  EXPRESSION = 0x04
374  };
375 
379  enum CapRel
380  {
381  REL_NONE = 0,
384 
385  CAP_COND = Capability::CAP_COND,
386  CAP_UNLESS = Capability::CAP_UNLESS,
387  CAP_ELSE = Capability::CAP_ELSE,
388 
389  CAP_WITH = Capability::CAP_WITH,
390  CAP_WITHOUT = Capability::CAP_WITHOUT,
391 
392  CAP_NAMESPACE = Capability::CAP_NAMESPACE,
393  CAP_ARCH = Capability::CAP_ARCH,
394  };
395 
396  public:
398  : _kind( NOCAP ), _lhs( 0 ), _rhs( 0 ), _flag( 0 ), _archIfSimple( 0 )
399  {}
400  explicit CapDetail( const Capability & cap_r )
401  : _kind( NOCAP ), _lhs( cap_r.id() ), _rhs( 0 ), _flag( 0 ), _archIfSimple( 0 )
402  { _init(); }
404  : _kind( NOCAP ), _lhs( id_r ), _rhs( 0 ), _flag( 0 ), _archIfSimple( 0 )
405  { _init(); }
406 
407  public:
408  Kind kind() const { return _kind; }
409  bool isNull() const { return _kind == NOCAP; }
410  bool isNamed() const { return _kind == NAMED; }
411  bool isVersioned() const { return _kind == VERSIONED; }
412  bool isSimple() const { return _kind & (NAMED|VERSIONED); }
413  bool isExpression() const { return _kind == EXPRESSION; }
414 
417  bool hasArch() const { return _archIfSimple; }
418  IdString arch() const { return _archIfSimple ? IdString( _archIfSimple ) : IdString(); }
419  IdString name() const { return isSimple() ? IdString( _lhs ) : IdString(); }
420  Rel op() const { return isVersioned() ? Rel( _flag ) : isSimple() ? Rel::ANY : Rel::NONE; }
421  Edition ed() const { return isVersioned() ? Edition( _rhs ) : Edition(); }
423 
426  Capability lhs() const { return isExpression() ? Capability( _lhs ) : Capability::Null; }
427  CapRel capRel() const { return isExpression() ? CapRel(_flag) : REL_NONE; }
428  Capability rhs() const { return isExpression() ? Capability( _rhs ) : Capability::Null; }
430 
431  private:
432  void _init();
433  private:
437  unsigned _flag;
439  };
441 
443  std::ostream & operator<<( std::ostream & str, const CapDetail & obj ) ZYPP_API;
444 
446  std::ostream & operator<<( std::ostream & str, CapDetail::Kind obj ) ZYPP_API;
447 
449  std::ostream & operator<<( std::ostream & str, CapDetail::CapRel obj ) ZYPP_API;
450 
452 
453  inline CapDetail Capability::detail() const { return CapDetail( _id ); }
454 
456 } // namespace zypp
458 
460 
461 #endif // ZYPP_CAPABILITY_H
static CapMatch matches(const IdString &lhs, const std::string &rhs)
Definition: Capability.h:218
CapRel capRel() const
Definition: Capability.h:427
bool isVersioned() const
Definition: Capability.h:411
bool operator==(const Capability &lhs, const Capability &rhs)
relates: Capability
Definition: Capability.h:309
Capability lhs() const
Definition: Capability.h:426
std::ostream & dumpOn(std::ostream &str) const
Definition: Capability.cc:611
CapMatch matches(const Capability &rhs) const
Definition: Capability.h:231
CapMatch operator()(const Capability &lhs, const Capability &rhs) const
Definition: Capability.h:241
Edition ed() const
Definition: Capability.h:421
ZYPP_DEFINE_ID_HASHABLE(::zypp::Capability)
Helper providing more detailed information about a Capability.
Definition: Capability.h:365
static CapMatch matches(const std::string &lhs, const char *rhs)
Definition: Capability.h:224
static CapMatch matches(const Capability &lhs, const std::string &rhs)
Definition: Capability.h:213
Architecture.
Definition: Arch.h:36
static CapMatch matches(const IdString &lhs, const char *rhs)
Definition: Capability.h:219
Relational operators.
Definition: Rel.h:45
IdType id() const
Expert backdoor.
Definition: IdString.h:144
CapDetail(sat::detail::IdType id_r)
Definition: Capability.h:403
bool isNull() const
Definition: Capability.h:409
bool isNamed() const
Definition: Capability.h:410
static CapMatch matches(const Capability &lhs, const char *rhs)
Definition: Capability.h:214
static CapMatch matches(const char *lhs, const IdString &rhs)
Definition: Capability.h:227
Capability(sat::detail::IdType id_r)
Ctor from id.
Definition: Capability.h:72
String related utilities and Regular expression matching.
CapRel
Enum values correspond with libsolv defines.
Definition: Capability.h:151
int IdType
Generic Id type.
Definition: PoolDefines.h:42
Capability _cap
Definition: PoolQuery.cc:161
Access to the sat-pools string space.
Definition: IdString.h:51
Rel op() const
Definition: Capability.h:420
Edition represents [epoch:]version[-release]
Definition: Edition.h:59
static const Rel ANY
Definition: Rel.h:58
relates: Capability IOManip to dump a complex Capability as tree.
Definition: Capability.h:331
static bool isInterestingFileSpec(const IdString &name_r)
Test for a filename that is likely being REQUIRED.
Definition: Capability.h:251
IdString arch() const
Definition: Capability.h:418
dumpCap(Capability cap_r)
Definition: Capability.h:333
bool isExpression() const
Definition: Capability.h:413
sat::detail::IdType id() const
Expert backdoor.
Definition: Capability.h:289
ResolverNamespace
The resolver&#39;s dependency namespaces.
static bool isInterestingFileSpec(const std::string &name_r)
Definition: Capability.h:252
Backlink to the associated PoolImpl.
Definition: PoolMember.h:52
static const IdType emptyId(1)
static CapMatch matches(const char *lhs, const std::string &rhs)
Definition: Capability.h:228
Capability _cap
Definition: Capability.h:341
const Arch Arch_empty ZYPP_API
relates: Arch This is an empty Arch represented by an empty string.
Definition: Arch.h:173
Used internally.
Definition: Capability.h:164
Provides API related macros.
bool operator!=(const Capability &lhs, const Capability &rhs)
relates: Capability
Definition: Capability.h:313
static CapMatch matches(const Capability &lhs, const IdString &rhs)
Definition: Capability.h:212
static CapMatch matches(const char *lhs, const char *rhs)
Definition: Capability.h:229
static CapMatch matches(const IdString &lhs, const Capability &rhs)
Definition: Capability.h:216
CapDetail(const Capability &cap_r)
Definition: Capability.h:400
CapMatch matches(const std::string &rhs) const
Definition: Capability.h:233
std::ostream & dumpOn(std::ostream &str, const Capability &obj)
relates: Capability Detailed stream output
Definition: Capability.cc:589
const char * c_str() const
Conversion to const char *
Definition: IdString.cc:51
Tri state Capability match result.
Definition: CapMatch.h:38
static const Capability Null
No or Null Capability ( Id 0 ).
Definition: Capability.h:172
Kind kind() const
Definition: Capability.h:408
matches functor.
Definition: Capability.h:239
std::unordered_set< Capability > CapabilitySet
Definition: Capability.h:35
sat::detail::IdType _lhs
Definition: Capability.h:435
static CapMatch matches(const char *lhs, const Capability &rhs)
Definition: Capability.h:226
sat::detail::IdType _archIfSimple
Definition: Capability.h:438
A sat capability.
Definition: Capability.h:62
unsigned _flag
Definition: Capability.h:437
static const IdString Null
No or Null string ( Id 0 ).
Definition: IdString.h:86
static const IdType noId(0)
static CapMatch matches(const std::string &lhs, const Capability &rhs)
Definition: Capability.h:221
bool operator<(const Capability &lhs, const Capability &rhs)
relates: Capability Arbitrary order.
Definition: Capability.h:317
CapMatch matches(const IdString &rhs) const
Definition: Capability.h:232
sat::detail::IdType _id
Definition: Capability.h:295
static const Capability Empty
Empty Capability.
Definition: Capability.h:175
Capability()
Default ctor, Empty capability.
Definition: Capability.h:69
Capability(ResolverNamespace namespace_r, const char *value_r)
Definition: Capability.h:142
static CapMatch matches(const IdString &lhs, const IdString &rhs)
Definition: Capability.h:217
sat::detail::IdType _rhs
Definition: Capability.h:436
CapRel
Enum values corresponding with libsolv defines.
Definition: Capability.h:379
std::ostream & operator<<(std::ostream &str, const Capabilities &obj)
relates: Capabilities Stream output
Definition: Capabilities.cc:65
Capability rhs() const
Definition: Capability.h:428
CapDetail detail() const
Helper providing more detailed information about a Capability.
Definition: Capability.h:453
bool hasArch() const
Definition: Capability.h:417
std::string asString() const
Definition: Capability.h:193
Resolvable kinds.
Definition: ResKind.h:32
Easy-to use interface to the ZYPP dependency resolver.
Definition: CodePitfalls.doc:1
Capability(ResolverNamespace namespace_r, const std::string &value_r)
Definition: Capability.h:143
bool empty() const
Whether the Capability is empty.
Definition: Capability.h:185
IdString name() const
Definition: Capability.h:419
zypp::IdString IdString
Definition: idstring.h:16
bool isSimple() const
Definition: Capability.h:412
static CapMatch matches(const std::string &lhs, const IdString &rhs)
Definition: Capability.h:222
static CapMatch matches(const Capability &lhs, const Capability &rhs)
Definition: Capability.h:211
CapMatch matches(const char *rhs) const
Definition: Capability.h:234
static const Rel NONE
Definition: Rel.h:59
static CapMatch matches(const std::string &lhs, const std::string &rhs)
Definition: Capability.h:223