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:
Ville Voutilainen 2016-08-11 17:51:47 +03:00 committed by Ville Voutilainen
parent b95a64bb00
commit ca1ab6be3b
3 changed files with 74 additions and 0 deletions

View file

@ -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.

View file

@ -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
/// @}

View 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();
}