libzypp  12.16.5
Solvable.h
Go to the documentation of this file.
1 /*---------------------------------------------------------------------\
2 | ____ _ __ __ ___ |
3 | |__ / \ / / . \ . \ |
4 | / / \ V /| _/ _/ |
5 | / /__ | | | | | | |
6 | /_____||_| |_| |_| |
7 | |
8 \---------------------------------------------------------------------*/
12 #ifndef ZYPP_SAT_SOLVABLE_H
13 #define ZYPP_SAT_SOLVABLE_H
14 
15 #include <iosfwd>
16 
17 #include "zypp/base/SafeBool.h"
18 
20 #include "zypp/sat/SolvAttr.h"
21 #include "zypp/ResTraits.h"
22 #include "zypp/IdString.h"
23 #include "zypp/Edition.h"
24 #include "zypp/Arch.h"
25 #include "zypp/Dep.h"
26 #include "zypp/Capabilities.h"
27 #include "zypp/Capability.h"
28 #include "zypp/Locale.h"
29 
31 namespace zypp
32 {
33 
34  class CheckSum;
35  class OnMediaLocation;
36 
38  namespace sat
39  {
40 
42  //
43  // CLASS NAME : Solvable
44  //
57  class Solvable : protected detail::PoolMember,
58  private base::SafeBool<Solvable>
59  {
60  public:
62 
63  public:
66  : _id( detail::noSolvableId ) {}
67 
69  explicit Solvable( IdType id_r )
70  : _id( id_r ) {}
71 
72  public:
74  static const Solvable noSolvable;
75 
76 #ifndef SWIG // Swig treats it as syntax error
77 
79 #endif
80 
84  bool isSystem() const;
85 
91  bool onSystemByUser() const;
92 
94  Repository repository() const;
95 
96  public:
97 
107  std::string lookupStrAttribute( const SolvAttr & attr ) const;
118  std::string lookupStrAttribute( const SolvAttr & attr, const Locale & lang_r ) const;
119 
124  unsigned long long lookupNumAttribute( const SolvAttr & attr ) const;
125 
130  bool lookupBoolAttribute( const SolvAttr & attr ) const;
131 
137 
143 
149 
151  public:
156  IdString ident() const;
157 
158  ResKind kind() const;
163  bool isKind( const ResKind & kind_r ) const;
165  template<class _Res>
166  bool isKind() const
167  { return isKind( resKind<_Res>() ); }
169  template<class _Iterator>
170  bool isKind( _Iterator begin, _Iterator end )
171  { for_( it, begin, end ) if ( isKind( *it ) ) return true; return false; }
172 
173  std::string name() const;
174  Edition edition() const;
175  Arch arch() const;
176 
177  IdString vendor() const;
178 
182  bool multiversionInstall() const;
183 
191  std::string asString() const;
192 
196  bool identical( Solvable rhs ) const;
197 
199  bool sameNVRA( Solvable rhs ) const
200  { return( ident() == rhs.ident() && edition() == rhs.edition() && arch() == rhs.arch() ); }
201 
202  public:
203 
209  Capabilities operator[]( Dep which_r ) const;
210 
211  Capabilities provides() const;
212  Capabilities requires() const;
213  Capabilities conflicts() const;
214  Capabilities obsoletes() const;
215  Capabilities recommends() const;
216  Capabilities suggests() const;
217  Capabilities enhances() const;
218  Capabilities supplements() const;
219  Capabilities prerequires() const;
220 
222  CapabilitySet providesNamespace( const std::string & namespace_r ) const;
223 
231  CapabilitySet valuesOfNamespace( const std::string & namespace_r ) const;
233 
234  public:
238  bool supportsLocales() const;
240  bool supportsLocale( const Locale & locale_r ) const;
242  bool supportsLocale( const LocaleSet & locales_r ) const;
246  bool supportsRequestedLocales() const;
248  void getSupportedLocales( LocaleSet & locales_r ) const;
251  { LocaleSet ret; getSupportedLocales( ret ); return ret; }
253 
254  public:
256  Solvable nextInPool() const;
258  Solvable nextInRepo() const;
259 
266  {
267  public:
269  SplitIdent( IdString ident_r );
270  SplitIdent( const char * ident_r );
271  SplitIdent( const std::string & ident_r );
272  SplitIdent( ResKind kind_r, IdString name_r );
273  SplitIdent( ResKind kind_r, const C_Str & name_r );
274 
275  IdString ident() const { return _ident; }
276  ResKind kind() const { return _kind; }
277  IdString name() const { return _name; }
278 
283  static ResKind explicitKind( IdString ident_r ) { return explicitKind( ident_r.c_str() ); }
284  static ResKind explicitKind( const char * ident_r );
285  static ResKind explicitKind( const std::string & ident_r ) { return explicitKind( ident_r.c_str() ); }
286 
287  private:
291  };
292 
293  public:
295  ::_Solvable * get() const;
297  IdType id() const { return _id; }
298  private:
299 #ifndef SWIG // Swig treats it as syntax error
301 #endif
302  bool boolTest() const { return get(); }
303  private:
305  };
307 
309  std::ostream & operator<<( std::ostream & str, const Solvable & obj );
310 
312  std::ostream & dumpOn( std::ostream & str, const Solvable & obj );
313 
315  inline bool operator==( const Solvable & lhs, const Solvable & rhs )
316  { return lhs.get() == rhs.get(); }
317 
319  inline bool operator!=( const Solvable & lhs, const Solvable & rhs )
320  { return lhs.get() != rhs.get(); }
321 
323  inline bool operator<( const Solvable & lhs, const Solvable & rhs )
324  { return lhs.get() < rhs.get(); }
325 
327  inline bool identical( Solvable lhs, Solvable rhs )
328  { return lhs.identical( rhs ); }
329 
331  inline bool sameNVRA( Solvable lhs, Solvable rhs )
332  { return lhs.sameNVRA( rhs ); }
333 
335  namespace detail
336  {
337 
338  //
339  // CLASS NAME : SolvableIterator
340  //
342  class SolvableIterator : public boost::iterator_adaptor<
343  SolvableIterator // Derived
344  , ::_Solvable* // Base
345  , const Solvable // Value
346  , boost::forward_traversal_tag // CategoryOrTraversal
347  , const Solvable // Reference
348  >
349  {
350  public:
352  : SolvableIterator::iterator_adaptor_( 0 )
353  {}
354 
355  explicit SolvableIterator( const Solvable & val_r )
356  : SolvableIterator::iterator_adaptor_( 0 )
357  { assignVal( val_r ); }
358 
360  : SolvableIterator::iterator_adaptor_( 0 )
361  { assignVal( Solvable( id_r ) ); }
362 
363  private:
365 
367  { return _val; }
368 
369  void increment()
370  { assignVal( _val.nextInPool() ); }
371 
372  private:
373  void assignVal( const Solvable & val_r )
374  { _val = val_r; base_reference() = _val.get(); }
375 
377  };
380  } // namespace detail
382 
384  } // namespace sat
386 
388  template<class _Res>
389  inline bool isKind( const sat::Solvable & solvable_r )
390  { return solvable_r.isKind( ResTraits<_Res>::kind ); }
391 
392  class PoolItem;
394  namespace sat
395  {
396 
400  struct asSolvable
401  {
403 
404  Solvable operator()( Solvable solv_r ) const
405  { return solv_r; }
406 
407  Solvable operator()( const PoolItem & pi_r ) const;
408 
409  Solvable operator()( const ResObject_constPtr & res_r ) const;
410  };
412  } // namespace sat
414 
416 } // namespace zypp
418 
420 
421 #endif // ZYPP_SAT_SOLVABLE_H