blob: a3e85eeb46444846ee65556d72635eb95fa20774 [file] [log] [blame]
// Copyright 2013 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef UI_EVENTS_EVENT_TARGET_ITERATOR_H_
#define UI_EVENTS_EVENT_TARGET_ITERATOR_H_
#include <memory>
#include <vector>
namespace ui {
class EventTarget;
// An interface that allows iterating over a set of EventTargets.
class EventTargetIterator {
public:
virtual ~EventTargetIterator() {}
virtual EventTarget* GetNextTarget() = 0;
};
// Provides EventTargetIterator implementations for iterating over a list of
// EventTargets. The list is iterated in the reverse order, since typically the
// EventTargets are maintained in increasing z-order in the lists.
template <typename T>
class EventTargetIteratorPtrImpl : public EventTargetIterator {
public:
explicit EventTargetIteratorPtrImpl(
const std::vector<raw_ptr<T, VectorExperimental>>& children)
: begin_(children.rbegin()), end_(children.rend()) {}
~EventTargetIteratorPtrImpl() override {}
EventTarget* GetNextTarget() override {
if (begin_ == end_)
return nullptr;
EventTarget* target = *(begin_);
++begin_;
return target;
}
private:
typename std::vector<raw_ptr<T, VectorExperimental>>::const_reverse_iterator
begin_;
typename std::vector<raw_ptr<T, VectorExperimental>>::const_reverse_iterator
end_;
};
template <typename T>
class EventTargetIteratorUniquePtrImpl : public EventTargetIterator {
public:
explicit EventTargetIteratorUniquePtrImpl(
const std::vector<std::unique_ptr<T>>& children)
: begin_(children.rbegin()), end_(children.rend()) {}
~EventTargetIteratorUniquePtrImpl() override {}
EventTarget* GetNextTarget() override {
if (begin_ == end_)
return nullptr;
EventTarget* target = begin_->get();
++begin_;
return target;
}
private:
typename std::vector<std::unique_ptr<T>>::const_reverse_iterator begin_;
typename std::vector<std::unique_ptr<T>>::const_reverse_iterator end_;
};
} // namespace ui
#endif // UI_EVENTS_EVENT_TARGET_ITERATOR_H_