virtual value_type front() const { if (!l.empty()) return l.front(); else return r.front(); }
virtual value_type front() const { return std::make_pair(l.front(), r.front()); }
virtual void popFront() { do { r.popFront(); } while (!r.empty() && !p(r.front())); }
virtual value_type front() const { return r.front(); }
RangeFilter(const R &_r, const P &_p) : r(_r), p(_p) { if (!r.empty() && !p(r.front())) { this->popFront(); } }