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
20namespace zypp
21{
23 namespace base
24 {
37 template <class TSet>
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
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 }
125
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
Definition ansi.h:855
String related utilities and Regular expression matching.
std::ostream & operator<<(std::ostream &str, const SetTracker< TSet > &obj)
relates: SetTracker Stream output
Definition SetTracker.h:191
Easy-to use interface to the ZYPP dependency resolver.
Track added/removed set items based on an initial set.
Definition SetTracker.h:39
bool wasRemoved(const key_type &key_r) const
Whether val_r is tracked as removed.
Definition SetTracker.h:136
bool setInitial(set_type new_r)
Start tracking a new set (discards previously tracked changes).
Definition SetTracker.h:64
IdStringSet::value_type value_type
Definition SetTracker.h:42
const set_type & current() const
Return the current set.
Definition SetTracker.h:140
set_type & current()
Return the current set.
Definition SetTracker.h:152
static void setDifference(const TORDERED_SET &lhs, const TORDERED_SET &rhs, TORDERED_SET &result_r)
Definition SetTracker.h:167
static bool find(const set_type &set_r, const key_type &key_r)
Definition SetTracker.h:163
SetTracker(set_type initial_r)
Ctor taking an initial set.
Definition SetTracker.h:49
bool set(set_type new_r)
Set a new_r set and track changes.
Definition SetTracker.h:79
bool add(const value_type &val_r)
Add an element to the set and track changes.
Definition SetTracker.h:101
bool wasAdded(const key_type &key_r) const
Whether val_r is tracked as added.
Definition SetTracker.h:133
const set_type & added() const
Return the set of added items.
Definition SetTracker.h:143
set_type & added()
Return the set of added items.
Definition SetTracker.h:155
set_type & removed()
Return the set of removed items.
Definition SetTracker.h:158
bool remove(const value_type &val_r)
Remove an element from the set and track changes.
Definition SetTracker.h:115
static void setDifference(const TUNORDERED_SET &lhs, const TUNORDERED_SET &rhs, TUNORDERED_SET &result_r)
Definition SetTracker.h:176
SetTracker()
Default Ctor: empty set.
Definition SetTracker.h:45
const set_type & removed() const
Return the set of removed items.
Definition SetTracker.h:146
bool setInitial()
(Re-)Start tracking the current set (discards previously tracked changes).
Definition SetTracker.h:58
bool contains(const key_type &key_r) const
Whether val_r is in the set.
Definition SetTracker.h:130