Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(202)

Side by Side Diff: base/callback_registry.h

Issue 23514056: Function-type templated CallbackRegistry (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | base/callback_registry.h.pump » ('j') | base/callback_registry_unittest.cc » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // This file was GENERATED by command:
2 // pump.py callback_registry.h.pump
3 // DO NOT EDIT BY HAND!!!
4
5
1 // Copyright 2013 The Chromium Authors. All rights reserved. 6 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 7 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 8 // found in the LICENSE file.
4 9
5 #ifndef BASE_CALLBACK_REGISTRY_H_ 10 #ifndef BASE_CALLBACK_REGISTRY_H_
6 #define BASE_CALLBACK_REGISTRY_H_ 11 #define BASE_CALLBACK_REGISTRY_H_
7 12
8 #include <list> 13 #include <list>
9 14
10 #include "base/basictypes.h" 15 #include "base/basictypes.h"
11 #include "base/callback.h" 16 #include "base/callback.h"
17 #include "base/callback_internal.h"
12 #include "base/compiler_specific.h" 18 #include "base/compiler_specific.h"
13 #include "base/logging.h" 19 #include "base/logging.h"
14 #include "base/memory/scoped_ptr.h" 20 #include "base/memory/scoped_ptr.h"
15 21
16 // OVERVIEW: 22 // OVERVIEW:
17 // 23 //
18 // A container for a list of callbacks. Unlike a normal STL vector or list, 24 // A container for a list of callbacks. Unlike a normal STL vector or list,
19 // this container can be modified during iteration without invalidating the 25 // this container can be modified during iteration without invalidating the
20 // iterator. It safely handles the case of a callback removing itself 26 // iterator. It safely handles the case of a callback removing itself
21 // or another callback from the list while callbacks are being run. 27 // or another callback from the list while callbacks are being run.
22 // 28 //
23 // TYPICAL USAGE: 29 // TYPICAL USAGE:
24 // 30 //
25 // class MyWidget { 31 // class MyWidget {
26 // public: 32 // public:
27 // ... 33 // ...
28 // 34 //
29 // typedef base::Callback<void(const Foo&)> OnFooCallback; 35 // typedef base::Callback<void(const Foo&)> OnFooCallback;
30 // 36 //
31 // scoped_ptr<base::CallbackRegistry<Foo>::Subscription> RegisterCallback( 37 // scoped_ptr<base::CallbackRegistry<void(const Foo&)>::Subscription>
32 // const OnFooCallback& cb) { 38 // RegisterCallback(const OnFooCallback& cb) {
33 // return callback_registry_.Add(cb); 39 // return callback_registry_.Add(cb);
34 // } 40 // }
35 // 41 //
36 // private: 42 // private:
37 // void NotifyFoo(const Foo& foo) { 43 // void NotifyFoo(const Foo& foo) {
38 // callback_registry_.Notify(foo); 44 // callback_registry_.Notify(foo);
39 // } 45 // }
40 // 46 //
41 // base::CallbackRegistry<Foo> callback_registry_; 47 // base::CallbackRegistry<void(const Foo&)> callback_registry_;
42 // }; 48 // };
43 // 49 //
44 // 50 //
45 // class MyWidgetListener { 51 // class MyWidgetListener {
46 // public: 52 // public:
47 // MyWidgetListener::MyWidgetListener() { 53 // MyWidgetListener::MyWidgetListener() {
48 // foo_subscription_ = MyWidget::GetCurrent()->RegisterCallback( 54 // foo_subscription_ = MyWidget::GetCurrent()->RegisterCallback(
49 // base::Bind(&MyWidgetListener::OnFoo, this))); 55 // base::Bind(&MyWidgetListener::OnFoo, this)));
50 // } 56 // }
51 // 57 //
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
166 172
167 private: 173 private:
168 std::list<CallbackType> callbacks_; 174 std::list<CallbackType> callbacks_;
169 int active_iterator_count_; 175 int active_iterator_count_;
170 176
171 DISALLOW_COPY_AND_ASSIGN(CallbackRegistryBase); 177 DISALLOW_COPY_AND_ASSIGN(CallbackRegistryBase);
172 }; 178 };
173 179
174 } // namespace internal 180 } // namespace internal
175 181
176 template <typename Details> 182 template <typename Sig> class CallbackRegistry;
177 class CallbackRegistry 183
178 : public internal::CallbackRegistryBase<Callback<void(const Details&)> > { 184 template <>
185 class CallbackRegistry<void(void)>
186 : public internal::CallbackRegistryBase<Callback<void(void)> > {
179 public: 187 public:
188 typedef Callback<void(void)> CallbackType;
189
180 CallbackRegistry() {} 190 CallbackRegistry() {}
181 191
182 // Execute all active callbacks with |details| parameter.
183 void Notify(const Details& details) {
184 typename internal::CallbackRegistryBase<
185 Callback<void(const Details&)> >::Iterator it = this->GetIterator();
186 Callback<void(const Details&)>* cb;
187 while((cb = it.GetNext()) != NULL) {
188 cb->Run(details);
189 }
190 }
191
192 private:
193 DISALLOW_COPY_AND_ASSIGN(CallbackRegistry);
194 };
195
196 template <> class CallbackRegistry<void>
197 : public internal::CallbackRegistryBase<Closure> {
198 public:
199 CallbackRegistry() {}
200
201 // Execute all active callbacks.
202 void Notify() { 192 void Notify() {
203 Iterator it = this->GetIterator(); 193 typename internal::CallbackRegistryBase<CallbackType>::Iterator it =
204 Closure* cb; 194 this->GetIterator();
195 CallbackType* cb;
205 while((cb = it.GetNext()) != NULL) { 196 while((cb = it.GetNext()) != NULL) {
206 cb->Run(); 197 cb->Run();
207 } 198 }
208 } 199 }
209 200
201 private:
202 DISALLOW_COPY_AND_ASSIGN(CallbackRegistry);
203 };
204
205 template <typename A1>
206 class CallbackRegistry<void(A1)>
207 : public internal::CallbackRegistryBase<
208 Callback<void(A1)> > {
209 public:
210 typedef Callback<void(A1)> CallbackType;
211
212 CallbackRegistry() {}
213
214 void Notify(typename internal::CallbackParamTraits<A1>::ForwardType a1) {
215 typename internal::CallbackRegistryBase<CallbackType>::Iterator it =
216 this->GetIterator();
217 CallbackType* cb;
218 while((cb = it.GetNext()) != NULL) {
219 cb->Run(a1);
220 }
221 }
222
223 private:
224 DISALLOW_COPY_AND_ASSIGN(CallbackRegistry);
225 };
226
227 template <typename A1, typename A2>
228 class CallbackRegistry<void(A1, A2)>
229 : public internal::CallbackRegistryBase<
230 Callback<void(A1, A2)> > {
231 public:
232 typedef Callback<void(A1, A2)> CallbackType;
233
234 CallbackRegistry() {}
235
236 void Notify(typename internal::CallbackParamTraits<A1>::ForwardType a1,
237 typename internal::CallbackParamTraits<A2>::ForwardType a2) {
238 typename internal::CallbackRegistryBase<CallbackType>::Iterator it =
239 this->GetIterator();
240 CallbackType* cb;
241 while((cb = it.GetNext()) != NULL) {
242 cb->Run(a1, a2);
243 }
244 }
245
246 private:
247 DISALLOW_COPY_AND_ASSIGN(CallbackRegistry);
248 };
249
250 template <typename A1, typename A2, typename A3>
251 class CallbackRegistry<void(A1, A2, A3)>
252 : public internal::CallbackRegistryBase<
253 Callback<void(A1, A2, A3)> > {
254 public:
255 typedef Callback<void(A1, A2, A3)> CallbackType;
256
257 CallbackRegistry() {}
258
259 void Notify(typename internal::CallbackParamTraits<A1>::ForwardType a1,
260 typename internal::CallbackParamTraits<A2>::ForwardType a2,
261 typename internal::CallbackParamTraits<A3>::ForwardType a3) {
262 typename internal::CallbackRegistryBase<CallbackType>::Iterator it =
263 this->GetIterator();
264 CallbackType* cb;
265 while((cb = it.GetNext()) != NULL) {
266 cb->Run(a1, a2, a3);
267 }
268 }
269
270 private:
271 DISALLOW_COPY_AND_ASSIGN(CallbackRegistry);
272 };
273
274 template <typename A1, typename A2, typename A3, typename A4>
275 class CallbackRegistry<void(A1, A2, A3, A4)>
276 : public internal::CallbackRegistryBase<
277 Callback<void(A1, A2, A3, A4)> > {
278 public:
279 typedef Callback<void(A1, A2, A3, A4)> CallbackType;
280
281 CallbackRegistry() {}
282
283 void Notify(typename internal::CallbackParamTraits<A1>::ForwardType a1,
284 typename internal::CallbackParamTraits<A2>::ForwardType a2,
285 typename internal::CallbackParamTraits<A3>::ForwardType a3,
286 typename internal::CallbackParamTraits<A4>::ForwardType a4) {
287 typename internal::CallbackRegistryBase<CallbackType>::Iterator it =
288 this->GetIterator();
289 CallbackType* cb;
290 while((cb = it.GetNext()) != NULL) {
291 cb->Run(a1, a2, a3, a4);
292 }
293 }
294
295 private:
296 DISALLOW_COPY_AND_ASSIGN(CallbackRegistry);
297 };
298
299 template <typename A1, typename A2, typename A3, typename A4, typename A5>
300 class CallbackRegistry<void(A1, A2, A3, A4, A5)>
301 : public internal::CallbackRegistryBase<
302 Callback<void(A1, A2, A3, A4, A5)> > {
303 public:
304 typedef Callback<void(A1, A2, A3, A4, A5)> CallbackType;
305
306 CallbackRegistry() {}
307
308 void Notify(typename internal::CallbackParamTraits<A1>::ForwardType a1,
309 typename internal::CallbackParamTraits<A2>::ForwardType a2,
310 typename internal::CallbackParamTraits<A3>::ForwardType a3,
311 typename internal::CallbackParamTraits<A4>::ForwardType a4,
312 typename internal::CallbackParamTraits<A5>::ForwardType a5) {
313 typename internal::CallbackRegistryBase<CallbackType>::Iterator it =
314 this->GetIterator();
315 CallbackType* cb;
316 while((cb = it.GetNext()) != NULL) {
317 cb->Run(a1, a2, a3, a4, a5);
318 }
319 }
320
321 private:
322 DISALLOW_COPY_AND_ASSIGN(CallbackRegistry);
323 };
324
325 template <typename A1, typename A2, typename A3, typename A4, typename A5,
326 typename A6>
327 class CallbackRegistry<void(A1, A2, A3, A4, A5, A6)>
328 : public internal::CallbackRegistryBase<
329 Callback<void(A1, A2, A3, A4, A5, A6)> > {
330 public:
331 typedef Callback<void(A1, A2, A3, A4, A5, A6)> CallbackType;
332
333 CallbackRegistry() {}
334
335 void Notify(typename internal::CallbackParamTraits<A1>::ForwardType a1,
336 typename internal::CallbackParamTraits<A2>::ForwardType a2,
337 typename internal::CallbackParamTraits<A3>::ForwardType a3,
338 typename internal::CallbackParamTraits<A4>::ForwardType a4,
339 typename internal::CallbackParamTraits<A5>::ForwardType a5,
340 typename internal::CallbackParamTraits<A6>::ForwardType a6) {
341 typename internal::CallbackRegistryBase<CallbackType>::Iterator it =
342 this->GetIterator();
343 CallbackType* cb;
344 while((cb = it.GetNext()) != NULL) {
345 cb->Run(a1, a2, a3, a4, a5, a6);
346 }
347 }
348
349 private:
350 DISALLOW_COPY_AND_ASSIGN(CallbackRegistry);
351 };
352
353 template <typename A1, typename A2, typename A3, typename A4, typename A5,
354 typename A6, typename A7>
355 class CallbackRegistry<void(A1, A2, A3, A4, A5, A6, A7)>
356 : public internal::CallbackRegistryBase<
357 Callback<void(A1, A2, A3, A4, A5, A6, A7)> > {
358 public:
359 typedef Callback<void(A1, A2, A3, A4, A5, A6, A7)> CallbackType;
360
361 CallbackRegistry() {}
362
363 void Notify(typename internal::CallbackParamTraits<A1>::ForwardType a1,
364 typename internal::CallbackParamTraits<A2>::ForwardType a2,
365 typename internal::CallbackParamTraits<A3>::ForwardType a3,
366 typename internal::CallbackParamTraits<A4>::ForwardType a4,
367 typename internal::CallbackParamTraits<A5>::ForwardType a5,
368 typename internal::CallbackParamTraits<A6>::ForwardType a6,
369 typename internal::CallbackParamTraits<A7>::ForwardType a7) {
370 typename internal::CallbackRegistryBase<CallbackType>::Iterator it =
371 this->GetIterator();
372 CallbackType* cb;
373 while((cb = it.GetNext()) != NULL) {
374 cb->Run(a1, a2, a3, a4, a5, a6, a7);
375 }
376 }
377
210 private: 378 private:
211 DISALLOW_COPY_AND_ASSIGN(CallbackRegistry); 379 DISALLOW_COPY_AND_ASSIGN(CallbackRegistry);
212 }; 380 };
213 381
214 } // namespace base 382 } // namespace base
215 383
216 #endif // BASE_CALLBACK_REGISTRY_H_ 384 #endif // BASE_CALLBACK_REGISTRY_H
OLDNEW
« no previous file with comments | « no previous file | base/callback_registry.h.pump » ('j') | base/callback_registry_unittest.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698