168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// This file was GENERATED by command: 24e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// pump.py callback_list.h.pump 368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// DO NOT EDIT BY HAND!!! 468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// found in the LICENSE file. 958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#ifndef BASE_CALLBACK_LIST_H_ 114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#define BASE_CALLBACK_LIST_H_ 1258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include <list> 1458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/basictypes.h" 1658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/callback.h" 1768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "base/callback_internal.h" 1858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/compiler_specific.h" 1958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/logging.h" 2058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 2158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 2258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// OVERVIEW: 2358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// 2458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// A container for a list of callbacks. Unlike a normal STL vector or list, 2558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// this container can be modified during iteration without invalidating the 2658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// iterator. It safely handles the case of a callback removing itself 2758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// or another callback from the list while callbacks are being run. 2858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// 2958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// TYPICAL USAGE: 3058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// 3158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// class MyWidget { 3258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// public: 3358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// ... 3458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// 3558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// typedef base::Callback<void(const Foo&)> OnFooCallback; 3658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// 374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// scoped_ptr<base::CallbackList<void(const Foo&)>::Subscription> 3868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// RegisterCallback(const OnFooCallback& cb) { 394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// return callback_list_.Add(cb); 4058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// } 4158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// 4258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// private: 4358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// void NotifyFoo(const Foo& foo) { 444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// callback_list_.Notify(foo); 4558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// } 4658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// 474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// base::CallbackList<void(const Foo&)> callback_list_; 484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// 494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// DISALLOW_COPY_AND_ASSIGN(MyWidget); 5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// }; 5158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// 5258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// 5358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// class MyWidgetListener { 5458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// public: 5558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// MyWidgetListener::MyWidgetListener() { 5658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// foo_subscription_ = MyWidget::GetCurrent()->RegisterCallback( 5758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// base::Bind(&MyWidgetListener::OnFoo, this))); 5858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// } 5958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// 6058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// MyWidgetListener::~MyWidgetListener() { 6158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// // Subscription gets deleted automatically and will deregister 6258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// // the callback in the process. 6358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// } 6458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// 6558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// private: 6658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// void OnFoo(const Foo& foo) { 6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// // Do something. 6858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// } 6958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// 704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// scoped_ptr<base::CallbackList<void(const Foo&)>::Subscription> 7168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// foo_subscription_; 724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// 734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// DISALLOW_COPY_AND_ASSIGN(MyWidgetListener); 7458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// }; 7558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 7658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace base { 7758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 7858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace internal { 7958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 8058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)template <typename CallbackType> 814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class CallbackListBase { 8258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public: 8358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) class Subscription { 8458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public: 854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Subscription(CallbackListBase<CallbackType>* list, 8658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) typename std::list<CallbackType>::iterator iter) 8758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) : list_(list), 884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) iter_(iter) { 894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 9058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 9158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ~Subscription() { 92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (list_->active_iterator_count_) { 934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) iter_->Reset(); 94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } else { 9558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) list_->callbacks_.erase(iter_); 96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!list_->removal_callback_.is_null()) 97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) list_->removal_callback_.Run(); 98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 9958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 10058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 10158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) private: 1024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CallbackListBase<CallbackType>* list_; 10358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) typename std::list<CallbackType>::iterator iter_; 10458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 10558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(Subscription); 10658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) }; 10758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 10858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Add a callback to the list. The callback will remain registered until the 10958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // returned Subscription is destroyed, which must occur before the 1104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // CallbackList is destroyed. 111f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<Subscription> Add(const CallbackType& cb) WARN_UNUSED_RESULT { 11258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DCHECK(!cb.is_null()); 11358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return scoped_ptr<Subscription>( 11458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) new Subscription(this, callbacks_.insert(callbacks_.end(), cb))); 11558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 11658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Sets a callback which will be run when a subscription list is changed. 118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void set_removal_callback(const Closure& callback) { 119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) removal_callback_ = callback; 120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Returns true if there are no subscriptions. This is only valid to call when 123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // not looping through the list. 124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool empty() { 125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DCHECK_EQ(0, active_iterator_count_); 126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return callbacks_.empty(); 127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 12958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) protected: 13058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // An iterator class that can be used to access the list of callbacks. 13158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) class Iterator { 13258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public: 1334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) explicit Iterator(CallbackListBase<CallbackType>* list) 13458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) : list_(list), 13558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) list_iter_(list_->callbacks_.begin()) { 13658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ++list_->active_iterator_count_; 13758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 13858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 13958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) Iterator(const Iterator& iter) 14058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) : list_(iter.list_), 14158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) list_iter_(iter.list_iter_) { 14258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ++list_->active_iterator_count_; 14358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 14458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 14558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ~Iterator() { 14658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (list_ && --list_->active_iterator_count_ == 0) { 14758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) list_->Compact(); 14858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 14958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 15058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 15158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) CallbackType* GetNext() { 15258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) while ((list_iter_ != list_->callbacks_.end()) && list_iter_->is_null()) 15358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ++list_iter_; 15458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 15558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) CallbackType* cb = NULL; 15658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (list_iter_ != list_->callbacks_.end()) { 15758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) cb = &(*list_iter_); 15858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ++list_iter_; 15958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 16058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return cb; 16158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 16258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 16358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) private: 1644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CallbackListBase<CallbackType>* list_; 16558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) typename std::list<CallbackType>::iterator list_iter_; 16658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) }; 16758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CallbackListBase() : active_iterator_count_(0) {} 16958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ~CallbackListBase() { 17158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DCHECK_EQ(0, active_iterator_count_); 17258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DCHECK_EQ(0U, callbacks_.size()); 17358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 17458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Returns an instance of a CallbackListBase::Iterator which can be used 17658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // to run callbacks. 17758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) Iterator GetIterator() { 17858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return Iterator(this); 17958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 18058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 18158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Compact the list: remove any entries which were NULLed out during 18258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // iteration. 18358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void Compact() { 18458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) typename std::list<CallbackType>::iterator it = callbacks_.begin(); 185cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool updated = false; 18658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) while (it != callbacks_.end()) { 187cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if ((*it).is_null()) { 188cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) updated = true; 18958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) it = callbacks_.erase(it); 190cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } else { 19158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ++it; 192cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 193cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 194cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (updated && !removal_callback_.is_null()) 195cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) removal_callback_.Run(); 19658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 19758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 19858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 19958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) private: 20058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) std::list<CallbackType> callbacks_; 20158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int active_iterator_count_; 202cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Closure removal_callback_; 20358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 2044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(CallbackListBase); 20558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}; 20658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 20758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} // namespace internal 20858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 2094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)template <typename Sig> class CallbackList; 21068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 21168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)template <> 2124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class CallbackList<void(void)> 2134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) : public internal::CallbackListBase<Callback<void(void)> > { 21458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public: 21568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) typedef Callback<void(void)> CallbackType; 21668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 2174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CallbackList() {} 21858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 21968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) void Notify() { 2204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) internal::CallbackListBase<CallbackType>::Iterator it = 22168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) this->GetIterator(); 22268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) CallbackType* cb; 2234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) while ((cb = it.GetNext()) != NULL) { 22468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) cb->Run(); 22558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 22658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 22758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 22868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) private: 2294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(CallbackList); 23058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}; 23158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 23268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)template <typename A1> 2334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class CallbackList<void(A1)> 2344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) : public internal::CallbackListBase<Callback<void(A1)> > { 23558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public: 23668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) typedef Callback<void(A1)> CallbackType; 23768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 2384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CallbackList() {} 23958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 24068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) void Notify(typename internal::CallbackParamTraits<A1>::ForwardType a1) { 2414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) typename internal::CallbackListBase<CallbackType>::Iterator it = 24268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) this->GetIterator(); 24368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) CallbackType* cb; 2444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) while ((cb = it.GetNext()) != NULL) { 24568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) cb->Run(a1); 24668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 24768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 24868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 24968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) private: 2504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(CallbackList); 25168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}; 25268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 25368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)template <typename A1, typename A2> 2544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class CallbackList<void(A1, A2)> 2554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) : public internal::CallbackListBase<Callback<void(A1, A2)> > { 25668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) public: 25768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) typedef Callback<void(A1, A2)> CallbackType; 25868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 2594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CallbackList() {} 26068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 26168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) void Notify(typename internal::CallbackParamTraits<A1>::ForwardType a1, 26268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) typename internal::CallbackParamTraits<A2>::ForwardType a2) { 2634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) typename internal::CallbackListBase<CallbackType>::Iterator it = 26468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) this->GetIterator(); 26568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) CallbackType* cb; 2664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) while ((cb = it.GetNext()) != NULL) { 26768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) cb->Run(a1, a2); 26868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 26968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 27068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 27168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) private: 2724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(CallbackList); 27368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}; 27468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 27568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)template <typename A1, typename A2, typename A3> 2764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class CallbackList<void(A1, A2, A3)> 2774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) : public internal::CallbackListBase<Callback<void(A1, A2, A3)> > { 27868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) public: 27968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) typedef Callback<void(A1, A2, A3)> CallbackType; 28068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 2814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CallbackList() {} 28268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 28368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) void Notify(typename internal::CallbackParamTraits<A1>::ForwardType a1, 28468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) typename internal::CallbackParamTraits<A2>::ForwardType a2, 28568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) typename internal::CallbackParamTraits<A3>::ForwardType a3) { 2864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) typename internal::CallbackListBase<CallbackType>::Iterator it = 28768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) this->GetIterator(); 28868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) CallbackType* cb; 2894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) while ((cb = it.GetNext()) != NULL) { 29068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) cb->Run(a1, a2, a3); 29168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 29268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 29368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 29468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) private: 2954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(CallbackList); 29668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}; 29768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 29868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)template <typename A1, typename A2, typename A3, typename A4> 2994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class CallbackList<void(A1, A2, A3, A4)> 3004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) : public internal::CallbackListBase<Callback<void(A1, A2, A3, A4)> > { 30168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) public: 30268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) typedef Callback<void(A1, A2, A3, A4)> CallbackType; 30368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 3044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CallbackList() {} 30568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 30668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) void Notify(typename internal::CallbackParamTraits<A1>::ForwardType a1, 30768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) typename internal::CallbackParamTraits<A2>::ForwardType a2, 30868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) typename internal::CallbackParamTraits<A3>::ForwardType a3, 30968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) typename internal::CallbackParamTraits<A4>::ForwardType a4) { 3104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) typename internal::CallbackListBase<CallbackType>::Iterator it = 31168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) this->GetIterator(); 31268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) CallbackType* cb; 3134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) while ((cb = it.GetNext()) != NULL) { 31468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) cb->Run(a1, a2, a3, a4); 31568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 31668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 31768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 31868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) private: 3194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(CallbackList); 32068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}; 32168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 32268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)template <typename A1, typename A2, typename A3, typename A4, typename A5> 3234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class CallbackList<void(A1, A2, A3, A4, A5)> 3244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) : public internal::CallbackListBase<Callback<void(A1, A2, A3, A4, A5)> > { 32568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) public: 32668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) typedef Callback<void(A1, A2, A3, A4, A5)> CallbackType; 32768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 3284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CallbackList() {} 32968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 33068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) void Notify(typename internal::CallbackParamTraits<A1>::ForwardType a1, 33168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) typename internal::CallbackParamTraits<A2>::ForwardType a2, 33268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) typename internal::CallbackParamTraits<A3>::ForwardType a3, 33368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) typename internal::CallbackParamTraits<A4>::ForwardType a4, 33468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) typename internal::CallbackParamTraits<A5>::ForwardType a5) { 3354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) typename internal::CallbackListBase<CallbackType>::Iterator it = 33668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) this->GetIterator(); 33768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) CallbackType* cb; 3384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) while ((cb = it.GetNext()) != NULL) { 33968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) cb->Run(a1, a2, a3, a4, a5); 34068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 34168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 34268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 34368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) private: 3444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(CallbackList); 34568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}; 34668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 34768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)template <typename A1, typename A2, typename A3, typename A4, typename A5, 34868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) typename A6> 3494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class CallbackList<void(A1, A2, A3, A4, A5, A6)> 3504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) : public internal::CallbackListBase<Callback<void(A1, A2, A3, A4, A5, 3514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) A6)> > { 35268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) public: 35368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) typedef Callback<void(A1, A2, A3, A4, A5, A6)> CallbackType; 35468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 3554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CallbackList() {} 35668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 35768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) void Notify(typename internal::CallbackParamTraits<A1>::ForwardType a1, 35868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) typename internal::CallbackParamTraits<A2>::ForwardType a2, 35968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) typename internal::CallbackParamTraits<A3>::ForwardType a3, 36068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) typename internal::CallbackParamTraits<A4>::ForwardType a4, 36168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) typename internal::CallbackParamTraits<A5>::ForwardType a5, 36268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) typename internal::CallbackParamTraits<A6>::ForwardType a6) { 3634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) typename internal::CallbackListBase<CallbackType>::Iterator it = 36468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) this->GetIterator(); 36568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) CallbackType* cb; 3664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) while ((cb = it.GetNext()) != NULL) { 36768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) cb->Run(a1, a2, a3, a4, a5, a6); 36868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 36968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 37068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 37168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) private: 3724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(CallbackList); 37368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}; 37468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 37568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)template <typename A1, typename A2, typename A3, typename A4, typename A5, 37668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) typename A6, typename A7> 3774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class CallbackList<void(A1, A2, A3, A4, A5, A6, A7)> 3784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) : public internal::CallbackListBase<Callback<void(A1, A2, A3, A4, A5, A6, 3794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) A7)> > { 38068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) public: 38168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) typedef Callback<void(A1, A2, A3, A4, A5, A6, A7)> CallbackType; 38268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 3834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CallbackList() {} 38468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 38568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) void Notify(typename internal::CallbackParamTraits<A1>::ForwardType a1, 38668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) typename internal::CallbackParamTraits<A2>::ForwardType a2, 38768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) typename internal::CallbackParamTraits<A3>::ForwardType a3, 38868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) typename internal::CallbackParamTraits<A4>::ForwardType a4, 38968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) typename internal::CallbackParamTraits<A5>::ForwardType a5, 39068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) typename internal::CallbackParamTraits<A6>::ForwardType a6, 39168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) typename internal::CallbackParamTraits<A7>::ForwardType a7) { 3924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) typename internal::CallbackListBase<CallbackType>::Iterator it = 39368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) this->GetIterator(); 39468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) CallbackType* cb; 3954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) while ((cb = it.GetNext()) != NULL) { 39668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) cb->Run(a1, a2, a3, a4, a5, a6, a7); 39758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 39858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 39958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 40058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) private: 4014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(CallbackList); 40258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}; 40358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 40458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} // namespace base 40558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 4064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif // BASE_CALLBACK_LIST_H_ 407