Skip to content

Commit 5d09660

Browse files
committed
[libc++] Simplify the implementation of std::get for pairs
1 parent 22db91c commit 5d09660

File tree

2 files changed

+76
-8
lines changed

2 files changed

+76
-8
lines changed

libcxx/include/__utility/pair.h

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -633,42 +633,42 @@ get(const pair<_T1, _T2>&& __p) _NOEXCEPT {
633633
#if _LIBCPP_STD_VER >= 14
634634
template <class _T1, class _T2>
635635
inline _LIBCPP_HIDE_FROM_ABI constexpr _T1& get(pair<_T1, _T2>& __p) _NOEXCEPT {
636-
return __get_pair<0>::get(__p);
636+
return __p.first;
637637
}
638638

639639
template <class _T1, class _T2>
640640
inline _LIBCPP_HIDE_FROM_ABI constexpr _T1 const& get(pair<_T1, _T2> const& __p) _NOEXCEPT {
641-
return __get_pair<0>::get(__p);
641+
return __p.first;
642642
}
643643

644644
template <class _T1, class _T2>
645645
inline _LIBCPP_HIDE_FROM_ABI constexpr _T1&& get(pair<_T1, _T2>&& __p) _NOEXCEPT {
646-
return __get_pair<0>::get(std::move(__p));
646+
return std::forward<_T1&&>(__p.first);
647647
}
648648

649649
template <class _T1, class _T2>
650650
inline _LIBCPP_HIDE_FROM_ABI constexpr _T1 const&& get(pair<_T1, _T2> const&& __p) _NOEXCEPT {
651-
return __get_pair<0>::get(std::move(__p));
651+
return std::forward<_T1 const&&>(__p.first);
652652
}
653653

654654
template <class _T1, class _T2>
655655
inline _LIBCPP_HIDE_FROM_ABI constexpr _T1& get(pair<_T2, _T1>& __p) _NOEXCEPT {
656-
return __get_pair<1>::get(__p);
656+
return __p.second;
657657
}
658658

659659
template <class _T1, class _T2>
660660
inline _LIBCPP_HIDE_FROM_ABI constexpr _T1 const& get(pair<_T2, _T1> const& __p) _NOEXCEPT {
661-
return __get_pair<1>::get(__p);
661+
return __p.second;
662662
}
663663

664664
template <class _T1, class _T2>
665665
inline _LIBCPP_HIDE_FROM_ABI constexpr _T1&& get(pair<_T2, _T1>&& __p) _NOEXCEPT {
666-
return __get_pair<1>::get(std::move(__p));
666+
return std::forward<_T1&&>(__p.second);
667667
}
668668

669669
template <class _T1, class _T2>
670670
inline _LIBCPP_HIDE_FROM_ABI constexpr _T1 const&& get(pair<_T2, _T1> const&& __p) _NOEXCEPT {
671-
return __get_pair<1>::get(std::move(__p));
671+
return std::forward<_T1 const&&>(__p.second);
672672
}
673673

674674
#endif // _LIBCPP_STD_VER >= 14
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
//===----------------------------------------------------------------------===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
9+
// UNSUPPORTED: c++03, c++11
10+
11+
// <utility>
12+
13+
// template <class T1, class T2> struct pair
14+
15+
// template<size_t I, class T1, class T2>
16+
// typename tuple_element<I, std::pair<T1, T2> >::type&&
17+
// get(pair<T1, T2>&&);
18+
19+
#include <cassert>
20+
#include <utility>
21+
22+
#include "test_macros.h"
23+
24+
TEST_CONSTEXPR_CXX14 bool test() {
25+
int i = 1;
26+
int j = 2;
27+
28+
{
29+
std::pair<int&, int&&> p(i, std::move(j));
30+
assert(&std::get<int&>(p) == &i);
31+
assert(&std::get<int&&>(p) == &j);
32+
33+
assert(&std::get<int&>(std::move(p)) == &i);
34+
assert(std::get<int&&>(std::move(p)) == 2);
35+
36+
const std::pair<int&, int&&> cp(i, std::move(j));
37+
assert(&std::get<int&>(cp) == &i);
38+
assert(&std::get<int&&>(cp) == &j);
39+
40+
assert(&std::get<int&>(std::move(cp)) == &i);
41+
assert(std::get<int&&>(std::move(cp)) == 2);
42+
}
43+
44+
{
45+
std::pair<int&&, int&> p(std::move(i), j);
46+
assert(&std::get<int&>(p) == &j);
47+
assert(&std::get<int&&>(p) == &i);
48+
49+
assert(&std::get<int&>(std::move(p)) == &j);
50+
assert(std::get<int&&>(std::move(p)) == 1);
51+
52+
const std::pair<int&&, int&> cp(std::move(i), j);
53+
assert(&std::get<int&>(cp) == &j);
54+
assert(&std::get<int&&>(cp) == &i);
55+
56+
assert(&std::get<int&>(std::move(cp)) == &j);
57+
assert(std::get<int&&>(std::move(cp)) == 1);
58+
}
59+
60+
return true;
61+
}
62+
63+
int main() {
64+
test();
65+
#if TEST_STD_VER >= 14
66+
static_assert(test());
67+
#endif
68+
}

0 commit comments

Comments
 (0)