| // Copyright 2024 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef COMPONENTS_PERFORMANCE_MANAGER_PUBLIC_GRAPH_NODE_SET_VIEW_H_ |
| #define COMPONENTS_PERFORMANCE_MANAGER_PUBLIC_GRAPH_NODE_SET_VIEW_H_ |
| |
| #include <iterator> |
| #include <type_traits> |
| #include <vector> |
| |
| #include "base/memory/raw_ref.h" |
| #include "base/notreached.h" |
| #include "components/performance_manager/public/graph/node.h" |
| |
| namespace performance_manager { |
| |
| // A view over a NodeSet. Provides an iterable view where elements are casted to |
| // the requested type using NodeView::FromNode. |
| template <class UnderlyingSet, class NodeViewPtr> |
| class NodeSetView { |
| public: |
| using value_type = NodeViewPtr; |
| |
| using NodeView = std::remove_pointer_t<NodeViewPtr>; |
| |
| class Iterator { |
| public: |
| using value_type = NodeViewPtr; |
| using difference_type = std::ptrdiff_t; |
| using pointer = value_type*; |
| using reference = value_type&; |
| |
| // Need a default constructor to pass the static_assert below. |
| Iterator() { NOTREACHED(); } |
| |
| explicit Iterator(UnderlyingSet::const_iterator iterator) |
| : iterator_(iterator) {} |
| |
| value_type operator*() const { return NodeView::FromNode(*iterator_); } |
| |
| Iterator& operator++() { |
| ++iterator_; |
| return *this; |
| } |
| |
| Iterator operator++(int) { |
| Iterator old(*this); |
| ++iterator_; |
| return old; |
| } |
| |
| bool operator==(const Iterator& other) const { |
| return iterator_ == other.iterator_; |
| } |
| |
| private: |
| UnderlyingSet::const_iterator iterator_; |
| }; |
| |
| // Make sure the implementation conforms to a standard forward iterator. |
| static_assert(std::forward_iterator<Iterator>); |
| |
| explicit NodeSetView(const UnderlyingSet& node_set) : node_set_(node_set) {} |
| |
| ~NodeSetView() = default; |
| |
| // Standard iterator interface. |
| Iterator begin() const { return Iterator(node_set_->begin()); } |
| Iterator end() const { return Iterator(node_set_->end()); } |
| |
| bool empty() const { return node_set_->empty(); } |
| |
| size_t size() const { return node_set_->size(); } |
| |
| // Helper method to generate a vector containing all the elements. |
| std::vector<NodeViewPtr> AsVector() { |
| return std::vector<NodeViewPtr>(begin(), end()); |
| } |
| |
| private: |
| raw_ref<const UnderlyingSet> node_set_; |
| }; |
| |
| } // namespace performance_manager |
| |
| #endif // COMPONENTS_PERFORMANCE_MANAGER_PUBLIC_GRAPH_NODE_SET_VIEW_H_ |