namespace std::ranges {
// (1)
template<class I, class O>
struct in_out_result {
[[no_unique_address]] I in;
[[no_unique_address]] O out;
template<class I2, class O2>
requires convertible_to<const I&, I2> && convertible_to<const O&, O2>
constexpr operator in_out_result<I2, O2>() const & {
return {in, out};
}
template<class I2, class O2>
requires convertible_to<I, I2> && convertible_to<O, O2>
constexpr operator in_out_result<I2, O2>() && {
return {std::move(in), std::move(out)};
}
};
// (2)
template<class I, class O>
using copy_result = in_out_result<I, O>;
// (3)
template<class I, class O>
using copy_n_result = in_out_result<I, O>;
// (4)
template<class I, class O>
using copy_if_result = in_out_result<I, O>;
// (5)
template<class I, class O>
using copy_backward_result = in_out_result<I, O>;
// (6)
template<class I, class O>
using move_result = in_out_result<I, O>;
// (7)
template<class I, class O>
using move_backward_result = in_out_result<I, O>;
// (8)
template<class I, class O>
using unary_transform_result = in_out_result<I, O>;
// (9)
template<class I, class O>
using replace_copy_result = in_out_result<I, O>;
// (10)
template<class I, class O>
using replace_copy_if_result = in_out_result<I, O>;
// (11)
template<class I, class O>
using remove_copy_result = in_out_result<I, O>;
// (12)
template<class I, class O>
using remove_copy_if_result = in_out_result<I, O>;
// (13)
template<class I, class O>
using unique_copy_result = in_out_result<I, O>;
// (14)
template<class I, class O>
using reverse_copy_result = in_out_result<I, O>;
// (15)
template<class I, class O>
using rotate_copy_result = in_out_result<I, O>;
// (16)
template<class I, class O>
using partial_sort_copy_result = in_out_result<I, O>;
// (17)
template<class I, class O>
using set_difference_result = in_out_result<I, O>;
}