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