Skip to content

Commit d2940b0

Browse files
authored
Merge 2022-07 LWG Motion 12
P2165R4 Compatibility between tuple and tuple-like objects
2 parents d83b9b9 + 3d24612 commit d2940b0

File tree

4 files changed

+399
-107
lines changed

4 files changed

+399
-107
lines changed

source/containers.tex

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9308,14 +9308,14 @@
93089308
typename iterator_traits<InputIterator>::value_type; // \expos
93099309
template<class InputIterator>
93109310
using @\placeholder{iter-key-type}@ = remove_const_t<
9311-
typename iterator_traits<InputIterator>::value_type::first_type>; // \expos
9311+
tuple_element_t<0, @\exposid{iter-value-type}@<InputIterator>>>; // \expos
93129312
template<class InputIterator>
93139313
using @\placeholder{iter-mapped-type}@ =
9314-
typename iterator_traits<InputIterator>::value_type::second_type; // \expos
9314+
tuple_element_t<1, @\exposid{iter-value-type}@<InputIterator>>; // \expos
93159315
template<class InputIterator>
93169316
using @\placeholder{iter-to-alloc-type}@ = pair<
9317-
add_const_t<typename iterator_traits<InputIterator>::value_type::first_type>,
9318-
typename iterator_traits<InputIterator>::value_type::second_type>; // \expos
9317+
add_const_t<tuple_element_t<0, @\exposid{iter-value-type}@<InputIterator>>>,
9318+
tuple_element_t<1, @\exposid{iter-value-type}@<InputIterator>>>; // \expos
93199319
template<ranges::@\libconcept{input_range}@ Range>
93209320
using @\exposid{range-key-type}@ =
93219321
remove_const_t<typename ranges::range_value_t<Range>::first_type>; // \expos

source/ranges.tex

Lines changed: 11 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1677,20 +1677,9 @@
16771677
@\libconcept{convertible_to}@<From, To> &&
16781678
!@\exposconcept{uses-nonqualification-pointer-conversion}@<decay_t<From>, decay_t<To>>;
16791679

