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 10 namespace ui { 11 12 class EventTarget; 13 14 // An interface that allows iterating over a set of EventTargets. 15 class 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. 24 template<typename T> 25 class 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