template <typename D,typename Iterator,typename SFn> inline bool operator==(const step_iterator_adaptor<D,Iterator,SFn>& p1, const step_iterator_adaptor<D,Iterator,SFn>& p2) { return p1.base()==p2.base(); }
template <typename D,typename Iterator,typename SFn> inline bool operator>=(const step_iterator_adaptor<D,Iterator,SFn>& p1, const step_iterator_adaptor<D,Iterator,SFn>& p2) { return p1.step()>0 ? p1.base()>=p2.base() : p1.base()<=p2.base(); }
template <typename D,typename IT,typename S_FN> inline bool operator!=(const step_iterator_adaptor<D,IT,S_FN>& p1, const step_iterator_adaptor<D,IT,S_FN>& p2) { return p1.base()!=p2.base(); }
difference_type distance_to(const step_iterator_adaptor& it) const { return _step_fn.difference(this->base_reference(),it.base_reference()); }
template <typename D,typename IT,typename S_FN> inline bool operator<(const step_iterator_adaptor<D,IT,S_FN>& p1, const step_iterator_adaptor<D,IT,S_FN>& p2) { return p1.step()>0 ? p1.base()< p2.base() : p1.base()> p2.base(); }