Skip to content

P2165R4 Compatibility between tuple and tuple-like objects #5694

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Aug 16, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions source/containers.tex
Original file line number Diff line number Diff line change
Expand Up @@ -9308,14 +9308,14 @@
typename iterator_traits<InputIterator>::value_type; // \expos
template<class InputIterator>
using @\placeholder{iter-key-type}@ = remove_const_t<
typename iterator_traits<InputIterator>::value_type::first_type>; // \expos
tuple_element_t<0, @\exposid{iter-value-type}@<InputIterator>>>; // \expos
template<class InputIterator>
using @\placeholder{iter-mapped-type}@ =
typename iterator_traits<InputIterator>::value_type::second_type; // \expos
tuple_element_t<1, @\exposid{iter-value-type}@<InputIterator>>; // \expos
template<class InputIterator>
using @\placeholder{iter-to-alloc-type}@ = pair<
add_const_t<typename iterator_traits<InputIterator>::value_type::first_type>,
typename iterator_traits<InputIterator>::value_type::second_type>; // \expos
add_const_t<tuple_element_t<0, @\exposid{iter-value-type}@<InputIterator>>>,
tuple_element_t<1, @\exposid{iter-value-type}@<InputIterator>>>; // \expos
template<ranges::@\libconcept{input_range}@ Range>
using @\exposid{range-key-type}@ =
remove_const_t<typename ranges::range_value_t<Range>::first_type>; // \expos
Expand Down
52 changes: 11 additions & 41 deletions source/ranges.tex
Original file line number Diff line number Diff line change
Expand Up @@ -1677,20 +1677,9 @@
@\libconcept{convertible_to}@<From, To> &&
!@\exposconcept{uses-nonqualification-pointer-conversion}@<decay_t<From>, decay_t<To>>;

template<class T>
concept @\defexposconceptnc{pair-like}@ = // \expos
!is_reference_v<T> && requires(T t) {
typename tuple_size<T>::type; // ensures \tcode{tuple_size<T>} is complete
requires @\libconcept{derived_from}@<tuple_size<T>, integral_constant<size_t, 2>>;
typename tuple_element_t<0, remove_const_t<T>>;
typename tuple_element_t<1, remove_const_t<T>>;
{ std::get<0>(t) } -> @\libconcept{convertible_to}@<const tuple_element_t<0, T>&>;
{ std::get<1>(t) } -> @\libconcept{convertible_to}@<const tuple_element_t<1, T>&>;
};