1680-
template<class T>
1681-
concept @\defexposconceptnc{pair-like}@ = // \expos
1682-
!is_reference_v<T> && requires(T t) {
1683-
typename tuple_size<T>::type; // ensures \tcode{tuple_size<T>} is complete
1684-
requires @\libconcept{derived_from}@<tuple_size<T>, integral_constant<size_t, 2>>;
1685-
typename tuple_element_t<0, remove_const_t<T>>;
1686-
typename tuple_element_t<1, remove_const_t<T>>;
1687-
{ std::get<0>(t) } -> @\libconcept{convertible_to}@<const tuple_element_t<0, T>&>;
1688-
{ std::get<1>(t) } -> @\libconcept{convertible_to}@<const tuple_element_t<1, T>&>;
1689-
};
1690-
16911680
template<class T, class U, class V>
16921681
concept @\defexposconceptnc{pair-like-convertible-from}@ = // \expos
1693-
!@\libconcept{range}@<T> && @\exposconcept{pair-like}@<T> &&
1682+
!@\libconcept{range}@<T> && !is_reference_v<T> && @\exposconcept{pair-like}@<T> &&
16941683
@\libconcept{constructible_from}@<T, U, V> &&
16951684
@\exposconcept{convertible-to-non-slicing}@<U, tuple_element_t<0, T>> &&
16961685
@\libconcept{convertible_to}@<V, tuple_element_t<1, T>>;
@@ -7959,12 +7948,7 @@
79597948
namespace std::ranges {
79607949
template<class T, size_t N>
79617950
concept @\defexposconcept{has-tuple-element}@ = // \expos
7962-
requires(T t) {
7963-
typename tuple_size<T>::type;
7964-
requires N < tuple_size_v<T>;
7965-
typename tuple_element_t<N, T>;
7966-
{ std::get<N>(t) } -> @\libconcept{convertible_to}@<const tuple_element_t<N, T>&>;
7967-
};
7951+
@\exposconcept{tuple-like}@<T> && N < tuple_size_v<T>;
79687952

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

8597-
template<class... Ts>
8598-
using @\exposid{tuple-or-pair}@ = @\seebelow@; // \expos
8599-
86008581
template<class F, class Tuple>
86018582
constexpr auto @\exposid{tuple-transform}@(F&& f, Tuple&& tuple) { // \expos
86028583
return apply([&]<class... Ts>(Ts&&... elements) {
8603-
return @\exposid{tuple-or-pair}@<invoke_result_t<F&, Ts>...>(
8584+
return tuple<invoke_result_t<F&, Ts>...>(
86048585
invoke(f, std::forward<Ts>(elements))...
86058586
);
86068587
}, std::forward<Tuple>(tuple));
@@ -8664,17 +8645,6 @@
86648645
}
86658646
\end{codeblock}
86668647

8667-
\pnum
8668-
Given some pack of types \tcode{Ts},
8669-
the alias template \exposid{tuple-or-pair} is defined as follows:
8670-
\begin{itemize}
8671-
\item
8672-
If \tcode{sizeof...(Ts)} is 2,
8673-
\tcode{\exposid{tuple-or-pair}<Ts...>} denotes \tcode{pair<Ts...>}.
8674-
\item
8675-
Otherwise, \tcode{\exposid{tuple-or-pair}<Ts...>} denotes \tcode{tuple<Ts...>}.
8676-
\end{itemize}
8677-
86788648
\pnum
86798649
Two \tcode{zip_view} objects have the same underlying sequence if and only if
86808650
the corresponding elements of \exposid{views_} are equal\iref{concepts.equality}
@@ -8731,13 +8701,13 @@
87318701
requires (@\libconcept{view}@<Views> && ...) && (sizeof...(Views) > 0)
87328702
template<bool Const>
87338703
class zip_view<Views...>::@\exposid{iterator}@ {
8734-
@\exposid{tuple-or-pair}@<iterator_t<@\exposidnc{maybe-const}@<Const, Views>>...> @\exposid{current_}@;@\itcorr[-1]@ // \expos
8735-
constexpr explicit @\exposidnc{iterator}@(@\exposid{tuple-or-pair}@<iterator_t<@\exposidnc{maybe-const}@<Const, Views>>...>);
8704+
tuple<iterator_t<@\exposidnc{maybe-const}@<Const, Views>>...> @\exposid{current_}@;@\itcorr[-1]@ // \expos
8705+
constexpr explicit @\exposidnc{iterator}@(tuple<iterator_t<@\exposidnc{maybe-const}@<Const, Views>>...>);
87368706
// \expos
87378707
public:
87388708
using iterator_category = input_iterator_tag; // not always present
87398709
using iterator_concept = @\seebelow@;
8740-
using value_type = @\exposid{tuple-or-pair}@<range_value_t<@\exposid{maybe-const}@<Const, Views>>...>;
8710+
using value_type = tuple<range_value_t<@\exposid{maybe-const}@<Const, Views>>...>;
87418711
using difference_type = common_type_t<range_difference_t<@\exposid{maybe-const}@<Const, Views>>...>;
87428712

87438713
@\exposid{iterator}@() = default;
@@ -8813,7 +8783,7 @@
88138783
the iterator acquires a singular value.
88148784

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

88198789
\begin{itemdescr}
@@ -9104,8 +9074,8 @@
91049074
requires (@\libconcept{view}@<Views> && ...) && (sizeof...(Views) > 0)
91059075
template<bool Const>
91069076
class zip_view<Views...>::@\exposid{sentinel}@ {
9107-
@\exposid{tuple-or-pair}@<sentinel_t<@\exposidnc{maybe-const}@<Const, Views>>...> @\exposid{end_}@;@\itcorr[-1]@ // \expos
9108-
constexpr explicit @\exposidnc{sentinel}@(@\exposid{tuple-or-pair}@<sentinel_t<@\exposidnc{maybe-const}@<Const, Views>>...> end);
9077+
tuple<sentinel_t<@\exposidnc{maybe-const}@<Const, Views>>...> @\exposid{end_}@;@\itcorr[-1]@ // \expos
9078+
constexpr explicit @\exposidnc{sentinel}@(tuple<sentinel_t<@\exposidnc{maybe-const}@<Const, Views>>...> end);
91099079
// \expos
91109080
public:
91119081
@\exposid{sentinel}@() = default;
@@ -9134,7 +9104,7 @@
91349104
\end{codeblock}
91359105

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

91409110
\begin{itemdescr}
@@ -9879,7 +9849,7 @@
98799849
public:
98809850
using iterator_category = input_iterator_tag;
98819851
using iterator_concept = @\seebelow@;
9882-
using value_type = @\exposid{tuple-or-pair}@<@\exposid{REPEAT}@(range_value_t<@\exposid{Base}@>, N)...>;
9852+
using value_type = tuple<@\exposid{REPEAT}@(range_value_t<@\exposid{Base}@>, N)...>;
98839853
using difference_type = range_difference_t<@\exposid{Base}@>;
98849854

98859855
@\exposid{iterator}@() = default;

source/support.tex

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -718,6 +718,8 @@
718718
#define @\defnlibxname{cpp_lib_to_underlying}@ 202102L // also in \libheader{utility}
719719
#define @\defnlibxname{cpp_lib_transformation_trait_aliases}@ 201304L // also in \libheader{type_traits}
720720
#define @\defnlibxname{cpp_lib_transparent_operators}@ 201510L // also in \libheader{memory}, \libheader{functional}
721+
#define @\defnlibxname{cpp_lib_tuple_like}@ 202207L
722+
// also in \libheader{utility}, \libheader{tuple}, \libheader{map}, \libheader{unordered_map}
721723
#define @\defnlibxname{cpp_lib_tuple_element_t}@ 201402L // also in \libheader{tuple}
722724
#define @\defnlibxname{cpp_lib_tuples_by_type}@ 201304L // also in \libheader{utility}, \libheader{tuple}
723725
#define @\defnlibxname{cpp_lib_type_identity}@ 201806L // also in \libheader{type_traits}

0 commit comments

Comments
 (0)