19#include "pw_assert/assert.h"
20#include "pw_preprocessor/compiler.h"
43template <
typename Container,
typename Filter>
49 using difference_type = std::ptrdiff_t;
50 using value_type =
typename Container::value_type;
51 using pointer =
typename Container::pointer;
52 using reference =
typename Container::reference;
53 using iterator_category = std::bidirectional_iterator_tag;
55 constexpr iterator() : view_(
nullptr), it_(0) {}
73 const auto& operator*()
const {
return value(); }
75 const auto* operator->()
const {
return &value(); }
77 constexpr bool operator==(
const iterator& other)
const {
78 return view_ == other.view_ && it_ == other.it_;
81 constexpr bool operator!=(
const iterator& other)
const {
82 return !(*
this == other);
88 enum EndIterator { kEnd };
91 : view_(&view), it_(view.container_->begin()) {
96 : view_(&view), it_(view.container_->end()) {}
99 const auto& value()
const {
return *it_; }
104 bool MatchesItem(
const value_type& value)
const {
105 return view_->filter_(value);
109 typename Container::const_iterator it_;
114 constexpr explicit FilteredView(
const Container& container,
115 const Filter& filter)
116 : container_(&container), filter_(filter) {}
118 constexpr explicit FilteredView(
const Container& container, Filter&& filter)
119 : container_(&container), filter_(std::move(filter)) {}
121 constexpr FilteredView(FilteredView&&) =
default;
122 constexpr FilteredView& operator=(FilteredView&&) =
default;
124 constexpr FilteredView(
const FilteredView&) =
delete;
125 constexpr FilteredView& operator=(
const FilteredView&) =
delete;
127 const auto& operator[](
size_t index)
const {
129 std::advance(it, index);
134 const auto& front()
const {
return *begin(); }
137 const auto& back()
const {
return *std::prev(end()); }
140 size_t size()
const {
141 return static_cast<size_t>(std::distance(begin(), end()));
144 bool empty()
const {
return begin() == end(); }
146 iterator begin()
const {
return iterator(*
this); }
147 iterator end()
const {
return iterator(*
this, iterator::kEnd); }
150 const Container* container_;
154template <
typename Container,
typename Filter>
155void FilteredView<Container, Filter>::iterator::FindMatch() {
156 for (; it_ != view_->container_->end(); ++it_) {
157 if (MatchesItem(*it_)) {
163template <
typename Container,
typename Filter>
164typename FilteredView<Container, Filter>::iterator&
165FilteredView<Container, Filter>::iterator::operator++() {
166 PW_ASSERT(it_ != view_->container_->end());
173template <
typename Container,
typename Filter>
174typename FilteredView<Container, Filter>::iterator&
175FilteredView<Container, Filter>::iterator::operator--() {
176 decltype(it_) new_it = view_->container_->end();
177 while (new_it != view_->container_->begin()) {
179 if (MatchesItem(*new_it)) {
Definition: filtered_view.h:47
Definition: filtered_view.h:44
#define PW_UNREACHABLE
Definition: compiler.h:135
Definition: algorithm.h:46