libzypp  17.38.7
SetTracker.h
Go to the documentation of this file.
1 /*---------------------------------------------------------------------\
2 | ____ _ __ __ ___ |
3 | |__ / \ / / . \ . \ |
4 | / / \ V /| _/ _/ |
5 | / /__ | | | | | | |
6 | /_____||_| |_| |_| |
7 | |
8 \---------------------------------------------------------------------*/
11 #ifndef ZYPP_BASE_SETTRACKER_H
12 #define ZYPP_BASE_SETTRACKER_H
13 
14 #include <iosfwd>
15 #include <utility>
16 #include <algorithm>
17 #include <ostream>
18 
20 namespace zypp
21 {
23  namespace base
24  {
37  template <class TSet>
38  struct SetTracker
39  {
40  typedef TSet set_type;
41  typedef typename TSet::key_type key_type;
42  typedef typename TSet::value_type value_type;
43 
46  {}
47 
49  SetTracker( set_type initial_r )
50  : _current( std::move(initial_r) )
51  {}
52 
54 
55 
58  bool setInitial()
59  { _added.clear(); _removed.clear(); return false; }
60 
64  bool setInitial( set_type new_r )
65  {
66  setInitial();
67  bool changed = ( new_r != _current );
68  if ( changed )
69  {
70  _current = std::move(new_r);
71  }
72  return changed;
73  }
74 
75 
79  bool set( set_type new_r )
80  {
81  bool changed = ( new_r != _current );
82  if ( changed )
83  {
84  // build the initial (cur-add+rem) set in _current
86  _current.swap( _removed );
87  _added.clear();
88  _removed.clear();
89 
90  const set_type & initial( _current );
91  setDifference( initial, new_r, _removed );
92  setDifference( new_r, initial, _added );
93  _current.swap( new_r );
94  }
95  return changed;
96  }
97 
101  bool add( const value_type & val_r )
102  {
103  bool done = _current.insert( val_r ).second;
104  if ( done )
105  {
106  if ( ! _removed.erase( val_r ) )
107  _added.insert( val_r );
108  }
109  return done;
110  }
111 
115  bool remove( const value_type & val_r )
116  {
117  bool done = _current.erase( val_r );
118  if ( done )
119  {
120  if ( ! _added.erase( val_r ) )
121  _removed.insert( val_r );
122  }
123  return done;
124  }
126 
128 
129 
130  bool contains( const key_type & key_r ) const { return find( _current, key_r ); }
131 
133  bool wasAdded( const key_type & key_r ) const { return find( _added, key_r ); }
134 
136  bool wasRemoved( const key_type & key_r ) const { return find( _removed, key_r ); }
137 
138 
140  const set_type & current() const { return _current; }
141 
143  const set_type & added() const { return _added; }
144 
146  const set_type & removed() const { return _removed; }
148 
150 
151 
152  set_type & current() { return _current; }
153 
155  set_type & added() { return _added; }
156 
158  set_type & removed() { return _removed; }
160 
161  private:
162 
163  static bool find( const set_type & set_r, const key_type & key_r )
164  { return set_r.find( key_r ) != set_r.end(); }
165 
166  template <class TORDERED_SET, typename enable_if = typename TORDERED_SET::key_compare>
167  static void setDifference( const TORDERED_SET & lhs, const TORDERED_SET & rhs, TORDERED_SET & result_r )
168  {
169  // std::set_difference requires ordered sets!
170  std::set_difference( lhs.begin(), lhs.end(), rhs.begin(), rhs.end(),
171  std::inserter( result_r, result_r.end() ),
172  typename TORDERED_SET::key_compare() );
173  }
174 
175  template <class TUNORDERED_SET, typename enable_if = typename TUNORDERED_SET::hasher, typename = void>
176  static void setDifference( const TUNORDERED_SET & lhs, const TUNORDERED_SET & rhs, TUNORDERED_SET & result_r )
177  {
178  // std::set_difference requires ordered sets!
179  for ( const auto & l : lhs )
180  { if ( rhs.find( l ) == rhs.end() ) result_r.insert( l ); }
181  }
182 
183  private:
187  };
188 
190  template <class TSet>
191  std::ostream & operator<<( std::ostream & str, const SetTracker<TSet> & obj )
192  { return str << "set(" << obj.current().size() << "|+" << obj.added().size() << "|-" << obj.removed().size() << ')'; }
193 
194  } // namespace base
196 } // namespace zypp
198 #endif // ZYPP_BASE_SETTRACKER_H
TSet::key_type key_type
Definition: SetTracker.h:41
bool contains(const key_type &key_r) const
Whether val_r is in the set.
Definition: SetTracker.h:130
set_type & removed()
Return the set of removed items.
Definition: SetTracker.h:158
Track added/removed set items based on an initial set.
Definition: SetTracker.h:38
bool setInitial()
(Re-)Start tracking the current set (discards previously tracked changes).
Definition: SetTracker.h:58
bool wasAdded(const key_type &key_r) const
Whether val_r is tracked as added.
Definition: SetTracker.h:133
String related utilities and Regular expression matching.
bool setInitial(set_type new_r)
Start tracking a new set (discards previously tracked changes).
Definition: SetTracker.h:64
Definition: ansi.h:854
static void setDifference(const TORDERED_SET &lhs, const TORDERED_SET &rhs, TORDERED_SET &result_r)
Definition: SetTracker.h:167
set_type & added()
Return the set of added items.
Definition: SetTracker.h:155
bool wasRemoved(const key_type &key_r) const
Whether val_r is tracked as removed.
Definition: SetTracker.h:136
const set_type & removed() const
Return the set of removed items.
Definition: SetTracker.h:146
SetTracker(set_type initial_r)
Ctor taking an initial set.
Definition: SetTracker.h:49
static void setDifference(const TUNORDERED_SET &lhs, const TUNORDERED_SET &rhs, TUNORDERED_SET &result_r)
Definition: SetTracker.h:176
const set_type & current() const
Return the current set.
Definition: SetTracker.h:140
bool add(const value_type &val_r)
Add an element to the set and track changes.
Definition: SetTracker.h:101
const set_type & added() const
Return the set of added items.
Definition: SetTracker.h:143
TSet::value_type value_type
Definition: SetTracker.h:42
static bool find(const set_type &set_r, const key_type &key_r)
Definition: SetTracker.h:163
SetTracker()
Default Ctor: empty set.
Definition: SetTracker.h:45
set_type & current()
Return the current set.
Definition: SetTracker.h:152
Easy-to use interface to the ZYPP dependency resolver.
Definition: CodePitfalls.doc:1