5namespace bricks::detail {
7template <
typename Range,
typename UnaryPredicate>
10 typename Range::iterator iter_;
11 typename Range::iterator end_;
12 UnaryPredicate predicate_;
16 while (iter_ != end_ && !predicate_(*iter_)) {
22 using difference_type = std::ptrdiff_t;
23 using value_type =
typename Range::value_type;
24 using pointer = value_type*;
25 using reference = value_type&;
26 using iterator_category = std::forward_iterator_tag;
28 explicit filter_iter(
typename Range::iterator iter,
typename Range::iterator end,
29 UnaryPredicate predicate)
30 : iter_{iter}, end_{end}, predicate_{predicate}
35 auto operator++() -> filter_iter&
42 auto operator++(
int) -> filter_iter
49 auto operator==(
const filter_iter& other)
const ->
bool {
return iter_ == other.iter_; }
50 auto operator!=(
const filter_iter& other)
const ->
bool {
return !(*
this == other); }
52 auto operator*() const -> value_type& {
return *iter_; }
55template <
typename Range,
typename UnaryPredicate>
59 UnaryPredicate predicate_;
62 explicit filterer(Range& range, UnaryPredicate predicate) : range_{range}, predicate_{predicate}
66 auto begin() -> filter_iter<Range, UnaryPredicate>
68 return filter_iter<Range, UnaryPredicate>{std::begin(range_), std::end(range_), predicate_};
70 auto end() -> filter_iter<Range, UnaryPredicate>
72 return filter_iter<Range, UnaryPredicate>{std::end(range_), std::end(range_), predicate_};