19#include "pw_assert/assert.h"
20#include "pw_preprocessor/compiler.h"
22namespace pw::containers {
48template <
typename Container,
typename Filter>
54 using difference_type = std::ptrdiff_t;
55 using value_type =
typename Container::value_type;
56 using pointer =
typename Container::pointer;
57 using reference =
typename Container::reference;
58 using iterator_category = std::bidirectional_iterator_tag;
60 constexpr iterator() : view_(
nullptr), it_(0) {}
78 const auto& operator*()
const {
return value(); }
80 const auto* operator->()
const {
return &value(); }
82 constexpr bool operator==(
const iterator& other)
const {
83 return view_ == other.view_ && it_ == other.it_;
86 constexpr bool operator!=(
const iterator& other)
const {
87 return !(*
this == other);
93 enum EndIterator { kEnd };
96 : view_(&view), it_(view.container_->begin()) {
101 : view_(&view), it_(view.container_->end()) {}
104 const auto& value()
const {
return *it_; }
109 bool MatchesItem(
const value_type& value)
const {
110 return view_->filter_(value);
114 typename Container::const_iterator it_;
119 constexpr explicit FilteredView(
const Container& container,
120 const Filter& filter)
121 : container_(&container), filter_(filter) {}
123 constexpr explicit FilteredView(
const Container& container, Filter&& filter)
124 : container_(&container), filter_(std::move(filter)) {}
126 constexpr FilteredView(FilteredView&&) =
default;
127 constexpr FilteredView& operator=(FilteredView&&) =
default;
129 constexpr FilteredView(
const FilteredView&) =
delete;
130 constexpr FilteredView& operator=(
const FilteredView&) =
delete;
132 const auto& operator[](
size_t index)
const {
134 std::advance(it, index);
139 const auto& front()
const {
return *begin(); }
142 const auto& back()
const {
return *std::prev(end()); }
145 size_t size()
const {
146 return static_cast<size_t>(std::distance(begin(), end()));
149 bool empty()
const {
return begin() == end(); }
151 iterator begin()
const {
return iterator(*
this); }
152 iterator end()
const {
return iterator(*
this, iterator::kEnd); }
155 const Container* container_;
159template <
typename Container,
typename Filter>
160void FilteredView<Container, Filter>::iterator::FindMatch() {
161 for (; it_ != view_->container_->end(); ++it_) {
162 if (MatchesItem(*it_)) {
168template <
typename Container,
typename Filter>
169typename FilteredView<Container, Filter>::iterator&
170FilteredView<Container, Filter>::iterator::operator++() {
171 PW_ASSERT(it_ != view_->container_->end());
178template <
typename Container,
typename Filter>
179typename FilteredView<Container, Filter>::iterator&
180FilteredView<Container, Filter>::iterator::operator--() {
181 decltype(it_) new_it = view_->container_->end();
182 while (new_it != view_->container_->begin()) {
184 if (MatchesItem(*new_it)) {
Definition: filtered_view.h:52
Definition: filtered_view.h:49
#define PW_UNREACHABLE
Definition: compiler.h:138