annotate foosdk/sdk/foobar2000/helpers/notifyList.h @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #pragma once
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #include <vector>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 #include <set>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 #include <map>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 #include <memory>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 #include <pfc/synchro.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 template<typename obj_t> class notifyList : public std::vector<obj_t*> {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 void operator+=( obj_t * obj ) { this->push_back(obj); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 void operator-=( obj_t * obj ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 for(auto i = this->begin(); i != this->end(); ++i) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 if (*i == obj) {this->erase(i); return;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 PFC_ASSERT(!"Should not get here");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 bool contains(obj_t* obj) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 for (auto i : *this) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 if (i == obj) return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 // Efficient notifylist. Efficient addremove, ordered operation.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 template<typename obj_t> class notifyList2 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 typedef uint64_t key_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 typedef obj_t * val_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 void add( obj_t * obj ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 auto key = m_increment++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 m_ordered[key] = obj;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 m_unordered[obj] = key;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 void remove(obj_t * obj) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 auto i1 = m_unordered.find(obj);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 if (i1 != m_unordered.end()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 m_ordered.erase(i1->second);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 m_unordered.erase(i1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 void operator+=(obj_t * obj) {add(obj);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 void operator-=(obj_t * obj) {remove(obj);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 typedef std::vector<obj_t*> state_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 state_t get() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 state_t ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 ret.resize(m_ordered.size());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 size_t walk = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 for( auto i = m_ordered.begin(); i != m_ordered.end(); ++i ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 ret[walk++] = i->second;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 return std::move(ret);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 size_t size() const { return m_unordered.size(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 bool contains( obj_t * obj ) const { return m_unordered.find( obj ) != m_unordered.end(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 key_t firstKey() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 auto iter = m_ordered.begin();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 if (iter == m_ordered.end()) return keyInvalid();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 return iter->first;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 key_t nextKey(key_t key) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 auto iter = m_ordered.upper_bound( key );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 if (iter == m_ordered.end()) return keyInvalid();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 return iter->first;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 obj_t * resolveKey( key_t key ) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 auto iter = m_ordered.find( key );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 if (iter != m_ordered.end()) return iter->second;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 return nullptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 bool validKey(key_t key) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 return m_ordered.find( key ) != m_ordered.end();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 static key_t keyInvalid() { return (key_t)(-1); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 key_t m_increment;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 std::map<key_t, val_t> m_ordered;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 std::map<val_t, key_t> m_unordered;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 template<typename obj_t> class notifyListUnordered : public std::set<obj_t*> {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 void operator+=( obj_t * obj ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 this->insert( obj );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 void operator-=( obj_t * obj ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 this->erase( obj );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 //! Notify list v3 \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 //! Traits: \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 //! * Ordered \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 //! * Efficient add/remove \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 //! * Handles every possible scenario of add/remove in mid enumeration \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 //! * Use begin()/end() to walk with no further workarounds \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 //! * If you've done anything between ++ and *iter - or are using the notifylist in multiple threads, check *iter for giving you a null. Otherwise, after ++ you always have a valid value, or end. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 //! Available in two flavours, non thread safe (notifyList3<>) and thread safe (notifyList3MT<>). \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 //! Multi threaded version ensures thread safety internally - though once it gives you a pointer, there's no safeguard against removal attempt while the pointer is being used, hence not adivsed.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 template<typename obj_t, typename sync_t> class notifyList3_ {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 typedef notifyList3_<obj_t, sync_t> self_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 typedef notifyList2< obj_t > content_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 typedef typename content_t::key_t contentKey_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 struct data_t {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 content_t content;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 sync_t sync;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 typedef std::shared_ptr< data_t > dataRef_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 notifyList3_( ) : m_data(std::make_shared< data_t >()) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 void operator+=( obj_t * obj ) { add(obj); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 void operator-=( obj_t * obj ) { remove(obj); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 void add( obj_t * obj ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 inWriteSync( m_data->sync );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 m_data->content.add( obj );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 void remove( obj_t * obj ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 inWriteSync( m_data->sync );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 m_data->content.remove( obj );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 size_t size() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 inReadSync( m_data->sync );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 return m_data->content.size();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 class const_iterator {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 const_iterator( dataRef_t ref, contentKey_t key ) : m_data(ref), m_key(key) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 const_iterator const & operator++(int) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 increment();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 return *this;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 const_iterator operator++() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 const_iterator ret ( *this );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 increment();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 return std::move(ret);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 void increment() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 PFC_ASSERT( isValid() );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158 inReadSync( m_data->sync );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159 m_key = m_data->content.nextKey( m_key );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 bool isValid() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163 inReadSync( m_data->sync );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 return m_data->content.validKey( m_key );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167 bool operator==( const_iterator const & other ) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168 return equals( *this, other );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170 bool operator!=( const_iterator const & other ) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 return !equals( *this, other );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174 static bool equals( const_iterator const & i1, const_iterator const & i2 ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 return i1.m_key == i2.m_key;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178 //! Returns the referenced value. Will be null in case of invalidation in mid-enumeration.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179 obj_t * operator*() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180 inReadSync( m_data->sync );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181 return m_data->content.resolveKey( m_key );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
185 const_iterator() = delete;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187 const dataRef_t m_data;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188 contentKey_t m_key;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 const_iterator begin() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192 inReadSync( m_data->sync );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193 return const_iterator( m_data, m_data->content.firstKey() );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195 const_iterator end() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196 inReadSync( m_data->sync );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197 return const_iterator( m_data, content_t::keyInvalid() );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201 notifyList3_( const self_t & ) = delete;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
202 void operator=( const self_t & ) = delete;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
203
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
204
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
205 const dataRef_t m_data;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
206 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
207
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208 //! Thread safe notifyList3. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209 //! See: notifyList3_
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
210 template<typename obj_t>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
211 class notifyList3MT : public notifyList3_<obj_t, pfc::readWriteLock> {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
214 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
215
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
216 //! Non-thread-safe notifyList3. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
217 //! See: notifyList3_
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
218 template<typename obj_t>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
219 class notifyList3 : public notifyList3_<obj_t, pfc::dummyLock> {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
220 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
221
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
222 };