event_target_iterator.h 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  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. #ifndef UI_EVENTS_EVENT_TARGET_ITERATOR_H_
  5. #define UI_EVENTS_EVENT_TARGET_ITERATOR_H_
  6. #include <memory>
  7. #include <vector>
  8. namespace ui {
  9. class EventTarget;
  10. // An interface that allows iterating over a set of EventTargets.
  11. class EventTargetIterator {
  12. public:
  13. virtual ~EventTargetIterator() {}
  14. virtual EventTarget* GetNextTarget() = 0;
  15. };
  16. // Provides EventTargetIterator implementations for iterating over a list of
  17. // EventTargets. The list is iterated in the reverse order, since typically the
  18. // EventTargets are maintained in increasing z-order in the lists.
  19. template <typename T>
  20. class EventTargetIteratorPtrImpl : public EventTargetIterator {
  21. public:
  22. explicit EventTargetIteratorPtrImpl(const std::vector<T*>& children)
  23. : begin_(children.rbegin()), end_(children.rend()) {}
  24. ~EventTargetIteratorPtrImpl() override {}
  25. EventTarget* GetNextTarget() override {
  26. if (begin_ == end_)
  27. return nullptr;
  28. EventTarget* target = *(begin_);
  29. ++begin_;
  30. return target;
  31. }
  32. private:
  33. typename std::vector<T*>::const_reverse_iterator begin_;
  34. typename std::vector<T*>::const_reverse_iterator end_;
  35. };
  36. template <typename T>
  37. class EventTargetIteratorUniquePtrImpl : public EventTargetIterator {
  38. public:
  39. explicit EventTargetIteratorUniquePtrImpl(
  40. const std::vector<std::unique_ptr<T>>& children)
  41. : begin_(children.rbegin()), end_(children.rend()) {}
  42. ~EventTargetIteratorUniquePtrImpl() override {}
  43. EventTarget* GetNextTarget() override {
  44. if (begin_ == end_)
  45. return nullptr;
  46. EventTarget* target = begin_->get();
  47. ++begin_;
  48. return target;
  49. }
  50. private:
  51. typename std::vector<std::unique_ptr<T>>::const_reverse_iterator begin_;
  52. typename std::vector<std::unique_ptr<T>>::const_reverse_iterator end_;
  53. };
  54. } // namespace ui
  55. #endif // UI_EVENTS_EVENT_TARGET_ITERATOR_H_