namespace std { namespace experimental { namespace ranges { inline namespace v1 {
template <Iterator I, Sentinel<I> S>
requires !Same<I, S>
class common_iterator {
public:
using difference_type = difference_type_t<I>;
constexpr common_iterator();
constexpr common_iterator(I i);
constexpr common_iterator(S s);
constexpr common_iterator(const common_iterator<ConvertibleTo<I>, ConvertibleTo<S>>& u);
common_iterator& operator=(const common_iterator<ConvertibleTo<I>, ConvertibleTo<S>>& u);
decltype(auto) operator*();
decltype(auto) operator*() const
requires dereferenceable<const I>;
decltype(auto) operator->() const
requires see below;
common_iterator& operator++();
decltype(auto) operator++(int);
common_iterator operator++(int)
requires ForwardIterator<I>;
friend rvalue_reference_t<I> iter_move(const common_iterator& i)
noexcept(see below)
requires InputIterator<I>;
template <IndirectlySwappable<I> I2, class S2>
friend void iter_swap(const common_iterator& x, const common_iterator<I2, S2>& y)
noexcept(see below);
private:
bool is_sentinel; I iter; S sentinel; };
template <Readable I, class S>
struct value_type<common_iterator<I, S>> {
using type = value_type_t<I>;
};
template <InputIterator I, class S>
struct iterator_category<common_iterator<I, S>> {
using type = input_iterator_tag;
};
template <ForwardIterator I, class S>
struct iterator_category<common_iterator<I, S>> {
using type = forward_iterator_tag;
};
template <class I1, class I2, Sentinel<I2> S1, Sentinel<I1> S2>
bool operator==(
const common_iterator<I1, S1>& x, const common_iterator<I2, S2>& y);
template <class I1, class I2, Sentinel<I2> S1, Sentinel<I1> S2>
requires EqualityComparableWith<I1, I2>
bool operator==(
const common_iterator<I1, S1>& x, const common_iterator<I2, S2>& y);
template <class I1, class I2, Sentinel<I2> S1, Sentinel<I1> S2>
bool operator!=(
const common_iterator<I1, S1>& x, const common_iterator<I2, S2>& y);
template <class I2, SizedSentinel<I2> I1, SizedSentinel<I2> S1, SizedSentinel<I1> S2>
difference_type_t<I2> operator-(
const common_iterator<I1, S1>& x, const common_iterator<I2, S2>& y);
}}}}