blob: d12a1e95baa6bd44a704ba9687c6784e4725ad1f [file] [log] [blame]
[email protected]243576f2013-09-25 13:56:231// This file was GENERATED by command:
[email protected]2a7cac02013-09-26 19:20:182// pump.py callback_list.h.pump
[email protected]243576f2013-09-25 13:56:233// DO NOT EDIT BY HAND!!!
4
5
[email protected]893c8162013-09-11 15:16:336// Copyright 2013 The Chromium Authors. All rights reserved.
7// Use of this source code is governed by a BSD-style license that can be
8// found in the LICENSE file.
9
[email protected]2a7cac02013-09-26 19:20:1810#ifndef BASE_CALLBACK_LIST_H_
11#define BASE_CALLBACK_LIST_H_
[email protected]893c8162013-09-11 15:16:3312
13#include <list>
14
15#include "base/basictypes.h"
16#include "base/callback.h"
[email protected]243576f2013-09-25 13:56:2317#include "base/callback_internal.h"
[email protected]893c8162013-09-11 15:16:3318#include "base/compiler_specific.h"
19#include "base/logging.h"
20#include "base/memory/scoped_ptr.h"
21
22// OVERVIEW:
23//
24// A container for a list of callbacks. Unlike a normal STL vector or list,
25// this container can be modified during iteration without invalidating the
26// iterator. It safely handles the case of a callback removing itself
27// or another callback from the list while callbacks are being run.
28//
29// TYPICAL USAGE:
30//
31// class MyWidget {
32// public:
33// ...
34//
35// typedef base::Callback<void(const Foo&)> OnFooCallback;
36//
[email protected]2a7cac02013-09-26 19:20:1837// scoped_ptr<base::CallbackList<void(const Foo&)>::Subscription>
[email protected]243576f2013-09-25 13:56:2338// RegisterCallback(const OnFooCallback& cb) {
[email protected]2a7cac02013-09-26 19:20:1839// return callback_list_.Add(cb);
[email protected]893c8162013-09-11 15:16:3340// }
41//
42// private:
43// void NotifyFoo(const Foo& foo) {
[email protected]2a7cac02013-09-26 19:20:1844// callback_list_.Notify(foo);
[email protected]893c8162013-09-11 15:16:3345// }
46//
[email protected]2a7cac02013-09-26 19:20:1847// base::CallbackList<void(const Foo&)> callback_list_;
[email protected]abdd66e2013-10-09 23:28:2148//
49// DISALLOW_COPY_AND_ASSIGN(MyWidget);
[email protected]893c8162013-09-11 15:16:3350// };
51//
52//
53// class MyWidgetListener {
54// public:
55// MyWidgetListener::MyWidgetListener() {
56// foo_subscription_ = MyWidget::GetCurrent()->RegisterCallback(
57// base::Bind(&MyWidgetListener::OnFoo, this)));
58// }
59//
60// MyWidgetListener::~MyWidgetListener() {
61// // Subscription gets deleted automatically and will deregister
62// // the callback in the process.
63// }
64//
65// private:
66// void OnFoo(const Foo& foo) {
67// // Do something.
68// }
69//
[email protected]2a7cac02013-09-26 19:20:1870// scoped_ptr<base::CallbackList<void(const Foo&)>::Subscription>
[email protected]243576f2013-09-25 13:56:2371// foo_subscription_;
[email protected]abdd66e2013-10-09 23:28:2172//
73// DISALLOW_COPY_AND_ASSIGN(MyWidgetListener);
[email protected]893c8162013-09-11 15:16:3374// };
75
76namespace base {
77
78namespace internal {
79
80template <typename CallbackType>
[email protected]2a7cac02013-09-26 19:20:1881class CallbackListBase {
[email protected]893c8162013-09-11 15:16:3382 public:
83 class Subscription {
84 public:
[email protected]2a7cac02013-09-26 19:20:1885 Subscription(CallbackListBase<CallbackType>* list,
[email protected]893c8162013-09-11 15:16:3386 typename std::list<CallbackType>::iterator iter)
87 : list_(list),
[email protected]abdd66e2013-10-09 23:28:2188 iter_(iter) {
89 }
[email protected]893c8162013-09-11 15:16:3390
91 ~Subscription() {
92 if (list_->active_iterator_count_)
[email protected]abdd66e2013-10-09 23:28:2193 iter_->Reset();
[email protected]893c8162013-09-11 15:16:3394 else
95 list_->callbacks_.erase(iter_);
96 }
97
98 private:
[email protected]2a7cac02013-09-26 19:20:1899 CallbackListBase<CallbackType>* list_;
[email protected]893c8162013-09-11 15:16:33100 typename std::list<CallbackType>::iterator iter_;
101
102 DISALLOW_COPY_AND_ASSIGN(Subscription);
103 };
104
105 // Add a callback to the list. The callback will remain registered until the
106 // returned Subscription is destroyed, which must occur before the
[email protected]2a7cac02013-09-26 19:20:18107 // CallbackList is destroyed.
[email protected]d4605c112013-11-15 15:54:36108 scoped_ptr<Subscription> Add(const CallbackType& cb) WARN_UNUSED_RESULT {
[email protected]893c8162013-09-11 15:16:33109 DCHECK(!cb.is_null());
110 return scoped_ptr<Subscription>(
111 new Subscription(this, callbacks_.insert(callbacks_.end(), cb)));
112 }
113
114 protected:
115 // An iterator class that can be used to access the list of callbacks.
116 class Iterator {
117 public:
[email protected]2a7cac02013-09-26 19:20:18118 explicit Iterator(CallbackListBase<CallbackType>* list)
[email protected]893c8162013-09-11 15:16:33119 : list_(list),
120 list_iter_(list_->callbacks_.begin()) {
121 ++list_->active_iterator_count_;
122 }
123
124 Iterator(const Iterator& iter)
125 : list_(iter.list_),
126 list_iter_(iter.list_iter_) {
127 ++list_->active_iterator_count_;
128 }
129
130 ~Iterator() {
131 if (list_ && --list_->active_iterator_count_ == 0) {
132 list_->Compact();
133 }
134 }
135
136 CallbackType* GetNext() {
137 while ((list_iter_ != list_->callbacks_.end()) && list_iter_->is_null())
138 ++list_iter_;
139
[email protected]da04fbf2013-09-11 16:44:56140 CallbackType* cb = NULL;
141 if (list_iter_ != list_->callbacks_.end()) {
142 cb = &(*list_iter_);
143 ++list_iter_;
144 }
[email protected]893c8162013-09-11 15:16:33145 return cb;
146 }
147
148 private:
[email protected]2a7cac02013-09-26 19:20:18149 CallbackListBase<CallbackType>* list_;
[email protected]893c8162013-09-11 15:16:33150 typename std::list<CallbackType>::iterator list_iter_;
151 };
152
[email protected]abdd66e2013-10-09 23:28:21153 CallbackListBase() : active_iterator_count_(0) {}
[email protected]893c8162013-09-11 15:16:33154
[email protected]2a7cac02013-09-26 19:20:18155 ~CallbackListBase() {
[email protected]893c8162013-09-11 15:16:33156 DCHECK_EQ(0, active_iterator_count_);
157 DCHECK_EQ(0U, callbacks_.size());
158 }
159
[email protected]2a7cac02013-09-26 19:20:18160 // Returns an instance of a CallbackListBase::Iterator which can be used
[email protected]893c8162013-09-11 15:16:33161 // to run callbacks.
162 Iterator GetIterator() {
163 return Iterator(this);
164 }
165
166 // Compact the list: remove any entries which were NULLed out during
167 // iteration.
168 void Compact() {
169 typename std::list<CallbackType>::iterator it = callbacks_.begin();
170 while (it != callbacks_.end()) {
171 if ((*it).is_null())
172 it = callbacks_.erase(it);
173 else
174 ++it;
175 }
176 }
177
178 private:
179 std::list<CallbackType> callbacks_;
180 int active_iterator_count_;
181
[email protected]2a7cac02013-09-26 19:20:18182 DISALLOW_COPY_AND_ASSIGN(CallbackListBase);
[email protected]893c8162013-09-11 15:16:33183};
184
185} // namespace internal
186
[email protected]2a7cac02013-09-26 19:20:18187template <typename Sig> class CallbackList;
[email protected]243576f2013-09-25 13:56:23188
189template <>
[email protected]2a7cac02013-09-26 19:20:18190class CallbackList<void(void)>
191 : public internal::CallbackListBase<Callback<void(void)> > {
[email protected]893c8162013-09-11 15:16:33192 public:
[email protected]243576f2013-09-25 13:56:23193 typedef Callback<void(void)> CallbackType;
194
[email protected]2a7cac02013-09-26 19:20:18195 CallbackList() {}
[email protected]893c8162013-09-11 15:16:33196
[email protected]893c8162013-09-11 15:16:33197 void Notify() {
[email protected]2a7cac02013-09-26 19:20:18198 internal::CallbackListBase<CallbackType>::Iterator it =
[email protected]243576f2013-09-25 13:56:23199 this->GetIterator();
200 CallbackType* cb;
[email protected]abdd66e2013-10-09 23:28:21201 while ((cb = it.GetNext()) != NULL) {
[email protected]893c8162013-09-11 15:16:33202 cb->Run();
203 }
204 }
205
206 private:
[email protected]2a7cac02013-09-26 19:20:18207 DISALLOW_COPY_AND_ASSIGN(CallbackList);
[email protected]893c8162013-09-11 15:16:33208};
209
[email protected]243576f2013-09-25 13:56:23210template <typename A1>
[email protected]2a7cac02013-09-26 19:20:18211class CallbackList<void(A1)>
[email protected]abdd66e2013-10-09 23:28:21212 : public internal::CallbackListBase<Callback<void(A1)> > {
[email protected]243576f2013-09-25 13:56:23213 public:
214 typedef Callback<void(A1)> CallbackType;
215
[email protected]2a7cac02013-09-26 19:20:18216 CallbackList() {}
[email protected]243576f2013-09-25 13:56:23217
218 void Notify(typename internal::CallbackParamTraits<A1>::ForwardType a1) {
[email protected]2a7cac02013-09-26 19:20:18219 typename internal::CallbackListBase<CallbackType>::Iterator it =
[email protected]243576f2013-09-25 13:56:23220 this->GetIterator();
221 CallbackType* cb;
[email protected]abdd66e2013-10-09 23:28:21222 while ((cb = it.GetNext()) != NULL) {
[email protected]243576f2013-09-25 13:56:23223 cb->Run(a1);
224 }
225 }
226
227 private:
[email protected]2a7cac02013-09-26 19:20:18228 DISALLOW_COPY_AND_ASSIGN(CallbackList);
[email protected]243576f2013-09-25 13:56:23229};
230
231template <typename A1, typename A2>
[email protected]2a7cac02013-09-26 19:20:18232class CallbackList<void(A1, A2)>
[email protected]abdd66e2013-10-09 23:28:21233 : public internal::CallbackListBase<Callback<void(A1, A2)> > {
[email protected]243576f2013-09-25 13:56:23234 public:
235 typedef Callback<void(A1, A2)> CallbackType;
236
[email protected]2a7cac02013-09-26 19:20:18237 CallbackList() {}
[email protected]243576f2013-09-25 13:56:23238
239 void Notify(typename internal::CallbackParamTraits<A1>::ForwardType a1,
240 typename internal::CallbackParamTraits<A2>::ForwardType a2) {
[email protected]2a7cac02013-09-26 19:20:18241 typename internal::CallbackListBase<CallbackType>::Iterator it =
[email protected]243576f2013-09-25 13:56:23242 this->GetIterator();
243 CallbackType* cb;
[email protected]abdd66e2013-10-09 23:28:21244 while ((cb = it.GetNext()) != NULL) {
[email protected]243576f2013-09-25 13:56:23245 cb->Run(a1, a2);
246 }
247 }
248
249 private:
[email protected]2a7cac02013-09-26 19:20:18250 DISALLOW_COPY_AND_ASSIGN(CallbackList);
[email protected]243576f2013-09-25 13:56:23251};
252
253template <typename A1, typename A2, typename A3>
[email protected]2a7cac02013-09-26 19:20:18254class CallbackList<void(A1, A2, A3)>
[email protected]abdd66e2013-10-09 23:28:21255 : public internal::CallbackListBase<Callback<void(A1, A2, A3)> > {
[email protected]243576f2013-09-25 13:56:23256 public:
257 typedef Callback<void(A1, A2, A3)> CallbackType;
258
[email protected]2a7cac02013-09-26 19:20:18259 CallbackList() {}
[email protected]243576f2013-09-25 13:56:23260
261 void Notify(typename internal::CallbackParamTraits<A1>::ForwardType a1,
262 typename internal::CallbackParamTraits<A2>::ForwardType a2,
263 typename internal::CallbackParamTraits<A3>::ForwardType a3) {
[email protected]2a7cac02013-09-26 19:20:18264 typename internal::CallbackListBase<CallbackType>::Iterator it =
[email protected]243576f2013-09-25 13:56:23265 this->GetIterator();
266 CallbackType* cb;
[email protected]abdd66e2013-10-09 23:28:21267 while ((cb = it.GetNext()) != NULL) {
[email protected]243576f2013-09-25 13:56:23268 cb->Run(a1, a2, a3);
269 }
270 }
271
272 private:
[email protected]2a7cac02013-09-26 19:20:18273 DISALLOW_COPY_AND_ASSIGN(CallbackList);
[email protected]243576f2013-09-25 13:56:23274};
275
276template <typename A1, typename A2, typename A3, typename A4>
[email protected]2a7cac02013-09-26 19:20:18277class CallbackList<void(A1, A2, A3, A4)>
[email protected]abdd66e2013-10-09 23:28:21278 : public internal::CallbackListBase<Callback<void(A1, A2, A3, A4)> > {
[email protected]243576f2013-09-25 13:56:23279 public:
280 typedef Callback<void(A1, A2, A3, A4)> CallbackType;
281
[email protected]2a7cac02013-09-26 19:20:18282 CallbackList() {}
[email protected]243576f2013-09-25 13:56:23283
284 void Notify(typename internal::CallbackParamTraits<A1>::ForwardType a1,
285 typename internal::CallbackParamTraits<A2>::ForwardType a2,
286 typename internal::CallbackParamTraits<A3>::ForwardType a3,
287 typename internal::CallbackParamTraits<A4>::ForwardType a4) {
[email protected]2a7cac02013-09-26 19:20:18288 typename internal::CallbackListBase<CallbackType>::Iterator it =
[email protected]243576f2013-09-25 13:56:23289 this->GetIterator();
290 CallbackType* cb;
[email protected]abdd66e2013-10-09 23:28:21291 while ((cb = it.GetNext()) != NULL) {
[email protected]243576f2013-09-25 13:56:23292 cb->Run(a1, a2, a3, a4);
293 }
294 }
295
296 private:
[email protected]2a7cac02013-09-26 19:20:18297 DISALLOW_COPY_AND_ASSIGN(CallbackList);
[email protected]243576f2013-09-25 13:56:23298};
299
300template <typename A1, typename A2, typename A3, typename A4, typename A5>
[email protected]2a7cac02013-09-26 19:20:18301class CallbackList<void(A1, A2, A3, A4, A5)>
[email protected]abdd66e2013-10-09 23:28:21302 : public internal::CallbackListBase<Callback<void(A1, A2, A3, A4, A5)> > {
[email protected]243576f2013-09-25 13:56:23303 public:
304 typedef Callback<void(A1, A2, A3, A4, A5)> CallbackType;
305
[email protected]2a7cac02013-09-26 19:20:18306 CallbackList() {}
[email protected]243576f2013-09-25 13:56:23307
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) {
[email protected]2a7cac02013-09-26 19:20:18313 typename internal::CallbackListBase<CallbackType>::Iterator it =
[email protected]243576f2013-09-25 13:56:23314 this->GetIterator();
315 CallbackType* cb;
[email protected]abdd66e2013-10-09 23:28:21316 while ((cb = it.GetNext()) != NULL) {
[email protected]243576f2013-09-25 13:56:23317 cb->Run(a1, a2, a3, a4, a5);
318 }
319 }
320
321 private:
[email protected]2a7cac02013-09-26 19:20:18322 DISALLOW_COPY_AND_ASSIGN(CallbackList);
[email protected]243576f2013-09-25 13:56:23323};
324
325template <typename A1, typename A2, typename A3, typename A4, typename A5,
326 typename A6>
[email protected]2a7cac02013-09-26 19:20:18327class CallbackList<void(A1, A2, A3, A4, A5, A6)>
[email protected]abdd66e2013-10-09 23:28:21328 : public internal::CallbackListBase<Callback<void(A1, A2, A3, A4, A5,
329 A6)> > {
[email protected]243576f2013-09-25 13:56:23330 public:
331 typedef Callback<void(A1, A2, A3, A4, A5, A6)> CallbackType;
332
[email protected]2a7cac02013-09-26 19:20:18333 CallbackList() {}
[email protected]243576f2013-09-25 13:56:23334
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) {
[email protected]2a7cac02013-09-26 19:20:18341 typename internal::CallbackListBase<CallbackType>::Iterator it =
[email protected]243576f2013-09-25 13:56:23342 this->GetIterator();
343 CallbackType* cb;
[email protected]abdd66e2013-10-09 23:28:21344 while ((cb = it.GetNext()) != NULL) {
[email protected]243576f2013-09-25 13:56:23345 cb->Run(a1, a2, a3, a4, a5, a6);
346 }
347 }
348
349 private:
[email protected]2a7cac02013-09-26 19:20:18350 DISALLOW_COPY_AND_ASSIGN(CallbackList);
[email protected]243576f2013-09-25 13:56:23351};
352
353template <typename A1, typename A2, typename A3, typename A4, typename A5,
354 typename A6, typename A7>
[email protected]2a7cac02013-09-26 19:20:18355class CallbackList<void(A1, A2, A3, A4, A5, A6, A7)>
[email protected]abdd66e2013-10-09 23:28:21356 : public internal::CallbackListBase<Callback<void(A1, A2, A3, A4, A5, A6,
357 A7)> > {
[email protected]243576f2013-09-25 13:56:23358 public:
359 typedef Callback<void(A1, A2, A3, A4, A5, A6, A7)> CallbackType;
360
[email protected]2a7cac02013-09-26 19:20:18361 CallbackList() {}
[email protected]243576f2013-09-25 13:56:23362
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) {
[email protected]2a7cac02013-09-26 19:20:18370 typename internal::CallbackListBase<CallbackType>::Iterator it =
[email protected]243576f2013-09-25 13:56:23371 this->GetIterator();
372 CallbackType* cb;
[email protected]abdd66e2013-10-09 23:28:21373 while ((cb = it.GetNext()) != NULL) {
[email protected]243576f2013-09-25 13:56:23374 cb->Run(a1, a2, a3, a4, a5, a6, a7);
375 }
376 }
377
378 private:
[email protected]2a7cac02013-09-26 19:20:18379 DISALLOW_COPY_AND_ASSIGN(CallbackList);
[email protected]243576f2013-09-25 13:56:23380};
381
[email protected]893c8162013-09-11 15:16:33382} // namespace base
383
[email protected]2a7cac02013-09-26 19:20:18384#endif // BASE_CALLBACK_LIST_H_