1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef UI_EVENTS_EVENT_TARGET_ITERATOR_H_
6#define UI_EVENTS_EVENT_TARGET_ITERATOR_H_
7
8#include <vector>
9
10namespace ui {
11
12class EventTarget;
13
14// An interface that allows iterating over a set of EventTargets.
15class EventTargetIterator {
16 public:
17  virtual ~EventTargetIterator() {}
18  virtual EventTarget* GetNextTarget() = 0;
19};
20
21// Provides an EventTargetIterator implementation for iterating over a list of
22// EventTargets. The list is iterated in the reverse order, since typically the
23// EventTargets are maintained in increasing z-order in the lists.
24template<typename T>
25class EventTargetIteratorImpl : public EventTargetIterator {
26 public:
27  explicit EventTargetIteratorImpl(const std::vector<T*>& children)
28      : begin_(children.rbegin()),
29        end_(children.rend()) {
30  }
31  virtual ~EventTargetIteratorImpl() {}
32
33  virtual EventTarget* GetNextTarget() OVERRIDE {
34    if (begin_ == end_)
35      return NULL;
36    EventTarget* target = *(begin_);
37    ++begin_;
38    return target;
39  }
40
41 private:
42  typename std::vector<T*>::const_reverse_iterator begin_;
43  typename std::vector<T*>::const_reverse_iterator end_;
44};
45
46}  // namespace ui
47
48#endif  // UI_EVENTS_EVENT_TARGET_ITERATOR_H_
49