Implement C++17 make_from_tuple.
* include/std/tuple (__make_from_tuple_impl, make_from_tuple): New. * testsuite/20_util/tuple/make_from_tuple/1.cc: Likewise. From-SVN: r239372
This commit is contained in:
parent
b95a64bb00
commit
ca1ab6be3b
3 changed files with 74 additions and 0 deletions
|
@ -1,3 +1,9 @@
|
|||
2016-08-11 Ville Voutilainen <ville.voutilainen@gmail.com>
|
||||
|
||||
Implement C++17 make_from_tuple.
|
||||
* include/std/tuple (__make_from_tuple_impl, make_from_tuple): New.
|
||||
* testsuite/20_util/tuple/make_from_tuple/1.cc: Likewise.
|
||||
|
||||
2016-08-11 Ville Voutilainen <ville.voutilainen@gmail.com>
|
||||
|
||||
Implement LWG 2758.
|
||||
|
|
|
@ -1655,6 +1655,20 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
|||
return __apply_impl(std::forward<_Fn>(__f), std::forward<_Tuple>(__t),
|
||||
_Indices{});
|
||||
}
|
||||
|
||||
template <typename _Tp, typename _Tuple, size_t... _Idx>
|
||||
constexpr _Tp
|
||||
__make_from_tuple_impl(_Tuple&& __t, index_sequence<_Idx...>)
|
||||
{ return _Tp(get<_Idx>(std::forward<_Tuple>(__t))...); }
|
||||
|
||||
template <typename _Tp, typename _Tuple>
|
||||
constexpr _Tp
|
||||
make_from_tuple(_Tuple&& __t)
|
||||
{
|
||||
return __make_from_tuple_impl<_Tp>(
|
||||
std::forward<_Tuple>(__t),
|
||||
make_index_sequence<tuple_size_v<decay_t<_Tuple>>>{});
|
||||
}
|
||||
#endif // C++17
|
||||
|
||||
/// @}
|
||||
|
|
54
libstdc++-v3/testsuite/20_util/tuple/make_from_tuple/1.cc
Normal file
54
libstdc++-v3/testsuite/20_util/tuple/make_from_tuple/1.cc
Normal file
|
@ -0,0 +1,54 @@
|
|||
// Copyright (C) 2016 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 3, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING3. If not see
|
||||
// <http://www.gnu.org/licenses/>.
|
||||
|
||||
// { dg-options "-std=gnu++17" }
|
||||
|
||||
#include <tuple>
|
||||
#include <testsuite_hooks.h>
|
||||
|
||||
template <class T, class U, class V>
|
||||
struct ThreeParam
|
||||
{
|
||||
T t;
|
||||
U u;
|
||||
V v;
|
||||
ThreeParam(const T& t, const U& u, const V& v)
|
||||
: t(t),
|
||||
u(u),
|
||||
v(v) {}
|
||||
};
|
||||
|
||||
void
|
||||
test01()
|
||||
{
|
||||
auto x = std::make_tuple(1024, 'x', 2048);
|
||||
ThreeParam<int, char, int> y
|
||||
= std::make_from_tuple<ThreeParam<int, char, int>>(x);
|
||||
VERIFY(y.t == 1024 && y.u == 'x' && y.v == 2048);
|
||||
auto x2 = std::make_tuple(4096, 'z');
|
||||
std::pair<int, char> z = std::make_from_tuple<std::pair<int, char>>(x2);
|
||||
VERIFY(z.first == 4096 && z.second == 'z');
|
||||
auto x3 = std::make_tuple(8192);
|
||||
int i = std::make_from_tuple<int>(x3);
|
||||
VERIFY(i == 8192);
|
||||
}
|
||||
|
||||
int
|
||||
main()
|
||||
{
|
||||
test01();
|
||||
}
|
Loading…
Add table
Reference in a new issue