|
|
@@ -15,11 +15,13 @@
|
|
|
#include <iterator/iterator_fwd.hpp>
|
|
|
|
|
|
namespace iterator {
|
|
|
-template <typename Iter>
|
|
|
+template <typename Iter, bool Cache>
|
|
|
class filter_iterator : public facade<filter_iterator<Iter>> {
|
|
|
public:
|
|
|
- using value_type = std::decay_t<decltype(*std::declval<Iter>())>;
|
|
|
- using predicate_t = std::function<bool(value_type const &)>;
|
|
|
+ using reference = typename std::iterator_traits<Iter>::reference;
|
|
|
+ using cache_t = std::conditional_t<Cache, detail::value_proxy<reference>,
|
|
|
+ detail::ignore_proxy>;
|
|
|
+ using predicate_t = std::function<bool(reference)>;
|
|
|
|
|
|
public:
|
|
|
filter_iterator() = default;
|
|
|
@@ -47,9 +49,12 @@ public:
|
|
|
}
|
|
|
|
|
|
public:
|
|
|
- bool should_advance() { return !base_.at_end() && !pred_(dereference()); }
|
|
|
+ bool should_advance() {
|
|
|
+ return !base_.at_end() && !pred_(cache_ = dereference());
|
|
|
+ }
|
|
|
|
|
|
end_aware_iterator<Iter> base_;
|
|
|
+ cache_t cache_;
|
|
|
predicate_t pred_;
|
|
|
};
|
|
|
|
|
|
@@ -61,4 +66,7 @@ template <typename P, typename It>
|
|
|
filter_iterator(P, It, It) -> filter_iterator<It>;
|
|
|
}
|
|
|
|
|
|
-MAKE_ITERATOR_FACADE_TYPEDEFS_T(::iterator::filter_iterator);
|
|
|
+template <typename It, bool B>
|
|
|
+struct std::iterator_traits<::iterator::filter_iterator<It, B>>
|
|
|
+ : std::iterator_traits<
|
|
|
+ ::iterator::facade<::iterator::filter_iterator<It, B>>> {};
|