libzypp  17.38.7
SolvIterMixin.h
Go to the documentation of this file.
1 /*---------------------------------------------------------------------\
2 | ____ _ __ __ ___ |
3 | |__ / \ / / . \ . \ |
4 | / / \ V /| _/ _/ |
5 | / /__ | | | | | | |
6 | /_____||_| |_| |_| |
7 | |
8 \---------------------------------------------------------------------*/
12 #ifndef ZYPP_SAT_SOLVITERMIXIN_H
13 #define ZYPP_SAT_SOLVITERMIXIN_H
14 
15 #include <iosfwd>
16 
19 #include <zypp-core/base/Hash.h>
20 
21 #include <zypp/sat/Solvable.h>
22 #include <zypp/PoolItem.h>
23 #include <zypp/ui/Selectable.h>
24 
26 namespace zypp
27 {
28 
30  namespace sat
31  {
32 
33  class Solvable;
34  //class asSolvable; // transform functor
35 
36  namespace solvitermixin_detail
37  {
45  {
46  bool operator()( const Solvable & solv_r ) const;
47 
48  using Umap = std::unordered_map<sat::detail::IdType,sat::detail::SolvableIdType>;
50  : _umap( new Umap )
51  {}
52  shared_ptr<Umap> _umap;
53  };
54 
55 #if LEGACY(1735)
56  // Keep legacy version to stay binary compatible.
57  // Recompiled code will use UnifyByIdent2.
58  struct ZYPP_API UnifyByIdent
59  {
60  bool operator()( const Solvable & solv_r ) const;
61 
62  using Uset = std::unordered_set<unsigned int>;
63  UnifyByIdent()
64  : _uset( new Uset )
65  {}
66  shared_ptr<Uset> _uset;
67  };
68 #endif
69  } // namespace solvitermixin_detail
70 
71 
73  //
74  // CLASS NAME : SolvIterMixin<Derived,DerivedSolvable_iterator>
75  //
129  template <class Derived,class DerivedSolvable_iterator>
131  {
132  public:
133  using size_type = size_t;
134 
135  public:
142  bool empty() const
143  { return( self().begin() == self().end() ); }
144 
146  size_type size() const
147  { size_type s = 0; for_( it, self().begin(), self().end() ) ++s; return s;}
148 
150  template<class TSolv>
151  bool contains( const TSolv & solv_r ) const
152  {
153  Solvable solv( asSolvable()( solv_r ) );
154  for_( it, self().begin(), self().end() )
155  if ( *it == solv )
156  return true;
157  return false;
158  }
160 
161  public:
164  using Solvable_iterator = DerivedSolvable_iterator;
166  { return self().begin(); }
168  { return self().end(); }
170  { return makeIterable( solvableBegin(), solvableEnd() ); }
172 
175  using PoolItem_iterator = transform_iterator<asPoolItem, Solvable_iterator>;
177  { return make_transform_iterator( solvableBegin(), asPoolItem() ); }
179  { return make_transform_iterator( solvableEnd(), asPoolItem() ); }
181  { return makeIterable( poolItemBegin(), poolItemEnd() ); }
183 
184  private:
185  using UnifiedSolvable_iterator = filter_iterator<solvitermixin_detail::UnifyByIdent2, Solvable_iterator>;
186  public:
189  using Selectable_iterator = transform_iterator<ui::asSelectable, UnifiedSolvable_iterator>;
191  { return make_transform_iterator( unifiedSolvableBegin(), ui::asSelectable() ); }
193  { return make_transform_iterator( unifiedSolvableEnd(), ui::asSelectable() ); }
195  { return makeIterable( selectableBegin(), selectableEnd() ); }
197 
198  private:
208  private:
209  const Derived & self() const
210  { return *static_cast<const Derived*>( this ); }
211  protected:
214  SolvIterMixin(const SolvIterMixin &) = default;
215  SolvIterMixin & operator=(const SolvIterMixin &) = default;
216  SolvIterMixin(SolvIterMixin &&) noexcept = default;
217  SolvIterMixin &operator=(SolvIterMixin &&) noexcept = default;
218  };
220 
222  } // namespace sat
225 } // namespace zypp
227 #endif // ZYPP_SAT_SOLVITERMIXIN_H
Selectable_iterator selectableBegin() const
std::unordered_map< sat::detail::IdType, sat::detail::SolvableIdType > Umap
Definition: SolvIterMixin.h:48
A Solvable object within the sat Pool.
Definition: Solvable.h:53
transform_iterator< ui::asSelectable, UnifiedSolvable_iterator > Selectable_iterator
transform_iterator< asPoolItem, Solvable_iterator > PoolItem_iterator
Iterable< TIterator > makeIterable(TIterator &&begin_r, TIterator &&end_r)
relates: Iterable convenient construction.
Definition: Iterable.h:88
Solvable_iterator solvableBegin() const
PoolItem_iterator poolItemBegin() const
Iterable< UnifiedSolvable_iterator > unifiedSolvable() const
#define for_(IT, BEG, END)
Convenient for-loops using iterator.
Definition: Easy.h:27
PoolItem_iterator poolItemEnd() const
SolvIterMixin & operator=(const SolvIterMixin &)=default
Base class providing common iterator types based on a Solvable iterator.
Iterable< Selectable_iterator > selectable() const
const Arch Arch_empty ZYPP_API
relates: Arch This is an empty Arch represented by an empty string.
Definition: Arch.h:173
UnifiedSolvable_iterator unifiedSolvableBegin() const
size_type size() const
Size of the collection.
Iterable< Solvable_iterator > solvable() const
Solvable_iterator solvableEnd() const
filter_iterator< solvitermixin_detail::UnifyByIdent2, Solvable_iterator > UnifiedSolvable_iterator
bool empty() const
Whether the collection is epmty.
FilterIterator< Pred, Base > make_filter_iterator(Pred p, Base it, Base end)
Helper function to deduce types and construct a FilterIterator.
Definition: iterators.h:116
UnifiedSolvable_iterator unifiedSolvableEnd() const
Selectable_iterator selectableEnd() const
Iterable< PoolItem_iterator > poolItem() const
To Solvable transform functor.
Definition: Solvable.h:597
Easy-to use interface to the ZYPP dependency resolver.
Definition: CodePitfalls.doc:1
Solvable to PoolItem transform functor.
Definition: PoolItem.h:203
Solvable to Selectable transform functor.
Definition: Selectable.h:586
bool contains(const TSolv &solv_r) const
Whether collection contains a specific Solvable.