|
|
@@ -21,32 +21,32 @@ namespace iterator {
|
|
|
using value_type = std::remove_cv_t<std::remove_reference_t<reference>>;
|
|
|
using difference_type = std::ptrdiff_t;
|
|
|
using iterator_category = std::forward_iterator_tag;
|
|
|
+ using predicate_t = std::function<bool(value_type const &)>;
|
|
|
|
|
|
public:
|
|
|
filter_iterator() = default;
|
|
|
- template <typename... Args>
|
|
|
- filter_iterator(std::function<bool(value_type const &)> && p,
|
|
|
- Args &&... super_args)
|
|
|
- : base(end_aware_iterator(std::forward<Args>(super_args)...)),
|
|
|
- pred(std::move(p)) {
|
|
|
+ filter_iterator(predicate_t pred, Iter curr, Iter end)
|
|
|
+ : base_(curr, end), pred_(std::move(pred)) {
|
|
|
if (should_advance()) { increment(); }
|
|
|
}
|
|
|
+ filter_iterator(predicate_t pred, Iter end)
|
|
|
+ : filter_iterator(end, end, std::move(pred)) {}
|
|
|
|
|
|
- decltype(auto) dereference() const { return base.dereference(); }
|
|
|
+ decltype(auto) dereference() const { return base_.dereference(); }
|
|
|
void increment() {
|
|
|
do {
|
|
|
- base.increment();
|
|
|
+ base_.increment();
|
|
|
} while (should_advance());
|
|
|
}
|
|
|
bool equal_to(filter_iterator const & other) const {
|
|
|
- return base == other.base;
|
|
|
+ return base_ == other.base_;
|
|
|
}
|
|
|
|
|
|
public:
|
|
|
- bool should_advance() { return !base.at_end() && !pred(dereference()); }
|
|
|
+ bool should_advance() { return !base_.at_end() && !pred_(dereference()); }
|
|
|
|
|
|
- end_aware_iterator<Iter> base;
|
|
|
- std::function<bool(value_type const &)> pred;
|
|
|
+ end_aware_iterator<Iter> base_;
|
|
|
+ predicate_t pred_;
|
|
|
};
|
|
|
}
|
|
|
|