template<class T, class U, class V>
concept @\defexposconceptnc{pair-like-convertible-from}@ = // \expos
!@\libconcept{range}@<T> && @\exposconcept{pair-like}@<T> &&
!@\libconcept{range}@<T> && !is_reference_v<T> && @\exposconcept{pair-like}@<T> &&
@\libconcept{constructible_from}@<T, U, V> &&
@\exposconcept{convertible-to-non-slicing}@<U, tuple_element_t<0, T>> &&
@\libconcept{convertible_to}@<V, tuple_element_t<1, T>>;
Expand Down Expand Up @@ -7959,12 +7948,7 @@
namespace std::ranges {
template<class T, size_t N>
concept @\defexposconcept{has-tuple-element}@ = // \expos
requires(T t) {
typename tuple_size<T>::type;
requires N < tuple_size_v<T>;
typename tuple_element_t<N, T>;
{ std::get<N>(t) } -> @\libconcept{convertible_to}@<const tuple_element_t<N, T>&>;
};
@\exposconcept{tuple-like}@<T> && N < tuple_size_v<T>;

template<class T, size_t N>
concept @\defexposconcept{returnable-element}@ = // \expos
Expand Down Expand Up @@ -8594,13 +8578,10 @@
(!(@\libconcept{bidirectional_range}@<Rs> && ...) && (@\libconcept{common_range}@<Rs> && ...)) ||
((@\libconcept{random_access_range}@<Rs> && ...) && (@\libconcept{sized_range}@<Rs> && ...));

template<class... Ts>
using @\exposid{tuple-or-pair}@ = @\seebelow@; // \expos

template<class F, class Tuple>
constexpr auto @\exposid{tuple-transform}@(F&& f, Tuple&& tuple) { // \expos
return apply([&]<class... Ts>(Ts&&... elements) {
return @\exposid{tuple-or-pair}@<invoke_result_t<F&, Ts>...>(
return tuple<invoke_result_t<F&, Ts>...>(
invoke(f, std::forward<Ts>(elements))...
);
}, std::forward<Tuple>(tuple));
Expand Down Expand Up @@ -8664,17 +8645,6 @@
}
\end{codeblock}

\pnum
Given some pack of types \tcode{Ts},
the alias template \exposid{tuple-or-pair} is defined as follows:
\begin{itemize}
\item
If \tcode{sizeof...(Ts)} is 2,
\tcode{\exposid{tuple-or-pair}<Ts...>} denotes \tcode{pair<Ts...>}.
\item
Otherwise, \tcode{\exposid{tuple-or-pair}<Ts...>} denotes \tcode{tuple<Ts...>}.
\end{itemize}

\pnum
Two \tcode{zip_view} objects have the same underlying sequence if and only if
the corresponding elements of \exposid{views_} are equal\iref{concepts.equality}
Expand Down Expand Up @@ -8731,13 +8701,13 @@
requires (@\libconcept{view}@<Views> && ...) && (sizeof...(Views) > 0)
template<bool Const>
class zip_view<Views...>::@\exposid{iterator}@ {
@\exposid{tuple-or-pair}@<iterator_t<@\exposidnc{maybe-const}@<Const, Views>>...> @\exposid{current_}@;@\itcorr[-1]@ // \expos
constexpr explicit @\exposidnc{iterator}@(@\exposid{tuple-or-pair}@<iterator_t<@\exposidnc{maybe-const}@<Const, Views>>...>);
tuple<iterator_t<@\exposidnc{maybe-const}@<Const, Views>>...> @\exposid{current_}@;@\itcorr[-1]@ // \expos
constexpr explicit @\exposidnc{iterator}@(tuple<iterator_t<@\exposidnc{maybe-const}@<Const, Views>>...>);
// \expos
public:
using iterator_category = input_iterator_tag; // not always present
using iterator_concept = @\seebelow@;
using value_type = @\exposid{tuple-or-pair}@<range_value_t<@\exposid{maybe-const}@<Const, Views>>...>;
using value_type = tuple<range_value_t<@\exposid{maybe-const}@<Const, Views>>...>;
using difference_type = common_type_t<range_difference_t<@\exposid{maybe-const}@<Const, Views>>...>;

@\exposid{iterator}@() = default;
Expand Down Expand Up @@ -8813,7 +8783,7 @@
the iterator acquires a singular value.

\begin{itemdecl}
constexpr explicit @\exposid{iterator}@(@\exposid{tuple-or-pair}@<iterator_t<@\exposid{maybe-const}@<Const, Views>>...> current);
constexpr explicit @\exposid{iterator}@(tuple<iterator_t<@\exposid{maybe-const}@<Const, Views>>...> current);
\end{itemdecl}

\begin{itemdescr}
Expand Down Expand Up @@ -9104,8 +9074,8 @@
requires (@\libconcept{view}@<Views> && ...) && (sizeof...(Views) > 0)
template<bool Const>
class zip_view<Views...>::@\exposid{sentinel}@ {
@\exposid{tuple-or-pair}@<sentinel_t<@\exposidnc{maybe-const}@<Const, Views>>...> @\exposid{end_}@;@\itcorr[-1]@ // \expos
constexpr explicit @\exposidnc{sentinel}@(@\exposid{tuple-or-pair}@<sentinel_t<@\exposidnc{maybe-const}@<Const, Views>>...> end);
tuple<sentinel_t<@\exposidnc{maybe-const}@<Const, Views>>...> @\exposid{end_}@;@\itcorr[-1]@ // \expos
constexpr explicit @\exposidnc{sentinel}@(tuple<sentinel_t<@\exposidnc{maybe-const}@<Const, Views>>...> end);
// \expos
public:
@\exposid{sentinel}@() = default;
Expand Down Expand Up @@ -9134,7 +9104,7 @@
\end{codeblock}

\begin{itemdecl}
constexpr explicit @\exposid{sentinel}@(@\exposid{tuple-or-pair}@<sentinel_t<@\exposid{maybe-const}@<Const, Views>>...> end);
constexpr explicit @\exposid{sentinel}@(tuple<sentinel_t<@\exposid{maybe-const}@<Const, Views>>...> end);
\end{itemdecl}

\begin{itemdescr}
Expand Down Expand Up @@ -9879,7 +9849,7 @@
public:
using iterator_category = input_iterator_tag;
using iterator_concept = @\seebelow@;
using value_type = @\exposid{tuple-or-pair}@<@\exposid{REPEAT}@(range_value_t<@\exposid{Base}@>, N)...>;
using value_type = tuple<@\exposid{REPEAT}@(range_value_t<@\exposid{Base}@>, N)...>;
using difference_type = range_difference_t<@\exposid{Base}@>;

@\exposid{iterator}@() = default;
Expand Down
2 changes: 2 additions & 0 deletions source/support.tex
Original file line number Diff line number Diff line change
Expand Up @@ -718,6 +718,8 @@
#define @\defnlibxname{cpp_lib_to_underlying}@ 202102L // also in \libheader{utility}
#define @\defnlibxname{cpp_lib_transformation_trait_aliases}@ 201304L // also in \libheader{type_traits}
#define @\defnlibxname{cpp_lib_transparent_operators}@ 201510L // also in \libheader{memory}, \libheader{functional}
#define @\defnlibxname{cpp_lib_tuple_like}@ 202207L
// also in \libheader{utility}, \libheader{tuple}, \libheader{map}, \libheader{unordered_map}
#define @\defnlibxname{cpp_lib_tuple_element_t}@ 201402L // also in \libheader{tuple}
#define @\defnlibxname{cpp_lib_tuples_by_type}@ 201304L // also in \libheader{utility}, \libheader{tuple}
#define @\defnlibxname{cpp_lib_type_identity}@ 201806L // also in \libheader{type_traits}
Expand Down
Loading