2007-03-04 23:59:49 +01:00
|
|
|
// <tuple> -*- C++ -*-
|
|
|
|
|
2019-01-01 13:31:55 +01:00
|
|
|
// Copyright (C) 2007-2019 Free Software Foundation, Inc.
|
2007-03-04 23:59:49 +01:00
|
|
|
//
|
|
|
|
// 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
|
2009-04-09 17:00:19 +02:00
|
|
|
// Free Software Foundation; either version 3, or (at your option)
|
2007-03-04 23:59:49 +01:00
|
|
|
// 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.
|
|
|
|
|
2009-04-09 17:00:19 +02:00
|
|
|
// Under Section 7 of GPL version 3, you are granted additional
|
|
|
|
// permissions described in the GCC Runtime Library Exception, version
|
|
|
|
// 3.1, as published by the Free Software Foundation.
|
|
|
|
|
|
|
|
// You should have received a copy of the GNU General Public License and
|
|
|
|
// a copy of the GCC Runtime Library Exception along with this program;
|
|
|
|
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
|
|
|
|
// <http://www.gnu.org/licenses/>.
|
2007-03-04 23:59:49 +01:00
|
|
|
|
|
|
|
/** @file include/tuple
|
|
|
|
* This is a Standard C++ Library header.
|
|
|
|
*/
|
|
|
|
|
2008-04-10 21:02:57 +02:00
|
|
|
#ifndef _GLIBCXX_TUPLE
|
|
|
|
#define _GLIBCXX_TUPLE 1
|
2007-03-04 23:59:49 +01:00
|
|
|
|
|
|
|
#pragma GCC system_header
|
|
|
|
|
2012-11-10 18:27:22 +01:00
|
|
|
#if __cplusplus < 201103L
|
2010-02-10 20:14:33 +01:00
|
|
|
# include <bits/c++0x_warning.h>
|
2008-05-26 04:19:57 +02:00
|
|
|
#else
|
2007-03-04 23:59:49 +01:00
|
|
|
|
2007-06-01 01:37:56 +02:00
|
|
|
#include <utility>
|
2012-11-07 01:42:19 +01:00
|
|
|
#include <array>
|
2011-05-30 18:31:17 +02:00
|
|
|
#include <bits/uses_allocator.h>
|
2016-08-06 02:06:02 +02:00
|
|
|
#include <bits/invoke.h>
|
2007-06-01 01:37:56 +02:00
|
|
|
|
PR libstdc++/36104 part four
2011-01-30 Benjamin Kosnik <bkoz@redhat.com>
PR libstdc++/36104 part four
* include/bits/c++config (_GLIBCXX_STD): Remove.
(_GLIBCXX_STD_D, _GLIBCXX_PR): Now _GLIBCXX_STD_C.
(_GLIBCXX_P): Now _GLIBCXX_STD_A.
(_GLIBCXX_NAMESPACE_DEBUG, _GLIBCXX_NAMESPACE_PARALLEL,
_GLIBCXX_NAMESPACE_PROFILE, _GLIBCXX_NAMESPACE_VERSION): Remove.
(_GLIBCXX_INLINE_DEBUG, _GLIBCXX_INLINE_PARALLEL,
_GLIBCXX_INLINE_PROFILE): Remove.
(_GLIBCXX_BEGIN_NAMESPACE(X)): Remove.
(_GLIBCXX_END_NAMESPACE): Remove.
(_GLIBCXX_BEGIN_NESTED_NAMESPACE(X, Y)): Remove.
(_GLIBCXX_END_NESTED_NAMESPACE): Remove.
(_GLIBCXX_BEGIN_NAMESPACE_ALGO): Add.
(_GLIBCXX_END_NAMESPACE_ALGO): Add.
(_GLIBCXX_BEGIN_NAMESPACE_CONTAINER): Add.
(_GLIBCXX_END_NAMESPACE_CONTAINER): Add.
(_GLIBCXX_BEGIN_NAMESPACE_VERSION): Add.
(_GLIBCXX_END_NAMESPACE_VERSION): Add.
(_GLIBCXX_BEGIN_LDBL_NAMESPACE): To _GLIBCXX_BEGIN_NAMESPACE_LDBL.
(_GLIBCXX_END_LDBL_NAMESPACE): To _GLIBCXX_END_NAMESPACE_LDBL.
(_GLIBCXX_VISIBILITY_ATTR): Revert to _GLIBCXX_VISIBILITY.
* include/*: Use new macros for namespace scope.
* config/*: Same.
* src/*: Same.
* src/Makefile.am (sources): Remove debug_list.cc, add
compatibility-debug_list-2.cc.
(parallel_sources): Remove parallel_list.cc, add
compatibility-parallel_list-2.cc.
(compatibility-parallel_list-2.[o,lo]): New rule.
* src/Makefile.in: Regenerate.
* src/debug_list.cc: Remove.
* src/parallel_list.cc: Remove.
* src/compatibility-list-2.cc: New.
* src/compatibility-debug_list-2.cc: New.
* src/compatibility-parallel_list-2.cc: New.
* doc/doxygen/user.cfg.in: Adjust macros.
* testsuite/20_util/auto_ptr/assign_neg.cc: Adjust line numbers, macros.
* testsuite/20_util/declval/requirements/1_neg.cc: Same.
* testsuite/20_util/duration/requirements/typedefs_neg1.cc: Same.
* testsuite/20_util/duration/requirements/typedefs_neg2.cc: Same.
* testsuite/20_util/duration/requirements/typedefs_neg3.cc: Same.
* testsuite/20_util/forward/c_neg.cc: Same.
* testsuite/20_util/forward/f_neg.cc: Same.
* testsuite/20_util/make_signed/requirements/typedefs_neg.cc: Same.
* testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc: Same.
* testsuite/20_util/ratio/cons/cons_overflow_neg.cc: Same.
* testsuite/20_util/ratio/operations/ops_overflow_neg.cc: Same.
* testsuite/20_util/shared_ptr/cons/43820_neg.cc: Same.
* testsuite/20_util/weak_ptr/comparison/cmp_neg.cc: Same.
* testsuite/23_containers/deque/requirements/dr438/assign_neg.cc: Same.
* testsuite/23_containers/deque/requirements/dr438/
constructor_1_neg.cc: Same.
* testsuite/23_containers/deque/requirements/dr438/
constructor_2_neg.cc: Same.
* testsuite/23_containers/deque/requirements/dr438/insert_neg.cc: Same.
* testsuite/23_containers/forward_list/capacity/1.cc: Same.
* testsuite/23_containers/forward_list/requirements/dr438/
assign_neg.cc: Same.
* testsuite/23_containers/forward_list/requirements/dr438/
constructor_1_neg.cc: Same.
* testsuite/23_containers/forward_list/requirements/dr438/
constructor_2_neg.cc: Same.
* testsuite/23_containers/forward_list/requirements/dr438/
insert_neg.cc: Same.
* testsuite/23_containers/list/capacity/29134.cc: Same.
* testsuite/23_containers/list/requirements/dr438/assign_neg.cc: Same.
* testsuite/23_containers/list/requirements/dr438/
constructor_1_neg.cc: Same.
* testsuite/23_containers/list/requirements/dr438/
constructor_2_neg.cc: Same.
* testsuite/23_containers/list/requirements/dr438/insert_neg.cc: Same.
* testsuite/23_containers/vector/bool/capacity/29134.cc: Same.
* testsuite/23_containers/vector/bool/modifiers/insert/31370.cc: Same.
* testsuite/23_containers/vector/requirements/dr438/assign_neg.cc: Same.
* testsuite/23_containers/vector/requirements/dr438/
constructor_1_neg.cc: Same.
* testsuite/23_containers/vector/requirements/dr438/
constructor_2_neg.cc: Same.
* testsuite/23_containers/vector/requirements/dr438/insert_neg.cc: Same.
* testsuite/25_algorithms/sort/35588.cc: Same.
* testsuite/27_io/ios_base/cons/assign_neg.cc: Same.
* testsuite/27_io/ios_base/cons/copy_neg.cc: Same.
* testsuite/ext/profile/mutex_extensions_neg.cc: Same.
* testsuite/ext/profile/profiler_algos.cc: Same.
* testsuite/ext/type_traits/add_unsigned_floating_neg.cc: Same.
* testsuite/ext/type_traits/add_unsigned_integer_neg.cc: Same.
* testsuite/ext/type_traits/remove_unsigned_floating_neg.cc: Same.
* testsuite/ext/type_traits/remove_unsigned_integer_neg.cc: Same.
* testsuite/tr1/2_general_utilities/shared_ptr/cons/43820_neg.cc: Same.
From-SVN: r169421
2011-01-30 23:39:36 +01:00
|
|
|
namespace std _GLIBCXX_VISIBILITY(default)
|
|
|
|
{
|
|
|
|
_GLIBCXX_BEGIN_NAMESPACE_VERSION
|
2010-11-02 19:51:23 +01:00
|
|
|
|
2013-02-20 02:52:36 +01:00
|
|
|
/**
|
|
|
|
* @addtogroup utilities
|
|
|
|
* @{
|
|
|
|
*/
|
|
|
|
|
2016-06-07 22:19:19 +02:00
|
|
|
template<typename... _Elements>
|
|
|
|
class tuple;
|
|
|
|
|
|
|
|
template<typename _Tp>
|
|
|
|
struct __is_empty_non_tuple : is_empty<_Tp> { };
|
|
|
|
|
|
|
|
// Using EBO for elements that are tuples causes ambiguous base errors.
|
|
|
|
template<typename _El0, typename... _El>
|
|
|
|
struct __is_empty_non_tuple<tuple<_El0, _El...>> : false_type { };
|
|
|
|
|
|
|
|
// Use the Empty Base-class Optimization for empty, non-final types.
|
|
|
|
template<typename _Tp>
|
|
|
|
using __empty_not_final
|
|
|
|
= typename conditional<__is_final(_Tp), false_type,
|
|
|
|
__is_empty_non_tuple<_Tp>>::type;
|
|
|
|
|
|
|
|
template<std::size_t _Idx, typename _Head,
|
|
|
|
bool = __empty_not_final<_Head>::value>
|
tuple (_Tuple_impl<>::_Tuple_impl(typename std::remove_reference<>::type&&, typename std::remove_reference<>::type&&...), [...]): Add.
2007-12-30 Paolo Carlini <pcarlini@suse.de>
* include/std/tuple (_Tuple_impl<>::_Tuple_impl(typename
std::remove_reference<>::type&&, typename
std::remove_reference<>::type&&...),
_Tuple_impl(const _Tuple_impl<>&), _Tuple_impl(_Tuple_impl&&),
_Tuple_impl(_Tuple_impl<>&&), operator=(_Tuple_impl&&),
operator=(const _Tuple_impl<>&), operator=(_Tuple_impl<>&&)): Add.
(tuple<>::tuple(const _Elements&...), tuple(_UElements&&...),
tuple(tuple&&), tuple(const tuple<>&), tuple(tuple<>&&),
operator=(tuple&&), operator=(const tuple<>&), operator=(tuple<>&&)):
Likewise.
(tuple<_T1, _T2>::tuple(const _T1&, const _T2&, tuple(_U1&&, _U2&&),
tuple(tuple&&), tuple(tuple<>&&), tuple(pair<>&&), operator=(tuple&&),
operator=(tuple<>&&), operator=(pair<>&&)): Likewise.
(tuple<>::tuple(typename __add_c_ref<_Elements>::type...),
tuple<_T1, _T2>::tuple(typename __add_c_ref<>::type,
typename __add_c_ref<>::type)): Remove.
* testsuite/tr1/6_containers/tuple/creation_functions/tie2.cc: New.
* testsuite/20_util/tuple/creation_functions/tie2.cc: Likewise.
* testsuite/20_util/tuple/moveable.cc: Likewise.
From-SVN: r131230
2007-12-30 23:44:42 +01:00
|
|
|
struct _Head_base;
|
|
|
|
|
2008-05-24 01:08:41 +02:00
|
|
|
template<std::size_t _Idx, typename _Head>
|
2007-12-26 16:23:49 +01:00
|
|
|
struct _Head_base<_Idx, _Head, true>
|
|
|
|
: public _Head
|
|
|
|
{
|
2010-11-04 06:53:05 +01:00
|
|
|
constexpr _Head_base()
|
2007-12-26 16:23:49 +01:00
|
|
|
: _Head() { }
|
|
|
|
|
2010-11-24 17:33:14 +01:00
|
|
|
constexpr _Head_base(const _Head& __h)
|
2007-12-26 16:23:49 +01:00
|
|
|
: _Head(__h) { }
|
|
|
|
|
2014-07-29 19:30:34 +02:00
|
|
|
constexpr _Head_base(const _Head_base&) = default;
|
|
|
|
constexpr _Head_base(_Head_base&&) = default;
|
|
|
|
|
|
|
|
template<typename _UHead>
|
2011-08-03 23:05:14 +02:00
|
|
|
constexpr _Head_base(_UHead&& __h)
|
2009-02-06 07:01:40 +01:00
|
|
|
: _Head(std::forward<_UHead>(__h)) { }
|
2007-12-26 16:23:49 +01:00
|
|
|
|
2014-07-29 19:30:34 +02:00
|
|
|
_Head_base(allocator_arg_t, __uses_alloc0)
|
2011-05-30 18:31:17 +02:00
|
|
|
: _Head() { }
|
|
|
|
|
|
|
|
template<typename _Alloc>
|
2014-07-29 19:30:34 +02:00
|
|
|
_Head_base(allocator_arg_t, __uses_alloc1<_Alloc> __a)
|
2011-05-30 18:31:17 +02:00
|
|
|
: _Head(allocator_arg, *__a._M_a) { }
|
|
|
|
|
|
|
|
template<typename _Alloc>
|
2014-07-29 19:30:34 +02:00
|
|
|
_Head_base(allocator_arg_t, __uses_alloc2<_Alloc> __a)
|
2011-05-30 18:31:17 +02:00
|
|
|
: _Head(*__a._M_a) { }
|
|
|
|
|
|
|
|
template<typename _UHead>
|
|
|
|
_Head_base(__uses_alloc0, _UHead&& __uhead)
|
|
|
|
: _Head(std::forward<_UHead>(__uhead)) { }
|
|
|
|
|
|
|
|
template<typename _Alloc, typename _UHead>
|
|
|
|
_Head_base(__uses_alloc1<_Alloc> __a, _UHead&& __uhead)
|
|
|
|
: _Head(allocator_arg, *__a._M_a, std::forward<_UHead>(__uhead)) { }
|
|
|
|
|
|
|
|
template<typename _Alloc, typename _UHead>
|
|
|
|
_Head_base(__uses_alloc2<_Alloc> __a, _UHead&& __uhead)
|
|
|
|
: _Head(std::forward<_UHead>(__uhead), *__a._M_a) { }
|
|
|
|
|
2011-09-13 02:06:25 +02:00
|
|
|
static constexpr _Head&
|
|
|
|
_M_head(_Head_base& __b) noexcept { return __b; }
|
2011-08-03 23:05:14 +02:00
|
|
|
|
2011-09-13 02:06:25 +02:00
|
|
|
static constexpr const _Head&
|
|
|
|
_M_head(const _Head_base& __b) noexcept { return __b; }
|
2007-12-26 16:23:49 +01:00
|
|
|
};
|
|
|
|
|
2008-05-24 01:08:41 +02:00
|
|
|
template<std::size_t _Idx, typename _Head>
|
2007-12-26 16:23:49 +01:00
|
|
|
struct _Head_base<_Idx, _Head, false>
|
|
|
|
{
|
2010-11-04 06:53:05 +01:00
|
|
|
constexpr _Head_base()
|
2007-12-26 16:23:49 +01:00
|
|
|
: _M_head_impl() { }
|
|
|
|
|
2010-11-24 17:33:14 +01:00
|
|
|
constexpr _Head_base(const _Head& __h)
|
2007-12-26 16:23:49 +01:00
|
|
|
: _M_head_impl(__h) { }
|
|
|
|
|
2014-07-29 19:30:34 +02:00
|
|
|
constexpr _Head_base(const _Head_base&) = default;
|
|
|
|
constexpr _Head_base(_Head_base&&) = default;
|
|
|
|
|
|
|
|
template<typename _UHead>
|
2011-08-03 23:05:14 +02:00
|
|
|
constexpr _Head_base(_UHead&& __h)
|
2009-02-06 07:01:40 +01:00
|
|
|
: _M_head_impl(std::forward<_UHead>(__h)) { }
|
2007-12-26 16:23:49 +01:00
|
|
|
|
2014-07-29 19:30:34 +02:00
|
|
|
_Head_base(allocator_arg_t, __uses_alloc0)
|
2011-05-30 18:31:17 +02:00
|
|
|
: _M_head_impl() { }
|
|
|
|
|
|
|
|
template<typename _Alloc>
|
2014-07-29 19:30:34 +02:00
|
|
|
_Head_base(allocator_arg_t, __uses_alloc1<_Alloc> __a)
|
2011-05-30 18:31:17 +02:00
|
|
|
: _M_head_impl(allocator_arg, *__a._M_a) { }
|
|
|
|
|
|
|
|
template<typename _Alloc>
|
2014-07-29 19:30:34 +02:00
|
|
|
_Head_base(allocator_arg_t, __uses_alloc2<_Alloc> __a)
|
2011-05-30 18:31:17 +02:00
|
|
|
: _M_head_impl(*__a._M_a) { }
|
|
|
|
|
|
|
|
template<typename _UHead>
|
|
|
|
_Head_base(__uses_alloc0, _UHead&& __uhead)
|
|
|
|
: _M_head_impl(std::forward<_UHead>(__uhead)) { }
|
|
|
|
|
|
|
|
template<typename _Alloc, typename _UHead>
|
|
|
|
_Head_base(__uses_alloc1<_Alloc> __a, _UHead&& __uhead)
|
|
|
|
: _M_head_impl(allocator_arg, *__a._M_a, std::forward<_UHead>(__uhead))
|
|
|
|
{ }
|
|
|
|
|
|
|
|
template<typename _Alloc, typename _UHead>
|
|
|
|
_Head_base(__uses_alloc2<_Alloc> __a, _UHead&& __uhead)
|
|
|
|
: _M_head_impl(std::forward<_UHead>(__uhead), *__a._M_a) { }
|
|
|
|
|
2011-09-13 02:06:25 +02:00
|
|
|
static constexpr _Head&
|
|
|
|
_M_head(_Head_base& __b) noexcept { return __b._M_head_impl; }
|
2011-08-03 23:05:14 +02:00
|
|
|
|
2011-09-13 02:06:25 +02:00
|
|
|
static constexpr const _Head&
|
|
|
|
_M_head(const _Head_base& __b) noexcept { return __b._M_head_impl; }
|
2007-12-26 16:23:49 +01:00
|
|
|
|
2011-09-13 02:06:25 +02:00
|
|
|
_Head _M_head_impl;
|
2007-12-26 16:23:49 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Contains the actual implementation of the @c tuple template, stored
|
|
|
|
* as a recursive inheritance hierarchy from the first element (most
|
|
|
|
* derived class) to the last (least derived class). The @c Idx
|
|
|
|
* parameter gives the 0-based index of the element stored at this
|
|
|
|
* point in the hierarchy; we use it to implement a constant-time
|
|
|
|
* get() operation.
|
|
|
|
*/
|
2008-05-24 01:08:41 +02:00
|
|
|
template<std::size_t _Idx, typename... _Elements>
|
2016-06-16 15:47:35 +02:00
|
|
|
struct _Tuple_impl;
|
2007-12-26 16:23:49 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Recursive tuple implementation. Here we store the @c Head element
|
|
|
|
* and derive from a @c Tuple_impl containing the remaining elements
|
|
|
|
* (which contains the @c Tail).
|
|
|
|
*/
|
2008-05-24 01:08:41 +02:00
|
|
|
template<std::size_t _Idx, typename _Head, typename... _Tail>
|
2007-12-26 16:23:49 +01:00
|
|
|
struct _Tuple_impl<_Idx, _Head, _Tail...>
|
|
|
|
: public _Tuple_impl<_Idx + 1, _Tail...>,
|
2016-06-07 22:19:19 +02:00
|
|
|
private _Head_base<_Idx, _Head>
|
2007-12-26 16:23:49 +01:00
|
|
|
{
|
2011-05-18 02:12:58 +02:00
|
|
|
template<std::size_t, typename...> friend class _Tuple_impl;
|
|
|
|
|
2007-12-26 16:23:49 +01:00
|
|
|
typedef _Tuple_impl<_Idx + 1, _Tail...> _Inherited;
|
2016-06-07 22:19:19 +02:00
|
|
|
typedef _Head_base<_Idx, _Head> _Base;
|
2007-12-26 16:23:49 +01:00
|
|
|
|
2016-06-16 15:47:35 +02:00
|
|
|
static constexpr _Head&
|
2011-09-13 02:06:25 +02:00
|
|
|
_M_head(_Tuple_impl& __t) noexcept { return _Base::_M_head(__t); }
|
2011-08-03 23:05:14 +02:00
|
|
|
|
2011-09-13 02:06:25 +02:00
|
|
|
static constexpr const _Head&
|
|
|
|
_M_head(const _Tuple_impl& __t) noexcept { return _Base::_M_head(__t); }
|
2007-12-26 16:23:49 +01:00
|
|
|
|
2011-09-13 02:06:25 +02:00
|
|
|
static constexpr _Inherited&
|
|
|
|
_M_tail(_Tuple_impl& __t) noexcept { return __t; }
|
2011-08-03 23:05:14 +02:00
|
|
|
|
2011-09-13 02:06:25 +02:00
|
|
|
static constexpr const _Inherited&
|
|
|
|
_M_tail(const _Tuple_impl& __t) noexcept { return __t; }
|
2007-12-26 16:23:49 +01:00
|
|
|
|
2010-11-04 06:53:05 +01:00
|
|
|
constexpr _Tuple_impl()
|
2007-12-26 16:23:49 +01:00
|
|
|
: _Inherited(), _Base() { }
|
|
|
|
|
2016-06-16 15:47:35 +02:00
|
|
|
explicit
|
2010-11-24 17:33:14 +01:00
|
|
|
constexpr _Tuple_impl(const _Head& __head, const _Tail&... __tail)
|
2007-12-26 16:23:49 +01:00
|
|
|
: _Inherited(__tail...), _Base(__head) { }
|
|
|
|
|
2011-05-30 18:31:17 +02:00
|
|
|
template<typename _UHead, typename... _UTail, typename = typename
|
2016-06-16 15:47:35 +02:00
|
|
|
enable_if<sizeof...(_Tail) == sizeof...(_UTail)>::type>
|
tuple (_Tuple_impl<>::_Tuple_impl(typename std::remove_reference<>::type&&, typename std::remove_reference<>::type&&...), [...]): Add.
2007-12-30 Paolo Carlini <pcarlini@suse.de>
* include/std/tuple (_Tuple_impl<>::_Tuple_impl(typename
std::remove_reference<>::type&&, typename
std::remove_reference<>::type&&...),
_Tuple_impl(const _Tuple_impl<>&), _Tuple_impl(_Tuple_impl&&),
_Tuple_impl(_Tuple_impl<>&&), operator=(_Tuple_impl&&),
operator=(const _Tuple_impl<>&), operator=(_Tuple_impl<>&&)): Add.
(tuple<>::tuple(const _Elements&...), tuple(_UElements&&...),
tuple(tuple&&), tuple(const tuple<>&), tuple(tuple<>&&),
operator=(tuple&&), operator=(const tuple<>&), operator=(tuple<>&&)):
Likewise.
(tuple<_T1, _T2>::tuple(const _T1&, const _T2&, tuple(_U1&&, _U2&&),
tuple(tuple&&), tuple(tuple<>&&), tuple(pair<>&&), operator=(tuple&&),
operator=(tuple<>&&), operator=(pair<>&&)): Likewise.
(tuple<>::tuple(typename __add_c_ref<_Elements>::type...),
tuple<_T1, _T2>::tuple(typename __add_c_ref<>::type,
typename __add_c_ref<>::type)): Remove.
* testsuite/tr1/6_containers/tuple/creation_functions/tie2.cc: New.
* testsuite/20_util/tuple/creation_functions/tie2.cc: Likewise.
* testsuite/20_util/tuple/moveable.cc: Likewise.
From-SVN: r131230
2007-12-30 23:44:42 +01:00
|
|
|
explicit
|
2011-08-03 23:05:14 +02:00
|
|
|
constexpr _Tuple_impl(_UHead&& __head, _UTail&&... __tail)
|
2008-02-18 14:32:01 +01:00
|
|
|
: _Inherited(std::forward<_UTail>(__tail)...),
|
|
|
|
_Base(std::forward<_UHead>(__head)) { }
|
2007-12-26 16:23:49 +01:00
|
|
|
|
2010-11-24 17:33:14 +01:00
|
|
|
constexpr _Tuple_impl(const _Tuple_impl&) = default;
|
2007-12-26 16:23:49 +01:00
|
|
|
|
PR libstdc++/86963 Remove use of __tuple_base in std::tuple
The _Tuple_impl base class can be used to disable copy/move assignment,
without requiring an extra base class.
Exception specifications on std::tuple assignment and swap functions can
be defined directly using is_nothrow_swappable, instead of querying the
base classes.
PR libstdc++/86963
* include/std/tuple (_Tuple_impl::operator=): Define as deleted.
(_Tuple_impl::_M_assign): New functions to perform assignment instead
of assignment operators.
(_Tuple_impl::_M_swap): Remove exception specification.
(_Tuple_impl<_Idx, _Head>): Likewise.
(_TC::_NonNestedTuple, _TC::_NotSameTuple): Use __remove_cvref_t.
(__tuple_base): Remove.
(tuple, tuple<_T1, _T2>): Remove inheritance from __tuple_base.
(tuple::operator=, tuple<_T1, _T2>::operator=): Call _M_assign.
(tuple::swap, tuple<_T1, _T2>::swap): Define exception specification
using __is_nothrow_swappable.
(tuple<_T1, _T2>::tuple(_U1&&, _U2&&)): Use __remove_cvref_t.
From-SVN: r263661
2018-08-20 15:53:56 +02:00
|
|
|
// _GLIBCXX_RESOLVE_LIB_DEFECTS
|
|
|
|
// 2729. Missing SFINAE on std::pair::operator=
|
|
|
|
_Tuple_impl& operator=(const _Tuple_impl&) = delete;
|
|
|
|
|
2011-09-16 02:41:33 +02:00
|
|
|
constexpr
|
2016-10-03 13:06:53 +02:00
|
|
|
_Tuple_impl(_Tuple_impl&& __in)
|
|
|
|
noexcept(__and_<is_nothrow_move_constructible<_Head>,
|
type_traits (__or_, __and_): Add trivial definitions for a single element.
2011-05-30 Paolo Carlini <paolo.carlini@oracle.com>
* include/std/type_traits (__or_, __and_): Add trivial definitions
for a single element.
* include/bits/stl_pair.h: Use __and_ in noexcept specs and
constraints.
(pair<>::pair(pair&&)): Define.
(pair<>::pair(const pair<>&)): Constrain with is_convertible.
(pair<>::pair(pair<>&&)): Likewise, remove noexcept.
* include/std/tuple: Use __and_ in noexcept specs and constraints.
(_Tuple_impl<>::_Tuple_impl(allocator_arg_t, const _Alloc&,
_Tuple_impl&&)): Remove noexcept.
(tuple<>::tuple(_UElements&&...), tuple(const tuple<_UElements...>&),
tuple(tuple<_UElements...>&&), tuple(const pair<_U1, _U2>&),
tuple(pair<_U1, _U2>&&)): Constrain with is_convertible.
* testsuite/20_util/tuple/moveable2.cc: Use = delete.
* testsuite/20_util/make_signed/requirements/typedefs_neg.cc:
Adjust dg-error line numbers.
* testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc:
Likewise.
* testsuite/20_util/declval/requirements/1_neg.cc: Likewise.
* testsuite/20_util/ratio/cons/cons_overflow_neg.cc: Likewise.
* testsuite/20_util/weak_ptr/comparison/cmp_neg.cc: Likewise.
From-SVN: r174464
2011-05-31 04:29:22 +02:00
|
|
|
is_nothrow_move_constructible<_Inherited>>::value)
|
2016-06-16 15:47:35 +02:00
|
|
|
: _Inherited(std::move(_M_tail(__in))),
|
2011-09-13 02:06:25 +02:00
|
|
|
_Base(std::forward<_Head>(_M_head(__in))) { }
|
tuple (_Tuple_impl<>::_Tuple_impl(typename std::remove_reference<>::type&&, typename std::remove_reference<>::type&&...), [...]): Add.
2007-12-30 Paolo Carlini <pcarlini@suse.de>
* include/std/tuple (_Tuple_impl<>::_Tuple_impl(typename
std::remove_reference<>::type&&, typename
std::remove_reference<>::type&&...),
_Tuple_impl(const _Tuple_impl<>&), _Tuple_impl(_Tuple_impl&&),
_Tuple_impl(_Tuple_impl<>&&), operator=(_Tuple_impl&&),
operator=(const _Tuple_impl<>&), operator=(_Tuple_impl<>&&)): Add.
(tuple<>::tuple(const _Elements&...), tuple(_UElements&&...),
tuple(tuple&&), tuple(const tuple<>&), tuple(tuple<>&&),
operator=(tuple&&), operator=(const tuple<>&), operator=(tuple<>&&)):
Likewise.
(tuple<_T1, _T2>::tuple(const _T1&, const _T2&, tuple(_U1&&, _U2&&),
tuple(tuple&&), tuple(tuple<>&&), tuple(pair<>&&), operator=(tuple&&),
operator=(tuple<>&&), operator=(pair<>&&)): Likewise.
(tuple<>::tuple(typename __add_c_ref<_Elements>::type...),
tuple<_T1, _T2>::tuple(typename __add_c_ref<>::type,
typename __add_c_ref<>::type)): Remove.
* testsuite/tr1/6_containers/tuple/creation_functions/tie2.cc: New.
* testsuite/20_util/tuple/creation_functions/tie2.cc: Likewise.
* testsuite/20_util/tuple/moveable.cc: Likewise.
From-SVN: r131230
2007-12-30 23:44:42 +01:00
|
|
|
|
2007-12-26 16:23:49 +01:00
|
|
|
template<typename... _UElements>
|
2011-09-07 02:17:09 +02:00
|
|
|
constexpr _Tuple_impl(const _Tuple_impl<_Idx, _UElements...>& __in)
|
2011-09-13 02:06:25 +02:00
|
|
|
: _Inherited(_Tuple_impl<_Idx, _UElements...>::_M_tail(__in)),
|
|
|
|
_Base(_Tuple_impl<_Idx, _UElements...>::_M_head(__in)) { }
|
tuple (_Tuple_impl<>::_Tuple_impl(typename std::remove_reference<>::type&&, typename std::remove_reference<>::type&&...), [...]): Add.
2007-12-30 Paolo Carlini <pcarlini@suse.de>
* include/std/tuple (_Tuple_impl<>::_Tuple_impl(typename
std::remove_reference<>::type&&, typename
std::remove_reference<>::type&&...),
_Tuple_impl(const _Tuple_impl<>&), _Tuple_impl(_Tuple_impl&&),
_Tuple_impl(_Tuple_impl<>&&), operator=(_Tuple_impl&&),
operator=(const _Tuple_impl<>&), operator=(_Tuple_impl<>&&)): Add.
(tuple<>::tuple(const _Elements&...), tuple(_UElements&&...),
tuple(tuple&&), tuple(const tuple<>&), tuple(tuple<>&&),
operator=(tuple&&), operator=(const tuple<>&), operator=(tuple<>&&)):
Likewise.
(tuple<_T1, _T2>::tuple(const _T1&, const _T2&, tuple(_U1&&, _U2&&),
tuple(tuple&&), tuple(tuple<>&&), tuple(pair<>&&), operator=(tuple&&),
operator=(tuple<>&&), operator=(pair<>&&)): Likewise.
(tuple<>::tuple(typename __add_c_ref<_Elements>::type...),
tuple<_T1, _T2>::tuple(typename __add_c_ref<>::type,
typename __add_c_ref<>::type)): Remove.
* testsuite/tr1/6_containers/tuple/creation_functions/tie2.cc: New.
* testsuite/20_util/tuple/creation_functions/tie2.cc: Likewise.
* testsuite/20_util/tuple/moveable.cc: Likewise.
From-SVN: r131230
2007-12-30 23:44:42 +01:00
|
|
|
|
2011-04-12 12:31:33 +02:00
|
|
|
template<typename _UHead, typename... _UTails>
|
2016-10-03 13:06:53 +02:00
|
|
|
constexpr _Tuple_impl(_Tuple_impl<_Idx, _UHead, _UTails...>&& __in)
|
2011-09-16 02:41:33 +02:00
|
|
|
: _Inherited(std::move
|
|
|
|
(_Tuple_impl<_Idx, _UHead, _UTails...>::_M_tail(__in))),
|
2011-09-13 02:06:25 +02:00
|
|
|
_Base(std::forward<_UHead>
|
|
|
|
(_Tuple_impl<_Idx, _UHead, _UTails...>::_M_head(__in))) { }
|
2007-12-26 16:23:49 +01:00
|
|
|
|
2011-05-30 18:31:17 +02:00
|
|
|
template<typename _Alloc>
|
|
|
|
_Tuple_impl(allocator_arg_t __tag, const _Alloc& __a)
|
|
|
|
: _Inherited(__tag, __a),
|
2014-07-29 19:30:34 +02:00
|
|
|
_Base(__tag, __use_alloc<_Head>(__a)) { }
|
2011-05-30 18:31:17 +02:00
|
|
|
|
|
|
|
template<typename _Alloc>
|
|
|
|
_Tuple_impl(allocator_arg_t __tag, const _Alloc& __a,
|
type_traits (__or_, __and_): Add trivial definitions for a single element.
2011-05-30 Paolo Carlini <paolo.carlini@oracle.com>
* include/std/type_traits (__or_, __and_): Add trivial definitions
for a single element.
* include/bits/stl_pair.h: Use __and_ in noexcept specs and
constraints.
(pair<>::pair(pair&&)): Define.
(pair<>::pair(const pair<>&)): Constrain with is_convertible.
(pair<>::pair(pair<>&&)): Likewise, remove noexcept.
* include/std/tuple: Use __and_ in noexcept specs and constraints.
(_Tuple_impl<>::_Tuple_impl(allocator_arg_t, const _Alloc&,
_Tuple_impl&&)): Remove noexcept.
(tuple<>::tuple(_UElements&&...), tuple(const tuple<_UElements...>&),
tuple(tuple<_UElements...>&&), tuple(const pair<_U1, _U2>&),
tuple(pair<_U1, _U2>&&)): Constrain with is_convertible.
* testsuite/20_util/tuple/moveable2.cc: Use = delete.
* testsuite/20_util/make_signed/requirements/typedefs_neg.cc:
Adjust dg-error line numbers.
* testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc:
Likewise.
* testsuite/20_util/declval/requirements/1_neg.cc: Likewise.
* testsuite/20_util/ratio/cons/cons_overflow_neg.cc: Likewise.
* testsuite/20_util/weak_ptr/comparison/cmp_neg.cc: Likewise.
From-SVN: r174464
2011-05-31 04:29:22 +02:00
|
|
|
const _Head& __head, const _Tail&... __tail)
|
2011-05-30 18:31:17 +02:00
|
|
|
: _Inherited(__tag, __a, __tail...),
|
|
|
|
_Base(__use_alloc<_Head, _Alloc, _Head>(__a), __head) { }
|
|
|
|
|
|
|
|
template<typename _Alloc, typename _UHead, typename... _UTail,
|
type_traits (__or_, __and_): Add trivial definitions for a single element.
2011-05-30 Paolo Carlini <paolo.carlini@oracle.com>
* include/std/type_traits (__or_, __and_): Add trivial definitions
for a single element.
* include/bits/stl_pair.h: Use __and_ in noexcept specs and
constraints.
(pair<>::pair(pair&&)): Define.
(pair<>::pair(const pair<>&)): Constrain with is_convertible.
(pair<>::pair(pair<>&&)): Likewise, remove noexcept.
* include/std/tuple: Use __and_ in noexcept specs and constraints.
(_Tuple_impl<>::_Tuple_impl(allocator_arg_t, const _Alloc&,
_Tuple_impl&&)): Remove noexcept.
(tuple<>::tuple(_UElements&&...), tuple(const tuple<_UElements...>&),
tuple(tuple<_UElements...>&&), tuple(const pair<_U1, _U2>&),
tuple(pair<_U1, _U2>&&)): Constrain with is_convertible.
* testsuite/20_util/tuple/moveable2.cc: Use = delete.
* testsuite/20_util/make_signed/requirements/typedefs_neg.cc:
Adjust dg-error line numbers.
* testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc:
Likewise.
* testsuite/20_util/declval/requirements/1_neg.cc: Likewise.
* testsuite/20_util/ratio/cons/cons_overflow_neg.cc: Likewise.
* testsuite/20_util/weak_ptr/comparison/cmp_neg.cc: Likewise.
From-SVN: r174464
2011-05-31 04:29:22 +02:00
|
|
|
typename = typename enable_if<sizeof...(_Tail)
|
|
|
|
== sizeof...(_UTail)>::type>
|
2011-05-30 18:31:17 +02:00
|
|
|
_Tuple_impl(allocator_arg_t __tag, const _Alloc& __a,
|
|
|
|
_UHead&& __head, _UTail&&... __tail)
|
|
|
|
: _Inherited(__tag, __a, std::forward<_UTail>(__tail)...),
|
|
|
|
_Base(__use_alloc<_Head, _Alloc, _UHead>(__a),
|
|
|
|
std::forward<_UHead>(__head)) { }
|
|
|
|
|
|
|
|
template<typename _Alloc>
|
|
|
|
_Tuple_impl(allocator_arg_t __tag, const _Alloc& __a,
|
|
|
|
const _Tuple_impl& __in)
|
2016-06-16 15:47:35 +02:00
|
|
|
: _Inherited(__tag, __a, _M_tail(__in)),
|
2011-09-13 02:06:25 +02:00
|
|
|
_Base(__use_alloc<_Head, _Alloc, _Head>(__a), _M_head(__in)) { }
|
2011-05-30 18:31:17 +02:00
|
|
|
|
|
|
|
template<typename _Alloc>
|
|
|
|
_Tuple_impl(allocator_arg_t __tag, const _Alloc& __a,
|
|
|
|
_Tuple_impl&& __in)
|
2016-06-16 15:47:35 +02:00
|
|
|
: _Inherited(__tag, __a, std::move(_M_tail(__in))),
|
2011-05-30 18:31:17 +02:00
|
|
|
_Base(__use_alloc<_Head, _Alloc, _Head>(__a),
|
2011-09-13 02:06:25 +02:00
|
|
|
std::forward<_Head>(_M_head(__in))) { }
|
2011-05-30 18:31:17 +02:00
|
|
|
|
|
|
|
template<typename _Alloc, typename... _UElements>
|
|
|
|
_Tuple_impl(allocator_arg_t __tag, const _Alloc& __a,
|
|
|
|
const _Tuple_impl<_Idx, _UElements...>& __in)
|
2011-09-13 02:06:25 +02:00
|
|
|
: _Inherited(__tag, __a,
|
|
|
|
_Tuple_impl<_Idx, _UElements...>::_M_tail(__in)),
|
|
|
|
_Base(__use_alloc<_Head, _Alloc, _Head>(__a),
|
|
|
|
_Tuple_impl<_Idx, _UElements...>::_M_head(__in)) { }
|
2011-05-30 18:31:17 +02:00
|
|
|
|
|
|
|
template<typename _Alloc, typename _UHead, typename... _UTails>
|
|
|
|
_Tuple_impl(allocator_arg_t __tag, const _Alloc& __a,
|
|
|
|
_Tuple_impl<_Idx, _UHead, _UTails...>&& __in)
|
2011-09-13 02:06:25 +02:00
|
|
|
: _Inherited(__tag, __a, std::move
|
|
|
|
(_Tuple_impl<_Idx, _UHead, _UTails...>::_M_tail(__in))),
|
2011-05-30 18:31:17 +02:00
|
|
|
_Base(__use_alloc<_Head, _Alloc, _UHead>(__a),
|
2011-09-13 02:06:25 +02:00
|
|
|
std::forward<_UHead>
|
|
|
|
(_Tuple_impl<_Idx, _UHead, _UTails...>::_M_head(__in))) { }
|
2011-05-30 18:31:17 +02:00
|
|
|
|
tuple (_Tuple_impl<>::_Tuple_impl(typename std::remove_reference<>::type&&, typename std::remove_reference<>::type&&...), [...]): Add.
2007-12-30 Paolo Carlini <pcarlini@suse.de>
* include/std/tuple (_Tuple_impl<>::_Tuple_impl(typename
std::remove_reference<>::type&&, typename
std::remove_reference<>::type&&...),
_Tuple_impl(const _Tuple_impl<>&), _Tuple_impl(_Tuple_impl&&),
_Tuple_impl(_Tuple_impl<>&&), operator=(_Tuple_impl&&),
operator=(const _Tuple_impl<>&), operator=(_Tuple_impl<>&&)): Add.
(tuple<>::tuple(const _Elements&...), tuple(_UElements&&...),
tuple(tuple&&), tuple(const tuple<>&), tuple(tuple<>&&),
operator=(tuple&&), operator=(const tuple<>&), operator=(tuple<>&&)):
Likewise.
(tuple<_T1, _T2>::tuple(const _T1&, const _T2&, tuple(_U1&&, _U2&&),
tuple(tuple&&), tuple(tuple<>&&), tuple(pair<>&&), operator=(tuple&&),
operator=(tuple<>&&), operator=(pair<>&&)): Likewise.
(tuple<>::tuple(typename __add_c_ref<_Elements>::type...),
tuple<_T1, _T2>::tuple(typename __add_c_ref<>::type,
typename __add_c_ref<>::type)): Remove.
* testsuite/tr1/6_containers/tuple/creation_functions/tie2.cc: New.
* testsuite/20_util/tuple/creation_functions/tie2.cc: Likewise.
* testsuite/20_util/tuple/moveable.cc: Likewise.
From-SVN: r131230
2007-12-30 23:44:42 +01:00
|
|
|
template<typename... _UElements>
|
PR libstdc++/86963 Remove use of __tuple_base in std::tuple
The _Tuple_impl base class can be used to disable copy/move assignment,
without requiring an extra base class.
Exception specifications on std::tuple assignment and swap functions can
be defined directly using is_nothrow_swappable, instead of querying the
base classes.
PR libstdc++/86963
* include/std/tuple (_Tuple_impl::operator=): Define as deleted.
(_Tuple_impl::_M_assign): New functions to perform assignment instead
of assignment operators.
(_Tuple_impl::_M_swap): Remove exception specification.
(_Tuple_impl<_Idx, _Head>): Likewise.
(_TC::_NonNestedTuple, _TC::_NotSameTuple): Use __remove_cvref_t.
(__tuple_base): Remove.
(tuple, tuple<_T1, _T2>): Remove inheritance from __tuple_base.
(tuple::operator=, tuple<_T1, _T2>::operator=): Call _M_assign.
(tuple::swap, tuple<_T1, _T2>::swap): Define exception specification
using __is_nothrow_swappable.
(tuple<_T1, _T2>::tuple(_U1&&, _U2&&)): Use __remove_cvref_t.
From-SVN: r263661
2018-08-20 15:53:56 +02:00
|
|
|
void
|
|
|
|
_M_assign(const _Tuple_impl<_Idx, _UElements...>& __in)
|
tuple (_Tuple_impl<>::_Tuple_impl(typename std::remove_reference<>::type&&, typename std::remove_reference<>::type&&...), [...]): Add.
2007-12-30 Paolo Carlini <pcarlini@suse.de>
* include/std/tuple (_Tuple_impl<>::_Tuple_impl(typename
std::remove_reference<>::type&&, typename
std::remove_reference<>::type&&...),
_Tuple_impl(const _Tuple_impl<>&), _Tuple_impl(_Tuple_impl&&),
_Tuple_impl(_Tuple_impl<>&&), operator=(_Tuple_impl&&),
operator=(const _Tuple_impl<>&), operator=(_Tuple_impl<>&&)): Add.
(tuple<>::tuple(const _Elements&...), tuple(_UElements&&...),
tuple(tuple&&), tuple(const tuple<>&), tuple(tuple<>&&),
operator=(tuple&&), operator=(const tuple<>&), operator=(tuple<>&&)):
Likewise.
(tuple<_T1, _T2>::tuple(const _T1&, const _T2&, tuple(_U1&&, _U2&&),
tuple(tuple&&), tuple(tuple<>&&), tuple(pair<>&&), operator=(tuple&&),
operator=(tuple<>&&), operator=(pair<>&&)): Likewise.
(tuple<>::tuple(typename __add_c_ref<_Elements>::type...),
tuple<_T1, _T2>::tuple(typename __add_c_ref<>::type,
typename __add_c_ref<>::type)): Remove.
* testsuite/tr1/6_containers/tuple/creation_functions/tie2.cc: New.
* testsuite/20_util/tuple/creation_functions/tie2.cc: Likewise.
* testsuite/20_util/tuple/moveable.cc: Likewise.
From-SVN: r131230
2007-12-30 23:44:42 +01:00
|
|
|
{
|
2011-09-13 02:06:25 +02:00
|
|
|
_M_head(*this) = _Tuple_impl<_Idx, _UElements...>::_M_head(__in);
|
PR libstdc++/86963 Remove use of __tuple_base in std::tuple
The _Tuple_impl base class can be used to disable copy/move assignment,
without requiring an extra base class.
Exception specifications on std::tuple assignment and swap functions can
be defined directly using is_nothrow_swappable, instead of querying the
base classes.
PR libstdc++/86963
* include/std/tuple (_Tuple_impl::operator=): Define as deleted.
(_Tuple_impl::_M_assign): New functions to perform assignment instead
of assignment operators.
(_Tuple_impl::_M_swap): Remove exception specification.
(_Tuple_impl<_Idx, _Head>): Likewise.
(_TC::_NonNestedTuple, _TC::_NotSameTuple): Use __remove_cvref_t.
(__tuple_base): Remove.
(tuple, tuple<_T1, _T2>): Remove inheritance from __tuple_base.
(tuple::operator=, tuple<_T1, _T2>::operator=): Call _M_assign.
(tuple::swap, tuple<_T1, _T2>::swap): Define exception specification
using __is_nothrow_swappable.
(tuple<_T1, _T2>::tuple(_U1&&, _U2&&)): Use __remove_cvref_t.
From-SVN: r263661
2018-08-20 15:53:56 +02:00
|
|
|
_M_tail(*this)._M_assign(
|
|
|
|
_Tuple_impl<_Idx, _UElements...>::_M_tail(__in));
|
tuple (_Tuple_impl<>::_Tuple_impl(typename std::remove_reference<>::type&&, typename std::remove_reference<>::type&&...), [...]): Add.
2007-12-30 Paolo Carlini <pcarlini@suse.de>
* include/std/tuple (_Tuple_impl<>::_Tuple_impl(typename
std::remove_reference<>::type&&, typename
std::remove_reference<>::type&&...),
_Tuple_impl(const _Tuple_impl<>&), _Tuple_impl(_Tuple_impl&&),
_Tuple_impl(_Tuple_impl<>&&), operator=(_Tuple_impl&&),
operator=(const _Tuple_impl<>&), operator=(_Tuple_impl<>&&)): Add.
(tuple<>::tuple(const _Elements&...), tuple(_UElements&&...),
tuple(tuple&&), tuple(const tuple<>&), tuple(tuple<>&&),
operator=(tuple&&), operator=(const tuple<>&), operator=(tuple<>&&)):
Likewise.
(tuple<_T1, _T2>::tuple(const _T1&, const _T2&, tuple(_U1&&, _U2&&),
tuple(tuple&&), tuple(tuple<>&&), tuple(pair<>&&), operator=(tuple&&),
operator=(tuple<>&&), operator=(pair<>&&)): Likewise.
(tuple<>::tuple(typename __add_c_ref<_Elements>::type...),
tuple<_T1, _T2>::tuple(typename __add_c_ref<>::type,
typename __add_c_ref<>::type)): Remove.
* testsuite/tr1/6_containers/tuple/creation_functions/tie2.cc: New.
* testsuite/20_util/tuple/creation_functions/tie2.cc: Likewise.
* testsuite/20_util/tuple/moveable.cc: Likewise.
From-SVN: r131230
2007-12-30 23:44:42 +01:00
|
|
|
}
|
|
|
|
|
2011-04-12 12:31:33 +02:00
|
|
|
template<typename _UHead, typename... _UTails>
|
PR libstdc++/86963 Remove use of __tuple_base in std::tuple
The _Tuple_impl base class can be used to disable copy/move assignment,
without requiring an extra base class.
Exception specifications on std::tuple assignment and swap functions can
be defined directly using is_nothrow_swappable, instead of querying the
base classes.
PR libstdc++/86963
* include/std/tuple (_Tuple_impl::operator=): Define as deleted.
(_Tuple_impl::_M_assign): New functions to perform assignment instead
of assignment operators.
(_Tuple_impl::_M_swap): Remove exception specification.
(_Tuple_impl<_Idx, _Head>): Likewise.
(_TC::_NonNestedTuple, _TC::_NotSameTuple): Use __remove_cvref_t.
(__tuple_base): Remove.
(tuple, tuple<_T1, _T2>): Remove inheritance from __tuple_base.
(tuple::operator=, tuple<_T1, _T2>::operator=): Call _M_assign.
(tuple::swap, tuple<_T1, _T2>::swap): Define exception specification
using __is_nothrow_swappable.
(tuple<_T1, _T2>::tuple(_U1&&, _U2&&)): Use __remove_cvref_t.
From-SVN: r263661
2018-08-20 15:53:56 +02:00
|
|
|
void
|
|
|
|
_M_assign(_Tuple_impl<_Idx, _UHead, _UTails...>&& __in)
|
tuple (_Tuple_impl<>::_Tuple_impl(typename std::remove_reference<>::type&&, typename std::remove_reference<>::type&&...), [...]): Add.
2007-12-30 Paolo Carlini <pcarlini@suse.de>
* include/std/tuple (_Tuple_impl<>::_Tuple_impl(typename
std::remove_reference<>::type&&, typename
std::remove_reference<>::type&&...),
_Tuple_impl(const _Tuple_impl<>&), _Tuple_impl(_Tuple_impl&&),
_Tuple_impl(_Tuple_impl<>&&), operator=(_Tuple_impl&&),
operator=(const _Tuple_impl<>&), operator=(_Tuple_impl<>&&)): Add.
(tuple<>::tuple(const _Elements&...), tuple(_UElements&&...),
tuple(tuple&&), tuple(const tuple<>&), tuple(tuple<>&&),
operator=(tuple&&), operator=(const tuple<>&), operator=(tuple<>&&)):
Likewise.
(tuple<_T1, _T2>::tuple(const _T1&, const _T2&, tuple(_U1&&, _U2&&),
tuple(tuple&&), tuple(tuple<>&&), tuple(pair<>&&), operator=(tuple&&),
operator=(tuple<>&&), operator=(pair<>&&)): Likewise.
(tuple<>::tuple(typename __add_c_ref<_Elements>::type...),
tuple<_T1, _T2>::tuple(typename __add_c_ref<>::type,
typename __add_c_ref<>::type)): Remove.
* testsuite/tr1/6_containers/tuple/creation_functions/tie2.cc: New.
* testsuite/20_util/tuple/creation_functions/tie2.cc: Likewise.
* testsuite/20_util/tuple/moveable.cc: Likewise.
From-SVN: r131230
2007-12-30 23:44:42 +01:00
|
|
|
{
|
2011-09-13 02:06:25 +02:00
|
|
|
_M_head(*this) = std::forward<_UHead>
|
|
|
|
(_Tuple_impl<_Idx, _UHead, _UTails...>::_M_head(__in));
|
PR libstdc++/86963 Remove use of __tuple_base in std::tuple
The _Tuple_impl base class can be used to disable copy/move assignment,
without requiring an extra base class.
Exception specifications on std::tuple assignment and swap functions can
be defined directly using is_nothrow_swappable, instead of querying the
base classes.
PR libstdc++/86963
* include/std/tuple (_Tuple_impl::operator=): Define as deleted.
(_Tuple_impl::_M_assign): New functions to perform assignment instead
of assignment operators.
(_Tuple_impl::_M_swap): Remove exception specification.
(_Tuple_impl<_Idx, _Head>): Likewise.
(_TC::_NonNestedTuple, _TC::_NotSameTuple): Use __remove_cvref_t.
(__tuple_base): Remove.
(tuple, tuple<_T1, _T2>): Remove inheritance from __tuple_base.
(tuple::operator=, tuple<_T1, _T2>::operator=): Call _M_assign.
(tuple::swap, tuple<_T1, _T2>::swap): Define exception specification
using __is_nothrow_swappable.
(tuple<_T1, _T2>::tuple(_U1&&, _U2&&)): Use __remove_cvref_t.
From-SVN: r263661
2018-08-20 15:53:56 +02:00
|
|
|
_M_tail(*this)._M_assign(
|
|
|
|
std::move(_Tuple_impl<_Idx, _UHead, _UTails...>::_M_tail(__in)));
|
tuple (_Tuple_impl<>::_Tuple_impl(typename std::remove_reference<>::type&&, typename std::remove_reference<>::type&&...), [...]): Add.
2007-12-30 Paolo Carlini <pcarlini@suse.de>
* include/std/tuple (_Tuple_impl<>::_Tuple_impl(typename
std::remove_reference<>::type&&, typename
std::remove_reference<>::type&&...),
_Tuple_impl(const _Tuple_impl<>&), _Tuple_impl(_Tuple_impl&&),
_Tuple_impl(_Tuple_impl<>&&), operator=(_Tuple_impl&&),
operator=(const _Tuple_impl<>&), operator=(_Tuple_impl<>&&)): Add.
(tuple<>::tuple(const _Elements&...), tuple(_UElements&&...),
tuple(tuple&&), tuple(const tuple<>&), tuple(tuple<>&&),
operator=(tuple&&), operator=(const tuple<>&), operator=(tuple<>&&)):
Likewise.
(tuple<_T1, _T2>::tuple(const _T1&, const _T2&, tuple(_U1&&, _U2&&),
tuple(tuple&&), tuple(tuple<>&&), tuple(pair<>&&), operator=(tuple&&),
operator=(tuple<>&&), operator=(pair<>&&)): Likewise.
(tuple<>::tuple(typename __add_c_ref<_Elements>::type...),
tuple<_T1, _T2>::tuple(typename __add_c_ref<>::type,
typename __add_c_ref<>::type)): Remove.
* testsuite/tr1/6_containers/tuple/creation_functions/tie2.cc: New.
* testsuite/20_util/tuple/creation_functions/tie2.cc: Likewise.
* testsuite/20_util/tuple/moveable.cc: Likewise.
From-SVN: r131230
2007-12-30 23:44:42 +01:00
|
|
|
}
|
2008-10-02 00:04:02 +02:00
|
|
|
|
2009-02-06 07:01:40 +01:00
|
|
|
protected:
|
2008-10-02 00:04:02 +02:00
|
|
|
void
|
2011-05-18 02:12:58 +02:00
|
|
|
_M_swap(_Tuple_impl& __in)
|
2008-10-02 00:04:02 +02:00
|
|
|
{
|
2011-05-18 02:12:58 +02:00
|
|
|
using std::swap;
|
2011-09-13 02:06:25 +02:00
|
|
|
swap(_M_head(*this), _M_head(__in));
|
|
|
|
_Inherited::_M_swap(_M_tail(__in));
|
2008-10-02 00:04:02 +02:00
|
|
|
}
|
2007-12-26 16:23:49 +01:00
|
|
|
};
|
|
|
|
|
2015-01-17 01:21:41 +01:00
|
|
|
// Basis case of inheritance recursion.
|
|
|
|
template<std::size_t _Idx, typename _Head>
|
|
|
|
struct _Tuple_impl<_Idx, _Head>
|
2016-06-07 22:19:19 +02:00
|
|
|
: private _Head_base<_Idx, _Head>
|
2015-01-17 01:21:41 +01:00
|
|
|
{
|
|
|
|
template<std::size_t, typename...> friend class _Tuple_impl;
|
|
|
|
|
2016-06-07 22:19:19 +02:00
|
|
|
typedef _Head_base<_Idx, _Head> _Base;
|
2015-01-17 01:21:41 +01:00
|
|
|
|
|
|
|
static constexpr _Head&
|
|
|
|
_M_head(_Tuple_impl& __t) noexcept { return _Base::_M_head(__t); }
|
|
|
|
|
|
|
|
static constexpr const _Head&
|
|
|
|
_M_head(const _Tuple_impl& __t) noexcept { return _Base::_M_head(__t); }
|
|
|
|
|
|
|
|
constexpr _Tuple_impl()
|
|
|
|
: _Base() { }
|
|
|
|
|
|
|
|
explicit
|
|
|
|
constexpr _Tuple_impl(const _Head& __head)
|
|
|
|
: _Base(__head) { }
|
|
|
|
|
2016-10-03 13:06:53 +02:00
|
|
|
template<typename _UHead>
|
2015-01-17 01:21:41 +01:00
|
|
|
explicit
|
|
|
|
constexpr _Tuple_impl(_UHead&& __head)
|
|
|
|
: _Base(std::forward<_UHead>(__head)) { }
|
|
|
|
|
|
|
|
constexpr _Tuple_impl(const _Tuple_impl&) = default;
|
|
|
|
|
PR libstdc++/86963 Remove use of __tuple_base in std::tuple
The _Tuple_impl base class can be used to disable copy/move assignment,
without requiring an extra base class.
Exception specifications on std::tuple assignment and swap functions can
be defined directly using is_nothrow_swappable, instead of querying the
base classes.
PR libstdc++/86963
* include/std/tuple (_Tuple_impl::operator=): Define as deleted.
(_Tuple_impl::_M_assign): New functions to perform assignment instead
of assignment operators.
(_Tuple_impl::_M_swap): Remove exception specification.
(_Tuple_impl<_Idx, _Head>): Likewise.
(_TC::_NonNestedTuple, _TC::_NotSameTuple): Use __remove_cvref_t.
(__tuple_base): Remove.
(tuple, tuple<_T1, _T2>): Remove inheritance from __tuple_base.
(tuple::operator=, tuple<_T1, _T2>::operator=): Call _M_assign.
(tuple::swap, tuple<_T1, _T2>::swap): Define exception specification
using __is_nothrow_swappable.
(tuple<_T1, _T2>::tuple(_U1&&, _U2&&)): Use __remove_cvref_t.
From-SVN: r263661
2018-08-20 15:53:56 +02:00
|
|
|
// _GLIBCXX_RESOLVE_LIB_DEFECTS
|
|
|
|
// 2729. Missing SFINAE on std::pair::operator=
|
|
|
|
_Tuple_impl& operator=(const _Tuple_impl&) = delete;
|
|
|
|
|
2015-01-17 01:21:41 +01:00
|
|
|
constexpr
|
2016-10-03 13:06:53 +02:00
|
|
|
_Tuple_impl(_Tuple_impl&& __in)
|
2015-01-17 01:21:41 +01:00
|
|
|
noexcept(is_nothrow_move_constructible<_Head>::value)
|
|
|
|
: _Base(std::forward<_Head>(_M_head(__in))) { }
|
|
|
|
|
2016-10-03 13:06:53 +02:00
|
|
|
template<typename _UHead>
|
2015-01-17 01:21:41 +01:00
|
|
|
constexpr _Tuple_impl(const _Tuple_impl<_Idx, _UHead>& __in)
|
|
|
|
: _Base(_Tuple_impl<_Idx, _UHead>::_M_head(__in)) { }
|
|
|
|
|
2016-10-03 13:06:53 +02:00
|
|
|
template<typename _UHead>
|
2015-01-17 01:21:41 +01:00
|
|
|
constexpr _Tuple_impl(_Tuple_impl<_Idx, _UHead>&& __in)
|
|
|
|
: _Base(std::forward<_UHead>(_Tuple_impl<_Idx, _UHead>::_M_head(__in)))
|
|
|
|
{ }
|
|
|
|
|
|
|
|
template<typename _Alloc>
|
|
|
|
_Tuple_impl(allocator_arg_t __tag, const _Alloc& __a)
|
|
|
|
: _Base(__tag, __use_alloc<_Head>(__a)) { }
|
|
|
|
|
|
|
|
template<typename _Alloc>
|
|
|
|
_Tuple_impl(allocator_arg_t __tag, const _Alloc& __a,
|
|
|
|
const _Head& __head)
|
|
|
|
: _Base(__use_alloc<_Head, _Alloc, _Head>(__a), __head) { }
|
|
|
|
|
|
|
|
template<typename _Alloc, typename _UHead>
|
|
|
|
_Tuple_impl(allocator_arg_t __tag, const _Alloc& __a,
|
|
|
|
_UHead&& __head)
|
|
|
|
: _Base(__use_alloc<_Head, _Alloc, _UHead>(__a),
|
|
|
|
std::forward<_UHead>(__head)) { }
|
|
|
|
|
|
|
|
template<typename _Alloc>
|
|
|
|
_Tuple_impl(allocator_arg_t __tag, const _Alloc& __a,
|
|
|
|
const _Tuple_impl& __in)
|
|
|
|
: _Base(__use_alloc<_Head, _Alloc, _Head>(__a), _M_head(__in)) { }
|
|
|
|
|
|
|
|
template<typename _Alloc>
|
|
|
|
_Tuple_impl(allocator_arg_t __tag, const _Alloc& __a,
|
|
|
|
_Tuple_impl&& __in)
|
|
|
|
: _Base(__use_alloc<_Head, _Alloc, _Head>(__a),
|
|
|
|
std::forward<_Head>(_M_head(__in))) { }
|
|
|
|
|
|
|
|
template<typename _Alloc, typename _UHead>
|
|
|
|
_Tuple_impl(allocator_arg_t __tag, const _Alloc& __a,
|
|
|
|
const _Tuple_impl<_Idx, _UHead>& __in)
|
|
|
|
: _Base(__use_alloc<_Head, _Alloc, _Head>(__a),
|
|
|
|
_Tuple_impl<_Idx, _UHead>::_M_head(__in)) { }
|
|
|
|
|
|
|
|
template<typename _Alloc, typename _UHead>
|
|
|
|
_Tuple_impl(allocator_arg_t __tag, const _Alloc& __a,
|
|
|
|
_Tuple_impl<_Idx, _UHead>&& __in)
|
|
|
|
: _Base(__use_alloc<_Head, _Alloc, _UHead>(__a),
|
|
|
|
std::forward<_UHead>(_Tuple_impl<_Idx, _UHead>::_M_head(__in)))
|
|
|
|
{ }
|
|
|
|
|
|
|
|
template<typename _UHead>
|
PR libstdc++/86963 Remove use of __tuple_base in std::tuple
The _Tuple_impl base class can be used to disable copy/move assignment,
without requiring an extra base class.
Exception specifications on std::tuple assignment and swap functions can
be defined directly using is_nothrow_swappable, instead of querying the
base classes.
PR libstdc++/86963
* include/std/tuple (_Tuple_impl::operator=): Define as deleted.
(_Tuple_impl::_M_assign): New functions to perform assignment instead
of assignment operators.
(_Tuple_impl::_M_swap): Remove exception specification.
(_Tuple_impl<_Idx, _Head>): Likewise.
(_TC::_NonNestedTuple, _TC::_NotSameTuple): Use __remove_cvref_t.
(__tuple_base): Remove.
(tuple, tuple<_T1, _T2>): Remove inheritance from __tuple_base.
(tuple::operator=, tuple<_T1, _T2>::operator=): Call _M_assign.
(tuple::swap, tuple<_T1, _T2>::swap): Define exception specification
using __is_nothrow_swappable.
(tuple<_T1, _T2>::tuple(_U1&&, _U2&&)): Use __remove_cvref_t.
From-SVN: r263661
2018-08-20 15:53:56 +02:00
|
|
|
void
|
|
|
|
_M_assign(const _Tuple_impl<_Idx, _UHead>& __in)
|
2015-01-17 01:21:41 +01:00
|
|
|
{
|
|
|
|
_M_head(*this) = _Tuple_impl<_Idx, _UHead>::_M_head(__in);
|
|
|
|
}
|
|
|
|
|
|
|
|
template<typename _UHead>
|
PR libstdc++/86963 Remove use of __tuple_base in std::tuple
The _Tuple_impl base class can be used to disable copy/move assignment,
without requiring an extra base class.
Exception specifications on std::tuple assignment and swap functions can
be defined directly using is_nothrow_swappable, instead of querying the
base classes.
PR libstdc++/86963
* include/std/tuple (_Tuple_impl::operator=): Define as deleted.
(_Tuple_impl::_M_assign): New functions to perform assignment instead
of assignment operators.
(_Tuple_impl::_M_swap): Remove exception specification.
(_Tuple_impl<_Idx, _Head>): Likewise.
(_TC::_NonNestedTuple, _TC::_NotSameTuple): Use __remove_cvref_t.
(__tuple_base): Remove.
(tuple, tuple<_T1, _T2>): Remove inheritance from __tuple_base.
(tuple::operator=, tuple<_T1, _T2>::operator=): Call _M_assign.
(tuple::swap, tuple<_T1, _T2>::swap): Define exception specification
using __is_nothrow_swappable.
(tuple<_T1, _T2>::tuple(_U1&&, _U2&&)): Use __remove_cvref_t.
From-SVN: r263661
2018-08-20 15:53:56 +02:00
|
|
|
void
|
|
|
|
_M_assign(_Tuple_impl<_Idx, _UHead>&& __in)
|
2015-01-17 01:21:41 +01:00
|
|
|
{
|
|
|
|
_M_head(*this)
|
|
|
|
= std::forward<_UHead>(_Tuple_impl<_Idx, _UHead>::_M_head(__in));
|
|
|
|
}
|
|
|
|
|
|
|
|
protected:
|
|
|
|
void
|
|
|
|
_M_swap(_Tuple_impl& __in)
|
|
|
|
{
|
|
|
|
using std::swap;
|
|
|
|
swap(_M_head(*this), _M_head(__in));
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
Implement N4387, "Improving pair and tuple", and LWG 2367.
2015-06-30 Ville Voutilainen <ville.voutilainen@gmail.com>
Implement N4387, "Improving pair and tuple", and LWG 2367.
* include/bits/stl_pair.h (_ConstructiblePair,
_ImplicitlyConvertiblePair, _MoveConstructiblePair,
_ImplicitlyMoveConvertiblePair): New.
(pair()): Constrain it.
(pair(const _T1&, const _T2&), pair(const pair<_U1, _U2>&),
pair(_U1&&, const _T2&), pair(const _T1&, _U2&&), pair(_U1&&, _U2&&),
pair(pair<_U1, _U2>&&)): Make conditionally explicit.
* include/std/tuple (_TC, tuple::_TC2, tuple::TCC, tuple::TMC): New.
(tuple()): Constrain it.
(tuple(const _UElements&...), tuple(_UElements&&...),
tuple(const tuple<_UElements...>&), tuple(tuple<_UElements...>&&),
tuple(allocator_arg_t, const _Alloc&, const _UElements&...),
tuple(allocator_arg_t, const _Alloc&, _UElements&&...),
tuple(allocator_arg_t, const _Alloc&, const tuple<_UElements...>&),
tuple(allocator_arg_t, const _Alloc&, tuple<_UElements...>&&),
tuple(const pair<_U1, _U2>&), tuple(pair<_U1, _U2>&&),
tuple(allocator_arg_t, const _Alloc&, const pair<_U1, _U2>&),
tuple(allocator_arg_t, const _Alloc&, pair<_U1, _U2>&&)): Make
conditionally explicit.
* include/experimental/functional (__boyer_moore_array_base): Name
array type explicitly instead of using an empty braced-init-list.
* testsuite/20_util/pair/cons/explicit_construct.cc: New.
* testsuite/20_util/pair/piecewise.cc: Use piecewise_construct.
* testsuite/20_util/pair/requirements/dr2367.cc: New.
* testsuite/20_util/tuple/cons/explicit_construct.cc: New.
* testsuite/20_util/tuple/requirements/dr2367.cc: New.
From-SVN: r225189
2015-06-30 15:26:49 +02:00
|
|
|
// Concept utility functions, reused in conditionally-explicit
|
|
|
|
// constructors.
|
Refactor SFINAE constraints on std::tuple constructors
Replace the _TC class template with the better-named _TupleConstraints
one, which provides a different set of member functions. The new members
do not distinguish construction from lvalues and rvalues, but expects
the caller to do that by providing different template arguments. Within
the std::tuple primary template and std::tuple<T1, T2> partial
specialization the _TupleConstraints members are used via new alias
templates like _ImplicitCtor and _ExplicitCtor which makes the
constructor constraints less verbose and repetitive. For example, where
we previously had:
template<typename... _UElements, typename
enable_if<
_TMC<_UElements...>::template
_MoveConstructibleTuple<_UElements...>()
&& _TMC<_UElements...>::template
_ImplicitlyMoveConvertibleTuple<_UElements...>()
&& (sizeof...(_Elements) >= 1),
bool>::type=true>
constexpr tuple(_UElements&&... __elements)
We now have:
template<typename... _UElements,
bool _Valid = __valid_args<_UElements...>(),
_ImplicitCtor<_Valid, _UElements...> = true>
constexpr
tuple(_UElements&&... __elements)
There are two semantic changes as a result of the refactoring:
- The allocator-extended default constructor is now constrained.
- The rewritten constraints fix PR 90700.
* include/std/tuple (_TC): Replace with _TupleConstraints.
(_TupleConstraints): New helper for SFINAE constraints, with more
expressive member functions to reduce duplication when used.
(tuple::_TC2, tuple::_TMC, tuple::_TNTC): Remove.
(tuple::_TCC): Replace dummy type parameter with bool non-type
parameter that can be used to check the pack size.
(tuple::_ImplicitDefaultCtor, tuple::_ExplicitDefaultCtor)
(tuple::_ImplicitCtor, tuple::_ExplicitCtor): New alias templates for
checking constraints in constructors.
(tuple::__valid_args, tuple::_UseOtherCtor, tuple::__use_other_ctor):
New SFINAE helpers.
(tuple::tuple): Use new helpers to reduce repitition in constraints.
(tuple::tuple(allocator_arg_t, const Alloc&)): Constrain.
(tuple<T1, T2>::_TCC, tuple<T1, T2>::_ImplicitDefaultCtor)
(tuple<T1, T2>::_ExplicitDefaultCtor, tuple<T1, T2>::_ImplicitCtor)
(tuple<T1, T2>::_ExplicitCtor): New alias templates for checking
constraints in constructors.
(tuple::__is_alloc_arg()): New SFINAE helpers.
(tuple<T1, T2>::tuple): Use new helpers to reduce repitition in
constraints.
(tuple<T1, T2>::tuple(allocator_arg_t, const Alloc&)): Constrain.
* testsuite/20_util/tuple/cons/90700.cc: New test.
* testsuite/20_util/tuple/cons/allocators.cc: Add default constructor
to meet new constraint on allocator-extended default constructor.
From-SVN: r271998
2019-06-06 14:13:36 +02:00
|
|
|
template<bool, typename... _Types>
|
|
|
|
struct _TupleConstraints
|
Implement N4387, "Improving pair and tuple", and LWG 2367.
2015-06-30 Ville Voutilainen <ville.voutilainen@gmail.com>
Implement N4387, "Improving pair and tuple", and LWG 2367.
* include/bits/stl_pair.h (_ConstructiblePair,
_ImplicitlyConvertiblePair, _MoveConstructiblePair,
_ImplicitlyMoveConvertiblePair): New.
(pair()): Constrain it.
(pair(const _T1&, const _T2&), pair(const pair<_U1, _U2>&),
pair(_U1&&, const _T2&), pair(const _T1&, _U2&&), pair(_U1&&, _U2&&),
pair(pair<_U1, _U2>&&)): Make conditionally explicit.
* include/std/tuple (_TC, tuple::_TC2, tuple::TCC, tuple::TMC): New.
(tuple()): Constrain it.
(tuple(const _UElements&...), tuple(_UElements&&...),
tuple(const tuple<_UElements...>&), tuple(tuple<_UElements...>&&),
tuple(allocator_arg_t, const _Alloc&, const _UElements&...),
tuple(allocator_arg_t, const _Alloc&, _UElements&&...),
tuple(allocator_arg_t, const _Alloc&, const tuple<_UElements...>&),
tuple(allocator_arg_t, const _Alloc&, tuple<_UElements...>&&),
tuple(const pair<_U1, _U2>&), tuple(pair<_U1, _U2>&&),
tuple(allocator_arg_t, const _Alloc&, const pair<_U1, _U2>&),
tuple(allocator_arg_t, const _Alloc&, pair<_U1, _U2>&&)): Make
conditionally explicit.
* include/experimental/functional (__boyer_moore_array_base): Name
array type explicitly instead of using an empty braced-init-list.
* testsuite/20_util/pair/cons/explicit_construct.cc: New.
* testsuite/20_util/pair/piecewise.cc: Use piecewise_construct.
* testsuite/20_util/pair/requirements/dr2367.cc: New.
* testsuite/20_util/tuple/cons/explicit_construct.cc: New.
* testsuite/20_util/tuple/requirements/dr2367.cc: New.
From-SVN: r225189
2015-06-30 15:26:49 +02:00
|
|
|
{
|
Refactor SFINAE constraints on std::tuple constructors
Replace the _TC class template with the better-named _TupleConstraints
one, which provides a different set of member functions. The new members
do not distinguish construction from lvalues and rvalues, but expects
the caller to do that by providing different template arguments. Within
the std::tuple primary template and std::tuple<T1, T2> partial
specialization the _TupleConstraints members are used via new alias
templates like _ImplicitCtor and _ExplicitCtor which makes the
constructor constraints less verbose and repetitive. For example, where
we previously had:
template<typename... _UElements, typename
enable_if<
_TMC<_UElements...>::template
_MoveConstructibleTuple<_UElements...>()
&& _TMC<_UElements...>::template
_ImplicitlyMoveConvertibleTuple<_UElements...>()
&& (sizeof...(_Elements) >= 1),
bool>::type=true>
constexpr tuple(_UElements&&... __elements)
We now have:
template<typename... _UElements,
bool _Valid = __valid_args<_UElements...>(),
_ImplicitCtor<_Valid, _UElements...> = true>
constexpr
tuple(_UElements&&... __elements)
There are two semantic changes as a result of the refactoring:
- The allocator-extended default constructor is now constrained.
- The rewritten constraints fix PR 90700.
* include/std/tuple (_TC): Replace with _TupleConstraints.
(_TupleConstraints): New helper for SFINAE constraints, with more
expressive member functions to reduce duplication when used.
(tuple::_TC2, tuple::_TMC, tuple::_TNTC): Remove.
(tuple::_TCC): Replace dummy type parameter with bool non-type
parameter that can be used to check the pack size.
(tuple::_ImplicitDefaultCtor, tuple::_ExplicitDefaultCtor)
(tuple::_ImplicitCtor, tuple::_ExplicitCtor): New alias templates for
checking constraints in constructors.
(tuple::__valid_args, tuple::_UseOtherCtor, tuple::__use_other_ctor):
New SFINAE helpers.
(tuple::tuple): Use new helpers to reduce repitition in constraints.
(tuple::tuple(allocator_arg_t, const Alloc&)): Constrain.
(tuple<T1, T2>::_TCC, tuple<T1, T2>::_ImplicitDefaultCtor)
(tuple<T1, T2>::_ExplicitDefaultCtor, tuple<T1, T2>::_ImplicitCtor)
(tuple<T1, T2>::_ExplicitCtor): New alias templates for checking
constraints in constructors.
(tuple::__is_alloc_arg()): New SFINAE helpers.
(tuple<T1, T2>::tuple): Use new helpers to reduce repitition in
constraints.
(tuple<T1, T2>::tuple(allocator_arg_t, const Alloc&)): Constrain.
* testsuite/20_util/tuple/cons/90700.cc: New test.
* testsuite/20_util/tuple/cons/allocators.cc: Add default constructor
to meet new constraint on allocator-extended default constructor.
From-SVN: r271998
2019-06-06 14:13:36 +02:00
|
|
|
// Constraint for a non-explicit constructor.
|
|
|
|
// True iff each Ti in _Types... can be constructed from Ui in _UTypes...
|
|
|
|
// and every Ui is implicitly convertible to Ti.
|
|
|
|
template<typename... _UTypes>
|
|
|
|
static constexpr bool __is_implicitly_constructible()
|
|
|
|
{
|
|
|
|
return __and_<is_constructible<_Types, _UTypes>...,
|
|
|
|
is_convertible<_UTypes, _Types>...
|
|
|
|
>::value;
|
|
|
|
}
|
Implement N4387, "Improving pair and tuple", and LWG 2367.
2015-06-30 Ville Voutilainen <ville.voutilainen@gmail.com>
Implement N4387, "Improving pair and tuple", and LWG 2367.
* include/bits/stl_pair.h (_ConstructiblePair,
_ImplicitlyConvertiblePair, _MoveConstructiblePair,
_ImplicitlyMoveConvertiblePair): New.
(pair()): Constrain it.
(pair(const _T1&, const _T2&), pair(const pair<_U1, _U2>&),
pair(_U1&&, const _T2&), pair(const _T1&, _U2&&), pair(_U1&&, _U2&&),
pair(pair<_U1, _U2>&&)): Make conditionally explicit.
* include/std/tuple (_TC, tuple::_TC2, tuple::TCC, tuple::TMC): New.
(tuple()): Constrain it.
(tuple(const _UElements&...), tuple(_UElements&&...),
tuple(const tuple<_UElements...>&), tuple(tuple<_UElements...>&&),
tuple(allocator_arg_t, const _Alloc&, const _UElements&...),
tuple(allocator_arg_t, const _Alloc&, _UElements&&...),
tuple(allocator_arg_t, const _Alloc&, const tuple<_UElements...>&),
tuple(allocator_arg_t, const _Alloc&, tuple<_UElements...>&&),
tuple(const pair<_U1, _U2>&), tuple(pair<_U1, _U2>&&),
tuple(allocator_arg_t, const _Alloc&, const pair<_U1, _U2>&),
tuple(allocator_arg_t, const _Alloc&, pair<_U1, _U2>&&)): Make
conditionally explicit.
* include/experimental/functional (__boyer_moore_array_base): Name
array type explicitly instead of using an empty braced-init-list.
* testsuite/20_util/pair/cons/explicit_construct.cc: New.
* testsuite/20_util/pair/piecewise.cc: Use piecewise_construct.
* testsuite/20_util/pair/requirements/dr2367.cc: New.
* testsuite/20_util/tuple/cons/explicit_construct.cc: New.
* testsuite/20_util/tuple/requirements/dr2367.cc: New.
From-SVN: r225189
2015-06-30 15:26:49 +02:00
|
|
|
|
Refactor SFINAE constraints on std::tuple constructors
Replace the _TC class template with the better-named _TupleConstraints
one, which provides a different set of member functions. The new members
do not distinguish construction from lvalues and rvalues, but expects
the caller to do that by providing different template arguments. Within
the std::tuple primary template and std::tuple<T1, T2> partial
specialization the _TupleConstraints members are used via new alias
templates like _ImplicitCtor and _ExplicitCtor which makes the
constructor constraints less verbose and repetitive. For example, where
we previously had:
template<typename... _UElements, typename
enable_if<
_TMC<_UElements...>::template
_MoveConstructibleTuple<_UElements...>()
&& _TMC<_UElements...>::template
_ImplicitlyMoveConvertibleTuple<_UElements...>()
&& (sizeof...(_Elements) >= 1),
bool>::type=true>
constexpr tuple(_UElements&&... __elements)
We now have:
template<typename... _UElements,
bool _Valid = __valid_args<_UElements...>(),
_ImplicitCtor<_Valid, _UElements...> = true>
constexpr
tuple(_UElements&&... __elements)
There are two semantic changes as a result of the refactoring:
- The allocator-extended default constructor is now constrained.
- The rewritten constraints fix PR 90700.
* include/std/tuple (_TC): Replace with _TupleConstraints.
(_TupleConstraints): New helper for SFINAE constraints, with more
expressive member functions to reduce duplication when used.
(tuple::_TC2, tuple::_TMC, tuple::_TNTC): Remove.
(tuple::_TCC): Replace dummy type parameter with bool non-type
parameter that can be used to check the pack size.
(tuple::_ImplicitDefaultCtor, tuple::_ExplicitDefaultCtor)
(tuple::_ImplicitCtor, tuple::_ExplicitCtor): New alias templates for
checking constraints in constructors.
(tuple::__valid_args, tuple::_UseOtherCtor, tuple::__use_other_ctor):
New SFINAE helpers.
(tuple::tuple): Use new helpers to reduce repitition in constraints.
(tuple::tuple(allocator_arg_t, const Alloc&)): Constrain.
(tuple<T1, T2>::_TCC, tuple<T1, T2>::_ImplicitDefaultCtor)
(tuple<T1, T2>::_ExplicitDefaultCtor, tuple<T1, T2>::_ImplicitCtor)
(tuple<T1, T2>::_ExplicitCtor): New alias templates for checking
constraints in constructors.
(tuple::__is_alloc_arg()): New SFINAE helpers.
(tuple<T1, T2>::tuple): Use new helpers to reduce repitition in
constraints.
(tuple<T1, T2>::tuple(allocator_arg_t, const Alloc&)): Constrain.
* testsuite/20_util/tuple/cons/90700.cc: New test.
* testsuite/20_util/tuple/cons/allocators.cc: Add default constructor
to meet new constraint on allocator-extended default constructor.
From-SVN: r271998
2019-06-06 14:13:36 +02:00
|
|
|
// Constraint for a non-explicit constructor.
|
|
|
|
// True iff each Ti in _Types... can be constructed from Ui in _UTypes...
|
|
|
|
// but not every Ui is implicitly convertible to Ti.
|
|
|
|
template<typename... _UTypes>
|
|
|
|
static constexpr bool __is_explicitly_constructible()
|
|
|
|
{
|
|
|
|
return __and_<is_constructible<_Types, _UTypes>...,
|
|
|
|
__not_<__and_<is_convertible<_UTypes, _Types>...>>
|
|
|
|
>::value;
|
|
|
|
}
|
Implement N4387, "Improving pair and tuple", and LWG 2367.
2015-06-30 Ville Voutilainen <ville.voutilainen@gmail.com>
Implement N4387, "Improving pair and tuple", and LWG 2367.
* include/bits/stl_pair.h (_ConstructiblePair,
_ImplicitlyConvertiblePair, _MoveConstructiblePair,
_ImplicitlyMoveConvertiblePair): New.
(pair()): Constrain it.
(pair(const _T1&, const _T2&), pair(const pair<_U1, _U2>&),
pair(_U1&&, const _T2&), pair(const _T1&, _U2&&), pair(_U1&&, _U2&&),
pair(pair<_U1, _U2>&&)): Make conditionally explicit.
* include/std/tuple (_TC, tuple::_TC2, tuple::TCC, tuple::TMC): New.
(tuple()): Constrain it.
(tuple(const _UElements&...), tuple(_UElements&&...),
tuple(const tuple<_UElements...>&), tuple(tuple<_UElements...>&&),
tuple(allocator_arg_t, const _Alloc&, const _UElements&...),
tuple(allocator_arg_t, const _Alloc&, _UElements&&...),
tuple(allocator_arg_t, const _Alloc&, const tuple<_UElements...>&),
tuple(allocator_arg_t, const _Alloc&, tuple<_UElements...>&&),
tuple(const pair<_U1, _U2>&), tuple(pair<_U1, _U2>&&),
tuple(allocator_arg_t, const _Alloc&, const pair<_U1, _U2>&),
tuple(allocator_arg_t, const _Alloc&, pair<_U1, _U2>&&)): Make
conditionally explicit.
* include/experimental/functional (__boyer_moore_array_base): Name
array type explicitly instead of using an empty braced-init-list.
* testsuite/20_util/pair/cons/explicit_construct.cc: New.
* testsuite/20_util/pair/piecewise.cc: Use piecewise_construct.
* testsuite/20_util/pair/requirements/dr2367.cc: New.
* testsuite/20_util/tuple/cons/explicit_construct.cc: New.
* testsuite/20_util/tuple/requirements/dr2367.cc: New.
From-SVN: r225189
2015-06-30 15:26:49 +02:00
|
|
|
|
Refactor SFINAE constraints on std::tuple constructors
Replace the _TC class template with the better-named _TupleConstraints
one, which provides a different set of member functions. The new members
do not distinguish construction from lvalues and rvalues, but expects
the caller to do that by providing different template arguments. Within
the std::tuple primary template and std::tuple<T1, T2> partial
specialization the _TupleConstraints members are used via new alias
templates like _ImplicitCtor and _ExplicitCtor which makes the
constructor constraints less verbose and repetitive. For example, where
we previously had:
template<typename... _UElements, typename
enable_if<
_TMC<_UElements...>::template
_MoveConstructibleTuple<_UElements...>()
&& _TMC<_UElements...>::template
_ImplicitlyMoveConvertibleTuple<_UElements...>()
&& (sizeof...(_Elements) >= 1),
bool>::type=true>
constexpr tuple(_UElements&&... __elements)
We now have:
template<typename... _UElements,
bool _Valid = __valid_args<_UElements...>(),
_ImplicitCtor<_Valid, _UElements...> = true>
constexpr
tuple(_UElements&&... __elements)
There are two semantic changes as a result of the refactoring:
- The allocator-extended default constructor is now constrained.
- The rewritten constraints fix PR 90700.
* include/std/tuple (_TC): Replace with _TupleConstraints.
(_TupleConstraints): New helper for SFINAE constraints, with more
expressive member functions to reduce duplication when used.
(tuple::_TC2, tuple::_TMC, tuple::_TNTC): Remove.
(tuple::_TCC): Replace dummy type parameter with bool non-type
parameter that can be used to check the pack size.
(tuple::_ImplicitDefaultCtor, tuple::_ExplicitDefaultCtor)
(tuple::_ImplicitCtor, tuple::_ExplicitCtor): New alias templates for
checking constraints in constructors.
(tuple::__valid_args, tuple::_UseOtherCtor, tuple::__use_other_ctor):
New SFINAE helpers.
(tuple::tuple): Use new helpers to reduce repitition in constraints.
(tuple::tuple(allocator_arg_t, const Alloc&)): Constrain.
(tuple<T1, T2>::_TCC, tuple<T1, T2>::_ImplicitDefaultCtor)
(tuple<T1, T2>::_ExplicitDefaultCtor, tuple<T1, T2>::_ImplicitCtor)
(tuple<T1, T2>::_ExplicitCtor): New alias templates for checking
constraints in constructors.
(tuple::__is_alloc_arg()): New SFINAE helpers.
(tuple<T1, T2>::tuple): Use new helpers to reduce repitition in
constraints.
(tuple<T1, T2>::tuple(allocator_arg_t, const Alloc&)): Constrain.
* testsuite/20_util/tuple/cons/90700.cc: New test.
* testsuite/20_util/tuple/cons/allocators.cc: Add default constructor
to meet new constraint on allocator-extended default constructor.
From-SVN: r271998
2019-06-06 14:13:36 +02:00
|
|
|
static constexpr bool __is_implicitly_default_constructible()
|
|
|
|
{
|
|
|
|
return __and_<std::__is_implicitly_default_constructible<_Types>...
|
|
|
|
>::value;
|
|
|
|
}
|
Implement N4387, "Improving pair and tuple", and LWG 2367.
2015-06-30 Ville Voutilainen <ville.voutilainen@gmail.com>
Implement N4387, "Improving pair and tuple", and LWG 2367.
* include/bits/stl_pair.h (_ConstructiblePair,
_ImplicitlyConvertiblePair, _MoveConstructiblePair,
_ImplicitlyMoveConvertiblePair): New.
(pair()): Constrain it.
(pair(const _T1&, const _T2&), pair(const pair<_U1, _U2>&),
pair(_U1&&, const _T2&), pair(const _T1&, _U2&&), pair(_U1&&, _U2&&),
pair(pair<_U1, _U2>&&)): Make conditionally explicit.
* include/std/tuple (_TC, tuple::_TC2, tuple::TCC, tuple::TMC): New.
(tuple()): Constrain it.
(tuple(const _UElements&...), tuple(_UElements&&...),
tuple(const tuple<_UElements...>&), tuple(tuple<_UElements...>&&),
tuple(allocator_arg_t, const _Alloc&, const _UElements&...),
tuple(allocator_arg_t, const _Alloc&, _UElements&&...),
tuple(allocator_arg_t, const _Alloc&, const tuple<_UElements...>&),
tuple(allocator_arg_t, const _Alloc&, tuple<_UElements...>&&),
tuple(const pair<_U1, _U2>&), tuple(pair<_U1, _U2>&&),
tuple(allocator_arg_t, const _Alloc&, const pair<_U1, _U2>&),
tuple(allocator_arg_t, const _Alloc&, pair<_U1, _U2>&&)): Make
conditionally explicit.
* include/experimental/functional (__boyer_moore_array_base): Name
array type explicitly instead of using an empty braced-init-list.
* testsuite/20_util/pair/cons/explicit_construct.cc: New.
* testsuite/20_util/pair/piecewise.cc: Use piecewise_construct.
* testsuite/20_util/pair/requirements/dr2367.cc: New.
* testsuite/20_util/tuple/cons/explicit_construct.cc: New.
* testsuite/20_util/tuple/requirements/dr2367.cc: New.
From-SVN: r225189
2015-06-30 15:26:49 +02:00
|
|
|
|
Refactor SFINAE constraints on std::tuple constructors
Replace the _TC class template with the better-named _TupleConstraints
one, which provides a different set of member functions. The new members
do not distinguish construction from lvalues and rvalues, but expects
the caller to do that by providing different template arguments. Within
the std::tuple primary template and std::tuple<T1, T2> partial
specialization the _TupleConstraints members are used via new alias
templates like _ImplicitCtor and _ExplicitCtor which makes the
constructor constraints less verbose and repetitive. For example, where
we previously had:
template<typename... _UElements, typename
enable_if<
_TMC<_UElements...>::template
_MoveConstructibleTuple<_UElements...>()
&& _TMC<_UElements...>::template
_ImplicitlyMoveConvertibleTuple<_UElements...>()
&& (sizeof...(_Elements) >= 1),
bool>::type=true>
constexpr tuple(_UElements&&... __elements)
We now have:
template<typename... _UElements,
bool _Valid = __valid_args<_UElements...>(),
_ImplicitCtor<_Valid, _UElements...> = true>
constexpr
tuple(_UElements&&... __elements)
There are two semantic changes as a result of the refactoring:
- The allocator-extended default constructor is now constrained.
- The rewritten constraints fix PR 90700.
* include/std/tuple (_TC): Replace with _TupleConstraints.
(_TupleConstraints): New helper for SFINAE constraints, with more
expressive member functions to reduce duplication when used.
(tuple::_TC2, tuple::_TMC, tuple::_TNTC): Remove.
(tuple::_TCC): Replace dummy type parameter with bool non-type
parameter that can be used to check the pack size.
(tuple::_ImplicitDefaultCtor, tuple::_ExplicitDefaultCtor)
(tuple::_ImplicitCtor, tuple::_ExplicitCtor): New alias templates for
checking constraints in constructors.
(tuple::__valid_args, tuple::_UseOtherCtor, tuple::__use_other_ctor):
New SFINAE helpers.
(tuple::tuple): Use new helpers to reduce repitition in constraints.
(tuple::tuple(allocator_arg_t, const Alloc&)): Constrain.
(tuple<T1, T2>::_TCC, tuple<T1, T2>::_ImplicitDefaultCtor)
(tuple<T1, T2>::_ExplicitDefaultCtor, tuple<T1, T2>::_ImplicitCtor)
(tuple<T1, T2>::_ExplicitCtor): New alias templates for checking
constraints in constructors.
(tuple::__is_alloc_arg()): New SFINAE helpers.
(tuple<T1, T2>::tuple): Use new helpers to reduce repitition in
constraints.
(tuple<T1, T2>::tuple(allocator_arg_t, const Alloc&)): Constrain.
* testsuite/20_util/tuple/cons/90700.cc: New test.
* testsuite/20_util/tuple/cons/allocators.cc: Add default constructor
to meet new constraint on allocator-extended default constructor.
From-SVN: r271998
2019-06-06 14:13:36 +02:00
|
|
|
static constexpr bool __is_explicitly_default_constructible()
|
|
|
|
{
|
|
|
|
return __and_<is_default_constructible<_Types>...,
|
|
|
|
__not_<__and_<
|
|
|
|
std::__is_implicitly_default_constructible<_Types>...>
|
|
|
|
>>::value;
|
|
|
|
}
|
|
|
|
};
|
2015-09-25 18:41:45 +02:00
|
|
|
|
Refactor SFINAE constraints on std::tuple constructors
Replace the _TC class template with the better-named _TupleConstraints
one, which provides a different set of member functions. The new members
do not distinguish construction from lvalues and rvalues, but expects
the caller to do that by providing different template arguments. Within
the std::tuple primary template and std::tuple<T1, T2> partial
specialization the _TupleConstraints members are used via new alias
templates like _ImplicitCtor and _ExplicitCtor which makes the
constructor constraints less verbose and repetitive. For example, where
we previously had:
template<typename... _UElements, typename
enable_if<
_TMC<_UElements...>::template
_MoveConstructibleTuple<_UElements...>()
&& _TMC<_UElements...>::template
_ImplicitlyMoveConvertibleTuple<_UElements...>()
&& (sizeof...(_Elements) >= 1),
bool>::type=true>
constexpr tuple(_UElements&&... __elements)
We now have:
template<typename... _UElements,
bool _Valid = __valid_args<_UElements...>(),
_ImplicitCtor<_Valid, _UElements...> = true>
constexpr
tuple(_UElements&&... __elements)
There are two semantic changes as a result of the refactoring:
- The allocator-extended default constructor is now constrained.
- The rewritten constraints fix PR 90700.
* include/std/tuple (_TC): Replace with _TupleConstraints.
(_TupleConstraints): New helper for SFINAE constraints, with more
expressive member functions to reduce duplication when used.
(tuple::_TC2, tuple::_TMC, tuple::_TNTC): Remove.
(tuple::_TCC): Replace dummy type parameter with bool non-type
parameter that can be used to check the pack size.
(tuple::_ImplicitDefaultCtor, tuple::_ExplicitDefaultCtor)
(tuple::_ImplicitCtor, tuple::_ExplicitCtor): New alias templates for
checking constraints in constructors.
(tuple::__valid_args, tuple::_UseOtherCtor, tuple::__use_other_ctor):
New SFINAE helpers.
(tuple::tuple): Use new helpers to reduce repitition in constraints.
(tuple::tuple(allocator_arg_t, const Alloc&)): Constrain.
(tuple<T1, T2>::_TCC, tuple<T1, T2>::_ImplicitDefaultCtor)
(tuple<T1, T2>::_ExplicitDefaultCtor, tuple<T1, T2>::_ImplicitCtor)
(tuple<T1, T2>::_ExplicitCtor): New alias templates for checking
constraints in constructors.
(tuple::__is_alloc_arg()): New SFINAE helpers.
(tuple<T1, T2>::tuple): Use new helpers to reduce repitition in
constraints.
(tuple<T1, T2>::tuple(allocator_arg_t, const Alloc&)): Constrain.
* testsuite/20_util/tuple/cons/90700.cc: New test.
* testsuite/20_util/tuple/cons/allocators.cc: Add default constructor
to meet new constraint on allocator-extended default constructor.
From-SVN: r271998
2019-06-06 14:13:36 +02:00
|
|
|
// Partial specialization used when a required precondition isn't met,
|
|
|
|
// e.g. when sizeof...(_Types) != sizeof...(_UTypes).
|
|
|
|
template<typename... _Types>
|
|
|
|
struct _TupleConstraints<false, _Types...>
|
2015-09-25 18:41:45 +02:00
|
|
|
{
|
Refactor SFINAE constraints on std::tuple constructors
Replace the _TC class template with the better-named _TupleConstraints
one, which provides a different set of member functions. The new members
do not distinguish construction from lvalues and rvalues, but expects
the caller to do that by providing different template arguments. Within
the std::tuple primary template and std::tuple<T1, T2> partial
specialization the _TupleConstraints members are used via new alias
templates like _ImplicitCtor and _ExplicitCtor which makes the
constructor constraints less verbose and repetitive. For example, where
we previously had:
template<typename... _UElements, typename
enable_if<
_TMC<_UElements...>::template
_MoveConstructibleTuple<_UElements...>()
&& _TMC<_UElements...>::template
_ImplicitlyMoveConvertibleTuple<_UElements...>()
&& (sizeof...(_Elements) >= 1),
bool>::type=true>
constexpr tuple(_UElements&&... __elements)
We now have:
template<typename... _UElements,
bool _Valid = __valid_args<_UElements...>(),
_ImplicitCtor<_Valid, _UElements...> = true>
constexpr
tuple(_UElements&&... __elements)
There are two semantic changes as a result of the refactoring:
- The allocator-extended default constructor is now constrained.
- The rewritten constraints fix PR 90700.
* include/std/tuple (_TC): Replace with _TupleConstraints.
(_TupleConstraints): New helper for SFINAE constraints, with more
expressive member functions to reduce duplication when used.
(tuple::_TC2, tuple::_TMC, tuple::_TNTC): Remove.
(tuple::_TCC): Replace dummy type parameter with bool non-type
parameter that can be used to check the pack size.
(tuple::_ImplicitDefaultCtor, tuple::_ExplicitDefaultCtor)
(tuple::_ImplicitCtor, tuple::_ExplicitCtor): New alias templates for
checking constraints in constructors.
(tuple::__valid_args, tuple::_UseOtherCtor, tuple::__use_other_ctor):
New SFINAE helpers.
(tuple::tuple): Use new helpers to reduce repitition in constraints.
(tuple::tuple(allocator_arg_t, const Alloc&)): Constrain.
(tuple<T1, T2>::_TCC, tuple<T1, T2>::_ImplicitDefaultCtor)
(tuple<T1, T2>::_ExplicitDefaultCtor, tuple<T1, T2>::_ImplicitCtor)
(tuple<T1, T2>::_ExplicitCtor): New alias templates for checking
constraints in constructors.
(tuple::__is_alloc_arg()): New SFINAE helpers.
(tuple<T1, T2>::tuple): Use new helpers to reduce repitition in
constraints.
(tuple<T1, T2>::tuple(allocator_arg_t, const Alloc&)): Constrain.
* testsuite/20_util/tuple/cons/90700.cc: New test.
* testsuite/20_util/tuple/cons/allocators.cc: Add default constructor
to meet new constraint on allocator-extended default constructor.
From-SVN: r271998
2019-06-06 14:13:36 +02:00
|
|
|
template<typename... _UTypes>
|
|
|
|
static constexpr bool __is_implicitly_constructible()
|
|
|
|
{ return false; }
|
PR libstdc++/86963 Remove use of __tuple_base in std::tuple
The _Tuple_impl base class can be used to disable copy/move assignment,
without requiring an extra base class.
Exception specifications on std::tuple assignment and swap functions can
be defined directly using is_nothrow_swappable, instead of querying the
base classes.
PR libstdc++/86963
* include/std/tuple (_Tuple_impl::operator=): Define as deleted.
(_Tuple_impl::_M_assign): New functions to perform assignment instead
of assignment operators.
(_Tuple_impl::_M_swap): Remove exception specification.
(_Tuple_impl<_Idx, _Head>): Likewise.
(_TC::_NonNestedTuple, _TC::_NotSameTuple): Use __remove_cvref_t.
(__tuple_base): Remove.
(tuple, tuple<_T1, _T2>): Remove inheritance from __tuple_base.
(tuple::operator=, tuple<_T1, _T2>::operator=): Call _M_assign.
(tuple::swap, tuple<_T1, _T2>::swap): Define exception specification
using __is_nothrow_swappable.
(tuple<_T1, _T2>::tuple(_U1&&, _U2&&)): Use __remove_cvref_t.
From-SVN: r263661
2018-08-20 15:53:56 +02:00
|
|
|
|
Refactor SFINAE constraints on std::tuple constructors
Replace the _TC class template with the better-named _TupleConstraints
one, which provides a different set of member functions. The new members
do not distinguish construction from lvalues and rvalues, but expects
the caller to do that by providing different template arguments. Within
the std::tuple primary template and std::tuple<T1, T2> partial
specialization the _TupleConstraints members are used via new alias
templates like _ImplicitCtor and _ExplicitCtor which makes the
constructor constraints less verbose and repetitive. For example, where
we previously had:
template<typename... _UElements, typename
enable_if<
_TMC<_UElements...>::template
_MoveConstructibleTuple<_UElements...>()
&& _TMC<_UElements...>::template
_ImplicitlyMoveConvertibleTuple<_UElements...>()
&& (sizeof...(_Elements) >= 1),
bool>::type=true>
constexpr tuple(_UElements&&... __elements)
We now have:
template<typename... _UElements,
bool _Valid = __valid_args<_UElements...>(),
_ImplicitCtor<_Valid, _UElements...> = true>
constexpr
tuple(_UElements&&... __elements)
There are two semantic changes as a result of the refactoring:
- The allocator-extended default constructor is now constrained.
- The rewritten constraints fix PR 90700.
* include/std/tuple (_TC): Replace with _TupleConstraints.
(_TupleConstraints): New helper for SFINAE constraints, with more
expressive member functions to reduce duplication when used.
(tuple::_TC2, tuple::_TMC, tuple::_TNTC): Remove.
(tuple::_TCC): Replace dummy type parameter with bool non-type
parameter that can be used to check the pack size.
(tuple::_ImplicitDefaultCtor, tuple::_ExplicitDefaultCtor)
(tuple::_ImplicitCtor, tuple::_ExplicitCtor): New alias templates for
checking constraints in constructors.
(tuple::__valid_args, tuple::_UseOtherCtor, tuple::__use_other_ctor):
New SFINAE helpers.
(tuple::tuple): Use new helpers to reduce repitition in constraints.
(tuple::tuple(allocator_arg_t, const Alloc&)): Constrain.
(tuple<T1, T2>::_TCC, tuple<T1, T2>::_ImplicitDefaultCtor)
(tuple<T1, T2>::_ExplicitDefaultCtor, tuple<T1, T2>::_ImplicitCtor)
(tuple<T1, T2>::_ExplicitCtor): New alias templates for checking
constraints in constructors.
(tuple::__is_alloc_arg()): New SFINAE helpers.
(tuple<T1, T2>::tuple): Use new helpers to reduce repitition in
constraints.
(tuple<T1, T2>::tuple(allocator_arg_t, const Alloc&)): Constrain.
* testsuite/20_util/tuple/cons/90700.cc: New test.
* testsuite/20_util/tuple/cons/allocators.cc: Add default constructor
to meet new constraint on allocator-extended default constructor.
From-SVN: r271998
2019-06-06 14:13:36 +02:00
|
|
|
template<typename... _UTypes>
|
|
|
|
static constexpr bool __is_explicitly_constructible()
|
|
|
|
{ return false; }
|
|
|
|
};
|
Implement N4387, "Improving pair and tuple", and LWG 2367.
2015-06-30 Ville Voutilainen <ville.voutilainen@gmail.com>
Implement N4387, "Improving pair and tuple", and LWG 2367.
* include/bits/stl_pair.h (_ConstructiblePair,
_ImplicitlyConvertiblePair, _MoveConstructiblePair,
_ImplicitlyMoveConvertiblePair): New.
(pair()): Constrain it.
(pair(const _T1&, const _T2&), pair(const pair<_U1, _U2>&),
pair(_U1&&, const _T2&), pair(const _T1&, _U2&&), pair(_U1&&, _U2&&),
pair(pair<_U1, _U2>&&)): Make conditionally explicit.
* include/std/tuple (_TC, tuple::_TC2, tuple::TCC, tuple::TMC): New.
(tuple()): Constrain it.
(tuple(const _UElements&...), tuple(_UElements&&...),
tuple(const tuple<_UElements...>&), tuple(tuple<_UElements...>&&),
tuple(allocator_arg_t, const _Alloc&, const _UElements&...),
tuple(allocator_arg_t, const _Alloc&, _UElements&&...),
tuple(allocator_arg_t, const _Alloc&, const tuple<_UElements...>&),
tuple(allocator_arg_t, const _Alloc&, tuple<_UElements...>&&),
tuple(const pair<_U1, _U2>&), tuple(pair<_U1, _U2>&&),
tuple(allocator_arg_t, const _Alloc&, const pair<_U1, _U2>&),
tuple(allocator_arg_t, const _Alloc&, pair<_U1, _U2>&&)): Make
conditionally explicit.
* include/experimental/functional (__boyer_moore_array_base): Name
array type explicitly instead of using an empty braced-init-list.
* testsuite/20_util/pair/cons/explicit_construct.cc: New.
* testsuite/20_util/pair/piecewise.cc: Use piecewise_construct.
* testsuite/20_util/pair/requirements/dr2367.cc: New.
* testsuite/20_util/tuple/cons/explicit_construct.cc: New.
* testsuite/20_util/tuple/requirements/dr2367.cc: New.
From-SVN: r225189
2015-06-30 15:26:49 +02:00
|
|
|
|
2011-08-03 23:05:14 +02:00
|
|
|
/// Primary class template, tuple
|
2016-06-16 15:47:35 +02:00
|
|
|
template<typename... _Elements>
|
PR libstdc++/86963 Remove use of __tuple_base in std::tuple
The _Tuple_impl base class can be used to disable copy/move assignment,
without requiring an extra base class.
Exception specifications on std::tuple assignment and swap functions can
be defined directly using is_nothrow_swappable, instead of querying the
base classes.
PR libstdc++/86963
* include/std/tuple (_Tuple_impl::operator=): Define as deleted.
(_Tuple_impl::_M_assign): New functions to perform assignment instead
of assignment operators.
(_Tuple_impl::_M_swap): Remove exception specification.
(_Tuple_impl<_Idx, _Head>): Likewise.
(_TC::_NonNestedTuple, _TC::_NotSameTuple): Use __remove_cvref_t.
(__tuple_base): Remove.
(tuple, tuple<_T1, _T2>): Remove inheritance from __tuple_base.
(tuple::operator=, tuple<_T1, _T2>::operator=): Call _M_assign.
(tuple::swap, tuple<_T1, _T2>::swap): Define exception specification
using __is_nothrow_swappable.
(tuple<_T1, _T2>::tuple(_U1&&, _U2&&)): Use __remove_cvref_t.
From-SVN: r263661
2018-08-20 15:53:56 +02:00
|
|
|
class tuple : public _Tuple_impl<0, _Elements...>
|
2007-12-26 16:23:49 +01:00
|
|
|
{
|
|
|
|
typedef _Tuple_impl<0, _Elements...> _Inherited;
|
|
|
|
|
Refactor SFINAE constraints on std::tuple constructors
Replace the _TC class template with the better-named _TupleConstraints
one, which provides a different set of member functions. The new members
do not distinguish construction from lvalues and rvalues, but expects
the caller to do that by providing different template arguments. Within
the std::tuple primary template and std::tuple<T1, T2> partial
specialization the _TupleConstraints members are used via new alias
templates like _ImplicitCtor and _ExplicitCtor which makes the
constructor constraints less verbose and repetitive. For example, where
we previously had:
template<typename... _UElements, typename
enable_if<
_TMC<_UElements...>::template
_MoveConstructibleTuple<_UElements...>()
&& _TMC<_UElements...>::template
_ImplicitlyMoveConvertibleTuple<_UElements...>()
&& (sizeof...(_Elements) >= 1),
bool>::type=true>
constexpr tuple(_UElements&&... __elements)
We now have:
template<typename... _UElements,
bool _Valid = __valid_args<_UElements...>(),
_ImplicitCtor<_Valid, _UElements...> = true>
constexpr
tuple(_UElements&&... __elements)
There are two semantic changes as a result of the refactoring:
- The allocator-extended default constructor is now constrained.
- The rewritten constraints fix PR 90700.
* include/std/tuple (_TC): Replace with _TupleConstraints.
(_TupleConstraints): New helper for SFINAE constraints, with more
expressive member functions to reduce duplication when used.
(tuple::_TC2, tuple::_TMC, tuple::_TNTC): Remove.
(tuple::_TCC): Replace dummy type parameter with bool non-type
parameter that can be used to check the pack size.
(tuple::_ImplicitDefaultCtor, tuple::_ExplicitDefaultCtor)
(tuple::_ImplicitCtor, tuple::_ExplicitCtor): New alias templates for
checking constraints in constructors.
(tuple::__valid_args, tuple::_UseOtherCtor, tuple::__use_other_ctor):
New SFINAE helpers.
(tuple::tuple): Use new helpers to reduce repitition in constraints.
(tuple::tuple(allocator_arg_t, const Alloc&)): Constrain.
(tuple<T1, T2>::_TCC, tuple<T1, T2>::_ImplicitDefaultCtor)
(tuple<T1, T2>::_ExplicitDefaultCtor, tuple<T1, T2>::_ImplicitCtor)
(tuple<T1, T2>::_ExplicitCtor): New alias templates for checking
constraints in constructors.
(tuple::__is_alloc_arg()): New SFINAE helpers.
(tuple<T1, T2>::tuple): Use new helpers to reduce repitition in
constraints.
(tuple<T1, T2>::tuple(allocator_arg_t, const Alloc&)): Constrain.
* testsuite/20_util/tuple/cons/90700.cc: New test.
* testsuite/20_util/tuple/cons/allocators.cc: Add default constructor
to meet new constraint on allocator-extended default constructor.
From-SVN: r271998
2019-06-06 14:13:36 +02:00
|
|
|
template<bool _Cond>
|
|
|
|
using _TCC = _TupleConstraints<_Cond, _Elements...>;
|
|
|
|
|
|
|
|
// Constraint for non-explicit default constructor
|
|
|
|
template<bool _Dummy>
|
|
|
|
using _ImplicitDefaultCtor = __enable_if_t<
|
|
|
|
_TCC<_Dummy>::__is_implicitly_default_constructible(),
|
|
|
|
bool>;
|
|
|
|
|
|
|
|
// Constraint for explicit default constructor
|
|
|
|
template<bool _Dummy>
|
|
|
|
using _ExplicitDefaultCtor = __enable_if_t<
|
|
|
|
_TCC<_Dummy>::__is_explicitly_default_constructible(),
|
|
|
|
bool>;
|
|
|
|
|
|
|
|
// Constraint for non-explicit constructors
|
|
|
|
template<bool _Cond, typename... _Args>
|
|
|
|
using _ImplicitCtor = __enable_if_t<
|
|
|
|
_TCC<_Cond>::template __is_implicitly_constructible<_Args...>(),
|
|
|
|
bool>;
|
|
|
|
|
|
|
|
// Constraint for non-explicit constructors
|
|
|
|
template<bool _Cond, typename... _Args>
|
|
|
|
using _ExplicitCtor = __enable_if_t<
|
|
|
|
_TCC<_Cond>::template __is_explicitly_constructible<_Args...>(),
|
|
|
|
bool>;
|
Implement N4387, "Improving pair and tuple", and LWG 2367.
2015-06-30 Ville Voutilainen <ville.voutilainen@gmail.com>
Implement N4387, "Improving pair and tuple", and LWG 2367.
* include/bits/stl_pair.h (_ConstructiblePair,
_ImplicitlyConvertiblePair, _MoveConstructiblePair,
_ImplicitlyMoveConvertiblePair): New.
(pair()): Constrain it.
(pair(const _T1&, const _T2&), pair(const pair<_U1, _U2>&),
pair(_U1&&, const _T2&), pair(const _T1&, _U2&&), pair(_U1&&, _U2&&),
pair(pair<_U1, _U2>&&)): Make conditionally explicit.
* include/std/tuple (_TC, tuple::_TC2, tuple::TCC, tuple::TMC): New.
(tuple()): Constrain it.
(tuple(const _UElements&...), tuple(_UElements&&...),
tuple(const tuple<_UElements...>&), tuple(tuple<_UElements...>&&),
tuple(allocator_arg_t, const _Alloc&, const _UElements&...),
tuple(allocator_arg_t, const _Alloc&, _UElements&&...),
tuple(allocator_arg_t, const _Alloc&, const tuple<_UElements...>&),
tuple(allocator_arg_t, const _Alloc&, tuple<_UElements...>&&),
tuple(const pair<_U1, _U2>&), tuple(pair<_U1, _U2>&&),
tuple(allocator_arg_t, const _Alloc&, const pair<_U1, _U2>&),
tuple(allocator_arg_t, const _Alloc&, pair<_U1, _U2>&&)): Make
conditionally explicit.
* include/experimental/functional (__boyer_moore_array_base): Name
array type explicitly instead of using an empty braced-init-list.
* testsuite/20_util/pair/cons/explicit_construct.cc: New.
* testsuite/20_util/pair/piecewise.cc: Use piecewise_construct.
* testsuite/20_util/pair/requirements/dr2367.cc: New.
* testsuite/20_util/tuple/cons/explicit_construct.cc: New.
* testsuite/20_util/tuple/requirements/dr2367.cc: New.
From-SVN: r225189
2015-06-30 15:26:49 +02:00
|
|
|
|
PR libstdc++/86963 Implement LWG 2729 constraints on tuple assignment
PR libstdc++/86963
* include/std/tuple (__tuple_base): New class template with deleted
copy assignment operator.
(tuple, tuple<_T1, _T2>): Derive from __tuple_base<tuple> so that
implicit copy/move assignment operator will be deleted/suppressed.
(tuple::__assignable, tuple<_T1, _T2>::__assignable): New helper
functions for SFINAE constraints on assignment operators.
(tuple::__nothrow_assignable, tuple<_T1, _T2>::__nothrow_assignable):
New helper functions for exception specifications.
(tuple::operator=(const tuple&), tuple::operator=(tuple&&))
(tuple<_T1, _T2>::operator=(const tuple&))
(tuple<_T1, _T2>::operator=(tuple&&)): Change parameter types to
__nonesuch_no_braces when the operator should be defined implicitly.
Use __nothrow_assignable for exception specifications.
(tuple::operator=(const tuple<_UElements...>&))
(tuple::operator=(tuple<_UElements...>&&))
(tuple<_T1, _T2>::operator=(const tuple<_U1, _U2>&))
(tuple<_T1, _T2>::operator=(tuple<_U1, _U2>&&))
(tuple<_T1, _T2>::operator=(const pair<_U1, _U2>&))
(tuple<_T1, _T2>::operator=(pair<_U1, _U2>&&)): Constrain using
__assignable and use __nothrow_assignable for exception
specifications.
* python/libstdcxx/v6/printers.py (is_specialization_of): Accept
gdb.Type as first argument, instead of a string.
(StdTuplePrinter._iterator._is_nonempty_tuple): New method to check
tuple for expected structure.
(StdTuplePrinter._iterator.__init__): Use _is_nonempty_tuple.
* testsuite/20_util/tuple/dr2729.cc: New test.
* testsuite/20_util/tuple/element_access/get_neg.cc: Change dg-error
to dg-prune-output.
From-SVN: r263625
2018-08-17 19:52:49 +02:00
|
|
|
template<typename... _UElements>
|
|
|
|
static constexpr
|
|
|
|
__enable_if_t<sizeof...(_UElements) == sizeof...(_Elements), bool>
|
|
|
|
__assignable()
|
|
|
|
{ return __and_<is_assignable<_Elements&, _UElements>...>::value; }
|
|
|
|
|
Refactor SFINAE constraints on std::tuple constructors
Replace the _TC class template with the better-named _TupleConstraints
one, which provides a different set of member functions. The new members
do not distinguish construction from lvalues and rvalues, but expects
the caller to do that by providing different template arguments. Within
the std::tuple primary template and std::tuple<T1, T2> partial
specialization the _TupleConstraints members are used via new alias
templates like _ImplicitCtor and _ExplicitCtor which makes the
constructor constraints less verbose and repetitive. For example, where
we previously had:
template<typename... _UElements, typename
enable_if<
_TMC<_UElements...>::template
_MoveConstructibleTuple<_UElements...>()
&& _TMC<_UElements...>::template
_ImplicitlyMoveConvertibleTuple<_UElements...>()
&& (sizeof...(_Elements) >= 1),
bool>::type=true>
constexpr tuple(_UElements&&... __elements)
We now have:
template<typename... _UElements,
bool _Valid = __valid_args<_UElements...>(),
_ImplicitCtor<_Valid, _UElements...> = true>
constexpr
tuple(_UElements&&... __elements)
There are two semantic changes as a result of the refactoring:
- The allocator-extended default constructor is now constrained.
- The rewritten constraints fix PR 90700.
* include/std/tuple (_TC): Replace with _TupleConstraints.
(_TupleConstraints): New helper for SFINAE constraints, with more
expressive member functions to reduce duplication when used.
(tuple::_TC2, tuple::_TMC, tuple::_TNTC): Remove.
(tuple::_TCC): Replace dummy type parameter with bool non-type
parameter that can be used to check the pack size.
(tuple::_ImplicitDefaultCtor, tuple::_ExplicitDefaultCtor)
(tuple::_ImplicitCtor, tuple::_ExplicitCtor): New alias templates for
checking constraints in constructors.
(tuple::__valid_args, tuple::_UseOtherCtor, tuple::__use_other_ctor):
New SFINAE helpers.
(tuple::tuple): Use new helpers to reduce repitition in constraints.
(tuple::tuple(allocator_arg_t, const Alloc&)): Constrain.
(tuple<T1, T2>::_TCC, tuple<T1, T2>::_ImplicitDefaultCtor)
(tuple<T1, T2>::_ExplicitDefaultCtor, tuple<T1, T2>::_ImplicitCtor)
(tuple<T1, T2>::_ExplicitCtor): New alias templates for checking
constraints in constructors.
(tuple::__is_alloc_arg()): New SFINAE helpers.
(tuple<T1, T2>::tuple): Use new helpers to reduce repitition in
constraints.
(tuple<T1, T2>::tuple(allocator_arg_t, const Alloc&)): Constrain.
* testsuite/20_util/tuple/cons/90700.cc: New test.
* testsuite/20_util/tuple/cons/allocators.cc: Add default constructor
to meet new constraint on allocator-extended default constructor.
From-SVN: r271998
2019-06-06 14:13:36 +02:00
|
|
|
// Condition for noexcept-specifier of an assignment operator.
|
PR libstdc++/86963 Implement LWG 2729 constraints on tuple assignment
PR libstdc++/86963
* include/std/tuple (__tuple_base): New class template with deleted
copy assignment operator.
(tuple, tuple<_T1, _T2>): Derive from __tuple_base<tuple> so that
implicit copy/move assignment operator will be deleted/suppressed.
(tuple::__assignable, tuple<_T1, _T2>::__assignable): New helper
functions for SFINAE constraints on assignment operators.
(tuple::__nothrow_assignable, tuple<_T1, _T2>::__nothrow_assignable):
New helper functions for exception specifications.
(tuple::operator=(const tuple&), tuple::operator=(tuple&&))
(tuple<_T1, _T2>::operator=(const tuple&))
(tuple<_T1, _T2>::operator=(tuple&&)): Change parameter types to
__nonesuch_no_braces when the operator should be defined implicitly.
Use __nothrow_assignable for exception specifications.
(tuple::operator=(const tuple<_UElements...>&))
(tuple::operator=(tuple<_UElements...>&&))
(tuple<_T1, _T2>::operator=(const tuple<_U1, _U2>&))
(tuple<_T1, _T2>::operator=(tuple<_U1, _U2>&&))
(tuple<_T1, _T2>::operator=(const pair<_U1, _U2>&))
(tuple<_T1, _T2>::operator=(pair<_U1, _U2>&&)): Constrain using
__assignable and use __nothrow_assignable for exception
specifications.
* python/libstdcxx/v6/printers.py (is_specialization_of): Accept
gdb.Type as first argument, instead of a string.
(StdTuplePrinter._iterator._is_nonempty_tuple): New method to check
tuple for expected structure.
(StdTuplePrinter._iterator.__init__): Use _is_nonempty_tuple.
* testsuite/20_util/tuple/dr2729.cc: New test.
* testsuite/20_util/tuple/element_access/get_neg.cc: Change dg-error
to dg-prune-output.
From-SVN: r263625
2018-08-17 19:52:49 +02:00
|
|
|
template<typename... _UElements>
|
|
|
|
static constexpr bool __nothrow_assignable()
|
|
|
|
{
|
|
|
|
return
|
|
|
|
__and_<is_nothrow_assignable<_Elements&, _UElements>...>::value;
|
|
|
|
}
|
Refactor SFINAE constraints on std::tuple constructors
Replace the _TC class template with the better-named _TupleConstraints
one, which provides a different set of member functions. The new members
do not distinguish construction from lvalues and rvalues, but expects
the caller to do that by providing different template arguments. Within
the std::tuple primary template and std::tuple<T1, T2> partial
specialization the _TupleConstraints members are used via new alias
templates like _ImplicitCtor and _ExplicitCtor which makes the
constructor constraints less verbose and repetitive. For example, where
we previously had:
template<typename... _UElements, typename
enable_if<
_TMC<_UElements...>::template
_MoveConstructibleTuple<_UElements...>()
&& _TMC<_UElements...>::template
_ImplicitlyMoveConvertibleTuple<_UElements...>()
&& (sizeof...(_Elements) >= 1),
bool>::type=true>
constexpr tuple(_UElements&&... __elements)
We now have:
template<typename... _UElements,
bool _Valid = __valid_args<_UElements...>(),
_ImplicitCtor<_Valid, _UElements...> = true>
constexpr
tuple(_UElements&&... __elements)
There are two semantic changes as a result of the refactoring:
- The allocator-extended default constructor is now constrained.
- The rewritten constraints fix PR 90700.
* include/std/tuple (_TC): Replace with _TupleConstraints.
(_TupleConstraints): New helper for SFINAE constraints, with more
expressive member functions to reduce duplication when used.
(tuple::_TC2, tuple::_TMC, tuple::_TNTC): Remove.
(tuple::_TCC): Replace dummy type parameter with bool non-type
parameter that can be used to check the pack size.
(tuple::_ImplicitDefaultCtor, tuple::_ExplicitDefaultCtor)
(tuple::_ImplicitCtor, tuple::_ExplicitCtor): New alias templates for
checking constraints in constructors.
(tuple::__valid_args, tuple::_UseOtherCtor, tuple::__use_other_ctor):
New SFINAE helpers.
(tuple::tuple): Use new helpers to reduce repitition in constraints.
(tuple::tuple(allocator_arg_t, const Alloc&)): Constrain.
(tuple<T1, T2>::_TCC, tuple<T1, T2>::_ImplicitDefaultCtor)
(tuple<T1, T2>::_ExplicitDefaultCtor, tuple<T1, T2>::_ImplicitCtor)
(tuple<T1, T2>::_ExplicitCtor): New alias templates for checking
constraints in constructors.
(tuple::__is_alloc_arg()): New SFINAE helpers.
(tuple<T1, T2>::tuple): Use new helpers to reduce repitition in
constraints.
(tuple<T1, T2>::tuple(allocator_arg_t, const Alloc&)): Constrain.
* testsuite/20_util/tuple/cons/90700.cc: New test.
* testsuite/20_util/tuple/cons/allocators.cc: Add default constructor
to meet new constraint on allocator-extended default constructor.
From-SVN: r271998
2019-06-06 14:13:36 +02:00
|
|
|
|
|
|
|
// Condition for noexcept-specifier of a constructor.
|
2019-04-28 23:17:50 +02:00
|
|
|
template<typename... _UElements>
|
|
|
|
static constexpr bool __nothrow_constructible()
|
|
|
|
{
|
|
|
|
return
|
|
|
|
__and_<is_nothrow_constructible<_Elements, _UElements>...>::value;
|
|
|
|
}
|
PR libstdc++/86963 Implement LWG 2729 constraints on tuple assignment
PR libstdc++/86963
* include/std/tuple (__tuple_base): New class template with deleted
copy assignment operator.
(tuple, tuple<_T1, _T2>): Derive from __tuple_base<tuple> so that
implicit copy/move assignment operator will be deleted/suppressed.
(tuple::__assignable, tuple<_T1, _T2>::__assignable): New helper
functions for SFINAE constraints on assignment operators.
(tuple::__nothrow_assignable, tuple<_T1, _T2>::__nothrow_assignable):
New helper functions for exception specifications.
(tuple::operator=(const tuple&), tuple::operator=(tuple&&))
(tuple<_T1, _T2>::operator=(const tuple&))
(tuple<_T1, _T2>::operator=(tuple&&)): Change parameter types to
__nonesuch_no_braces when the operator should be defined implicitly.
Use __nothrow_assignable for exception specifications.
(tuple::operator=(const tuple<_UElements...>&))
(tuple::operator=(tuple<_UElements...>&&))
(tuple<_T1, _T2>::operator=(const tuple<_U1, _U2>&))
(tuple<_T1, _T2>::operator=(tuple<_U1, _U2>&&))
(tuple<_T1, _T2>::operator=(const pair<_U1, _U2>&))
(tuple<_T1, _T2>::operator=(pair<_U1, _U2>&&)): Constrain using
__assignable and use __nothrow_assignable for exception
specifications.
* python/libstdcxx/v6/printers.py (is_specialization_of): Accept
gdb.Type as first argument, instead of a string.
(StdTuplePrinter._iterator._is_nonempty_tuple): New method to check
tuple for expected structure.
(StdTuplePrinter._iterator.__init__): Use _is_nonempty_tuple.
* testsuite/20_util/tuple/dr2729.cc: New test.
* testsuite/20_util/tuple/element_access/get_neg.cc: Change dg-error
to dg-prune-output.
From-SVN: r263625
2018-08-17 19:52:49 +02:00
|
|
|
|
Refactor SFINAE constraints on std::tuple constructors
Replace the _TC class template with the better-named _TupleConstraints
one, which provides a different set of member functions. The new members
do not distinguish construction from lvalues and rvalues, but expects
the caller to do that by providing different template arguments. Within
the std::tuple primary template and std::tuple<T1, T2> partial
specialization the _TupleConstraints members are used via new alias
templates like _ImplicitCtor and _ExplicitCtor which makes the
constructor constraints less verbose and repetitive. For example, where
we previously had:
template<typename... _UElements, typename
enable_if<
_TMC<_UElements...>::template
_MoveConstructibleTuple<_UElements...>()
&& _TMC<_UElements...>::template
_ImplicitlyMoveConvertibleTuple<_UElements...>()
&& (sizeof...(_Elements) >= 1),
bool>::type=true>
constexpr tuple(_UElements&&... __elements)
We now have:
template<typename... _UElements,
bool _Valid = __valid_args<_UElements...>(),
_ImplicitCtor<_Valid, _UElements...> = true>
constexpr
tuple(_UElements&&... __elements)
There are two semantic changes as a result of the refactoring:
- The allocator-extended default constructor is now constrained.
- The rewritten constraints fix PR 90700.
* include/std/tuple (_TC): Replace with _TupleConstraints.
(_TupleConstraints): New helper for SFINAE constraints, with more
expressive member functions to reduce duplication when used.
(tuple::_TC2, tuple::_TMC, tuple::_TNTC): Remove.
(tuple::_TCC): Replace dummy type parameter with bool non-type
parameter that can be used to check the pack size.
(tuple::_ImplicitDefaultCtor, tuple::_ExplicitDefaultCtor)
(tuple::_ImplicitCtor, tuple::_ExplicitCtor): New alias templates for
checking constraints in constructors.
(tuple::__valid_args, tuple::_UseOtherCtor, tuple::__use_other_ctor):
New SFINAE helpers.
(tuple::tuple): Use new helpers to reduce repitition in constraints.
(tuple::tuple(allocator_arg_t, const Alloc&)): Constrain.
(tuple<T1, T2>::_TCC, tuple<T1, T2>::_ImplicitDefaultCtor)
(tuple<T1, T2>::_ExplicitDefaultCtor, tuple<T1, T2>::_ImplicitCtor)
(tuple<T1, T2>::_ExplicitCtor): New alias templates for checking
constraints in constructors.
(tuple::__is_alloc_arg()): New SFINAE helpers.
(tuple<T1, T2>::tuple): Use new helpers to reduce repitition in
constraints.
(tuple<T1, T2>::tuple(allocator_arg_t, const Alloc&)): Constrain.
* testsuite/20_util/tuple/cons/90700.cc: New test.
* testsuite/20_util/tuple/cons/allocators.cc: Add default constructor
to meet new constraint on allocator-extended default constructor.
From-SVN: r271998
2019-06-06 14:13:36 +02:00
|
|
|
// Constraint for tuple(_UTypes&&...) where sizeof...(_UTypes) == 1.
|
|
|
|
template<typename _Up>
|
|
|
|
static constexpr bool __valid_args()
|
|
|
|
{
|
|
|
|
return sizeof...(_Elements) == 1
|
|
|
|
&& !is_same<tuple, __remove_cvref_t<_Up>>::value;
|
|
|
|
}
|
2007-12-26 16:23:49 +01:00
|
|
|
|
Refactor SFINAE constraints on std::tuple constructors
Replace the _TC class template with the better-named _TupleConstraints
one, which provides a different set of member functions. The new members
do not distinguish construction from lvalues and rvalues, but expects
the caller to do that by providing different template arguments. Within
the std::tuple primary template and std::tuple<T1, T2> partial
specialization the _TupleConstraints members are used via new alias
templates like _ImplicitCtor and _ExplicitCtor which makes the
constructor constraints less verbose and repetitive. For example, where
we previously had:
template<typename... _UElements, typename
enable_if<
_TMC<_UElements...>::template
_MoveConstructibleTuple<_UElements...>()
&& _TMC<_UElements...>::template
_ImplicitlyMoveConvertibleTuple<_UElements...>()
&& (sizeof...(_Elements) >= 1),
bool>::type=true>
constexpr tuple(_UElements&&... __elements)
We now have:
template<typename... _UElements,
bool _Valid = __valid_args<_UElements...>(),
_ImplicitCtor<_Valid, _UElements...> = true>
constexpr
tuple(_UElements&&... __elements)
There are two semantic changes as a result of the refactoring:
- The allocator-extended default constructor is now constrained.
- The rewritten constraints fix PR 90700.
* include/std/tuple (_TC): Replace with _TupleConstraints.
(_TupleConstraints): New helper for SFINAE constraints, with more
expressive member functions to reduce duplication when used.
(tuple::_TC2, tuple::_TMC, tuple::_TNTC): Remove.
(tuple::_TCC): Replace dummy type parameter with bool non-type
parameter that can be used to check the pack size.
(tuple::_ImplicitDefaultCtor, tuple::_ExplicitDefaultCtor)
(tuple::_ImplicitCtor, tuple::_ExplicitCtor): New alias templates for
checking constraints in constructors.
(tuple::__valid_args, tuple::_UseOtherCtor, tuple::__use_other_ctor):
New SFINAE helpers.
(tuple::tuple): Use new helpers to reduce repitition in constraints.
(tuple::tuple(allocator_arg_t, const Alloc&)): Constrain.
(tuple<T1, T2>::_TCC, tuple<T1, T2>::_ImplicitDefaultCtor)
(tuple<T1, T2>::_ExplicitDefaultCtor, tuple<T1, T2>::_ImplicitCtor)
(tuple<T1, T2>::_ExplicitCtor): New alias templates for checking
constraints in constructors.
(tuple::__is_alloc_arg()): New SFINAE helpers.
(tuple<T1, T2>::tuple): Use new helpers to reduce repitition in
constraints.
(tuple<T1, T2>::tuple(allocator_arg_t, const Alloc&)): Constrain.
* testsuite/20_util/tuple/cons/90700.cc: New test.
* testsuite/20_util/tuple/cons/allocators.cc: Add default constructor
to meet new constraint on allocator-extended default constructor.
From-SVN: r271998
2019-06-06 14:13:36 +02:00
|
|
|
// Constraint for tuple(_UTypes&&...) where sizeof...(_UTypes) > 1.
|
|
|
|
template<typename, typename, typename... _Tail>
|
|
|
|
static constexpr bool __valid_args()
|
|
|
|
{ return (sizeof...(_Tail) + 2) == sizeof...(_Elements); }
|
|
|
|
|
|
|
|
/* Constraint for constructors with a tuple<UTypes...> parameter ensures
|
|
|
|
* that the constructor is only viable when it would not interfere with
|
|
|
|
* tuple(UTypes&&...) or tuple(const tuple&) or tuple(tuple&&).
|
|
|
|
* Such constructors are only viable if:
|
|
|
|
* either sizeof...(Types) != 1,
|
|
|
|
* or (when Types... expands to T and UTypes... expands to U)
|
|
|
|
* is_convertible_v<TUPLE, T>, is_constructible_v<T, TUPLE>,
|
|
|
|
* and is_same_v<T, U> are all false.
|
|
|
|
*/
|
|
|
|
template<typename _Tuple, typename = tuple,
|
|
|
|
typename = __remove_cvref_t<_Tuple>>
|
|
|
|
struct _UseOtherCtor
|
|
|
|
: false_type
|
|
|
|
{ };
|
|
|
|
// If TUPLE is convertible to the single element in *this,
|
|
|
|
// then TUPLE should match tuple(UTypes&&...) instead.
|
|
|
|
template<typename _Tuple, typename _Tp, typename _Up>
|
|
|
|
struct _UseOtherCtor<_Tuple, tuple<_Tp>, tuple<_Up>>
|
|
|
|
: __or_<is_convertible<_Tuple, _Tp>, is_constructible<_Tp, _Tuple>>
|
|
|
|
{ };
|
|
|
|
// If TUPLE and *this each have a single element of the same type,
|
|
|
|
// then TUPLE should match a copy/move constructor instead.
|
|
|
|
template<typename _Tuple, typename _Tp>
|
|
|
|
struct _UseOtherCtor<_Tuple, tuple<_Tp>, tuple<_Tp>>
|
|
|
|
: true_type
|
|
|
|
{ };
|
|
|
|
|
|
|
|
// Return true iff sizeof...(Types) == 1 && tuple_size_v<TUPLE> == 1
|
|
|
|
// and the single element in Types can be initialized from TUPLE,
|
|
|
|
// or is the same type as tuple_element_t<0, TUPLE>.
|
|
|
|
template<typename _Tuple>
|
|
|
|
static constexpr bool __use_other_ctor()
|
|
|
|
{ return _UseOtherCtor<_Tuple>::value; }
|
Implement N4387, "Improving pair and tuple", and LWG 2367.
2015-06-30 Ville Voutilainen <ville.voutilainen@gmail.com>
Implement N4387, "Improving pair and tuple", and LWG 2367.
* include/bits/stl_pair.h (_ConstructiblePair,
_ImplicitlyConvertiblePair, _MoveConstructiblePair,
_ImplicitlyMoveConvertiblePair): New.
(pair()): Constrain it.
(pair(const _T1&, const _T2&), pair(const pair<_U1, _U2>&),
pair(_U1&&, const _T2&), pair(const _T1&, _U2&&), pair(_U1&&, _U2&&),
pair(pair<_U1, _U2>&&)): Make conditionally explicit.
* include/std/tuple (_TC, tuple::_TC2, tuple::TCC, tuple::TMC): New.
(tuple()): Constrain it.
(tuple(const _UElements&...), tuple(_UElements&&...),
tuple(const tuple<_UElements...>&), tuple(tuple<_UElements...>&&),
tuple(allocator_arg_t, const _Alloc&, const _UElements&...),
tuple(allocator_arg_t, const _Alloc&, _UElements&&...),
tuple(allocator_arg_t, const _Alloc&, const tuple<_UElements...>&),
tuple(allocator_arg_t, const _Alloc&, tuple<_UElements...>&&),
tuple(const pair<_U1, _U2>&), tuple(pair<_U1, _U2>&&),
tuple(allocator_arg_t, const _Alloc&, const pair<_U1, _U2>&),
tuple(allocator_arg_t, const _Alloc&, pair<_U1, _U2>&&)): Make
conditionally explicit.
* include/experimental/functional (__boyer_moore_array_base): Name
array type explicitly instead of using an empty braced-init-list.
* testsuite/20_util/pair/cons/explicit_construct.cc: New.
* testsuite/20_util/pair/piecewise.cc: Use piecewise_construct.
* testsuite/20_util/pair/requirements/dr2367.cc: New.
* testsuite/20_util/tuple/cons/explicit_construct.cc: New.
* testsuite/20_util/tuple/requirements/dr2367.cc: New.
From-SVN: r225189
2015-06-30 15:26:49 +02:00
|
|
|
|
Refactor SFINAE constraints on std::tuple constructors
Replace the _TC class template with the better-named _TupleConstraints
one, which provides a different set of member functions. The new members
do not distinguish construction from lvalues and rvalues, but expects
the caller to do that by providing different template arguments. Within
the std::tuple primary template and std::tuple<T1, T2> partial
specialization the _TupleConstraints members are used via new alias
templates like _ImplicitCtor and _ExplicitCtor which makes the
constructor constraints less verbose and repetitive. For example, where
we previously had:
template<typename... _UElements, typename
enable_if<
_TMC<_UElements...>::template
_MoveConstructibleTuple<_UElements...>()
&& _TMC<_UElements...>::template
_ImplicitlyMoveConvertibleTuple<_UElements...>()
&& (sizeof...(_Elements) >= 1),
bool>::type=true>
constexpr tuple(_UElements&&... __elements)
We now have:
template<typename... _UElements,
bool _Valid = __valid_args<_UElements...>(),
_ImplicitCtor<_Valid, _UElements...> = true>
constexpr
tuple(_UElements&&... __elements)
There are two semantic changes as a result of the refactoring:
- The allocator-extended default constructor is now constrained.
- The rewritten constraints fix PR 90700.
* include/std/tuple (_TC): Replace with _TupleConstraints.
(_TupleConstraints): New helper for SFINAE constraints, with more
expressive member functions to reduce duplication when used.
(tuple::_TC2, tuple::_TMC, tuple::_TNTC): Remove.
(tuple::_TCC): Replace dummy type parameter with bool non-type
parameter that can be used to check the pack size.
(tuple::_ImplicitDefaultCtor, tuple::_ExplicitDefaultCtor)
(tuple::_ImplicitCtor, tuple::_ExplicitCtor): New alias templates for
checking constraints in constructors.
(tuple::__valid_args, tuple::_UseOtherCtor, tuple::__use_other_ctor):
New SFINAE helpers.
(tuple::tuple): Use new helpers to reduce repitition in constraints.
(tuple::tuple(allocator_arg_t, const Alloc&)): Constrain.
(tuple<T1, T2>::_TCC, tuple<T1, T2>::_ImplicitDefaultCtor)
(tuple<T1, T2>::_ExplicitDefaultCtor, tuple<T1, T2>::_ImplicitCtor)
(tuple<T1, T2>::_ExplicitCtor): New alias templates for checking
constraints in constructors.
(tuple::__is_alloc_arg()): New SFINAE helpers.
(tuple<T1, T2>::tuple): Use new helpers to reduce repitition in
constraints.
(tuple<T1, T2>::tuple(allocator_arg_t, const Alloc&)): Constrain.
* testsuite/20_util/tuple/cons/90700.cc: New test.
* testsuite/20_util/tuple/cons/allocators.cc: Add default constructor
to meet new constraint on allocator-extended default constructor.
From-SVN: r271998
2019-06-06 14:13:36 +02:00
|
|
|
public:
|
Implement N4387, "Improving pair and tuple", and LWG 2367.
2015-06-30 Ville Voutilainen <ville.voutilainen@gmail.com>
Implement N4387, "Improving pair and tuple", and LWG 2367.
* include/bits/stl_pair.h (_ConstructiblePair,
_ImplicitlyConvertiblePair, _MoveConstructiblePair,
_ImplicitlyMoveConvertiblePair): New.
(pair()): Constrain it.
(pair(const _T1&, const _T2&), pair(const pair<_U1, _U2>&),
pair(_U1&&, const _T2&), pair(const _T1&, _U2&&), pair(_U1&&, _U2&&),
pair(pair<_U1, _U2>&&)): Make conditionally explicit.
* include/std/tuple (_TC, tuple::_TC2, tuple::TCC, tuple::TMC): New.
(tuple()): Constrain it.
(tuple(const _UElements&...), tuple(_UElements&&...),
tuple(const tuple<_UElements...>&), tuple(tuple<_UElements...>&&),
tuple(allocator_arg_t, const _Alloc&, const _UElements&...),
tuple(allocator_arg_t, const _Alloc&, _UElements&&...),
tuple(allocator_arg_t, const _Alloc&, const tuple<_UElements...>&),
tuple(allocator_arg_t, const _Alloc&, tuple<_UElements...>&&),
tuple(const pair<_U1, _U2>&), tuple(pair<_U1, _U2>&&),
tuple(allocator_arg_t, const _Alloc&, const pair<_U1, _U2>&),
tuple(allocator_arg_t, const _Alloc&, pair<_U1, _U2>&&)): Make
conditionally explicit.
* include/experimental/functional (__boyer_moore_array_base): Name
array type explicitly instead of using an empty braced-init-list.
* testsuite/20_util/pair/cons/explicit_construct.cc: New.
* testsuite/20_util/pair/piecewise.cc: Use piecewise_construct.
* testsuite/20_util/pair/requirements/dr2367.cc: New.
* testsuite/20_util/tuple/cons/explicit_construct.cc: New.
* testsuite/20_util/tuple/requirements/dr2367.cc: New.
From-SVN: r225189
2015-06-30 15:26:49 +02:00
|
|
|
template<typename _Dummy = void,
|
Refactor SFINAE constraints on std::tuple constructors
Replace the _TC class template with the better-named _TupleConstraints
one, which provides a different set of member functions. The new members
do not distinguish construction from lvalues and rvalues, but expects
the caller to do that by providing different template arguments. Within
the std::tuple primary template and std::tuple<T1, T2> partial
specialization the _TupleConstraints members are used via new alias
templates like _ImplicitCtor and _ExplicitCtor which makes the
constructor constraints less verbose and repetitive. For example, where
we previously had:
template<typename... _UElements, typename
enable_if<
_TMC<_UElements...>::template
_MoveConstructibleTuple<_UElements...>()
&& _TMC<_UElements...>::template
_ImplicitlyMoveConvertibleTuple<_UElements...>()
&& (sizeof...(_Elements) >= 1),
bool>::type=true>
constexpr tuple(_UElements&&... __elements)
We now have:
template<typename... _UElements,
bool _Valid = __valid_args<_UElements...>(),
_ImplicitCtor<_Valid, _UElements...> = true>
constexpr
tuple(_UElements&&... __elements)
There are two semantic changes as a result of the refactoring:
- The allocator-extended default constructor is now constrained.
- The rewritten constraints fix PR 90700.
* include/std/tuple (_TC): Replace with _TupleConstraints.
(_TupleConstraints): New helper for SFINAE constraints, with more
expressive member functions to reduce duplication when used.
(tuple::_TC2, tuple::_TMC, tuple::_TNTC): Remove.
(tuple::_TCC): Replace dummy type parameter with bool non-type
parameter that can be used to check the pack size.
(tuple::_ImplicitDefaultCtor, tuple::_ExplicitDefaultCtor)
(tuple::_ImplicitCtor, tuple::_ExplicitCtor): New alias templates for
checking constraints in constructors.
(tuple::__valid_args, tuple::_UseOtherCtor, tuple::__use_other_ctor):
New SFINAE helpers.
(tuple::tuple): Use new helpers to reduce repitition in constraints.
(tuple::tuple(allocator_arg_t, const Alloc&)): Constrain.
(tuple<T1, T2>::_TCC, tuple<T1, T2>::_ImplicitDefaultCtor)
(tuple<T1, T2>::_ExplicitDefaultCtor, tuple<T1, T2>::_ImplicitCtor)
(tuple<T1, T2>::_ExplicitCtor): New alias templates for checking
constraints in constructors.
(tuple::__is_alloc_arg()): New SFINAE helpers.
(tuple<T1, T2>::tuple): Use new helpers to reduce repitition in
constraints.
(tuple<T1, T2>::tuple(allocator_arg_t, const Alloc&)): Constrain.
* testsuite/20_util/tuple/cons/90700.cc: New test.
* testsuite/20_util/tuple/cons/allocators.cc: Add default constructor
to meet new constraint on allocator-extended default constructor.
From-SVN: r271998
2019-06-06 14:13:36 +02:00
|
|
|
_ImplicitDefaultCtor<is_void<_Dummy>::value> = true>
|
|
|
|
constexpr
|
|
|
|
tuple()
|
|
|
|
noexcept(__and_<is_nothrow_default_constructible<_Elements>...>::value)
|
|
|
|
: _Inherited() { }
|
2007-12-26 16:23:49 +01:00
|
|
|
|
Implement N4387, "Improving pair and tuple", and LWG 2367.
2015-06-30 Ville Voutilainen <ville.voutilainen@gmail.com>
Implement N4387, "Improving pair and tuple", and LWG 2367.
* include/bits/stl_pair.h (_ConstructiblePair,
_ImplicitlyConvertiblePair, _MoveConstructiblePair,
_ImplicitlyMoveConvertiblePair): New.
(pair()): Constrain it.
(pair(const _T1&, const _T2&), pair(const pair<_U1, _U2>&),
pair(_U1&&, const _T2&), pair(const _T1&, _U2&&), pair(_U1&&, _U2&&),
pair(pair<_U1, _U2>&&)): Make conditionally explicit.
* include/std/tuple (_TC, tuple::_TC2, tuple::TCC, tuple::TMC): New.
(tuple()): Constrain it.
(tuple(const _UElements&...), tuple(_UElements&&...),
tuple(const tuple<_UElements...>&), tuple(tuple<_UElements...>&&),
tuple(allocator_arg_t, const _Alloc&, const _UElements&...),
tuple(allocator_arg_t, const _Alloc&, _UElements&&...),
tuple(allocator_arg_t, const _Alloc&, const tuple<_UElements...>&),
tuple(allocator_arg_t, const _Alloc&, tuple<_UElements...>&&),
tuple(const pair<_U1, _U2>&), tuple(pair<_U1, _U2>&&),
tuple(allocator_arg_t, const _Alloc&, const pair<_U1, _U2>&),
tuple(allocator_arg_t, const _Alloc&, pair<_U1, _U2>&&)): Make
conditionally explicit.
* include/experimental/functional (__boyer_moore_array_base): Name
array type explicitly instead of using an empty braced-init-list.
* testsuite/20_util/pair/cons/explicit_construct.cc: New.
* testsuite/20_util/pair/piecewise.cc: Use piecewise_construct.
* testsuite/20_util/pair/requirements/dr2367.cc: New.
* testsuite/20_util/tuple/cons/explicit_construct.cc: New.
* testsuite/20_util/tuple/requirements/dr2367.cc: New.
From-SVN: r225189
2015-06-30 15:26:49 +02:00
|
|
|
template<typename _Dummy = void,
|
Refactor SFINAE constraints on std::tuple constructors
Replace the _TC class template with the better-named _TupleConstraints
one, which provides a different set of member functions. The new members
do not distinguish construction from lvalues and rvalues, but expects
the caller to do that by providing different template arguments. Within
the std::tuple primary template and std::tuple<T1, T2> partial
specialization the _TupleConstraints members are used via new alias
templates like _ImplicitCtor and _ExplicitCtor which makes the
constructor constraints less verbose and repetitive. For example, where
we previously had:
template<typename... _UElements, typename
enable_if<
_TMC<_UElements...>::template
_MoveConstructibleTuple<_UElements...>()
&& _TMC<_UElements...>::template
_ImplicitlyMoveConvertibleTuple<_UElements...>()
&& (sizeof...(_Elements) >= 1),
bool>::type=true>
constexpr tuple(_UElements&&... __elements)
We now have:
template<typename... _UElements,
bool _Valid = __valid_args<_UElements...>(),
_ImplicitCtor<_Valid, _UElements...> = true>
constexpr
tuple(_UElements&&... __elements)
There are two semantic changes as a result of the refactoring:
- The allocator-extended default constructor is now constrained.
- The rewritten constraints fix PR 90700.
* include/std/tuple (_TC): Replace with _TupleConstraints.
(_TupleConstraints): New helper for SFINAE constraints, with more
expressive member functions to reduce duplication when used.
(tuple::_TC2, tuple::_TMC, tuple::_TNTC): Remove.
(tuple::_TCC): Replace dummy type parameter with bool non-type
parameter that can be used to check the pack size.
(tuple::_ImplicitDefaultCtor, tuple::_ExplicitDefaultCtor)
(tuple::_ImplicitCtor, tuple::_ExplicitCtor): New alias templates for
checking constraints in constructors.
(tuple::__valid_args, tuple::_UseOtherCtor, tuple::__use_other_ctor):
New SFINAE helpers.
(tuple::tuple): Use new helpers to reduce repitition in constraints.
(tuple::tuple(allocator_arg_t, const Alloc&)): Constrain.
(tuple<T1, T2>::_TCC, tuple<T1, T2>::_ImplicitDefaultCtor)
(tuple<T1, T2>::_ExplicitDefaultCtor, tuple<T1, T2>::_ImplicitCtor)
(tuple<T1, T2>::_ExplicitCtor): New alias templates for checking
constraints in constructors.
(tuple::__is_alloc_arg()): New SFINAE helpers.
(tuple<T1, T2>::tuple): Use new helpers to reduce repitition in
constraints.
(tuple<T1, T2>::tuple(allocator_arg_t, const Alloc&)): Constrain.
* testsuite/20_util/tuple/cons/90700.cc: New test.
* testsuite/20_util/tuple/cons/allocators.cc: Add default constructor
to meet new constraint on allocator-extended default constructor.
From-SVN: r271998
2019-06-06 14:13:36 +02:00
|
|
|
_ExplicitDefaultCtor<is_void<_Dummy>::value> = false>
|
|
|
|
explicit constexpr
|
|
|
|
tuple()
|
|
|
|
noexcept(__and_<is_nothrow_default_constructible<_Elements>...>::value)
|
|
|
|
: _Inherited() { }
|
|
|
|
|
|
|
|
template<bool _NotEmpty = (sizeof...(_Elements) >= 1),
|
|
|
|
_ImplicitCtor<_NotEmpty, const _Elements&...> = true>
|
|
|
|
constexpr
|
|
|
|
tuple(const _Elements&... __elements)
|
|
|
|
noexcept(__nothrow_constructible<const _Elements&...>())
|
|
|
|
: _Inherited(__elements...) { }
|
|
|
|
|
|
|
|
template<bool _NotEmpty = (sizeof...(_Elements) >= 1),
|
|
|
|
_ExplicitCtor<_NotEmpty, const _Elements&...> = false>
|
|
|
|
explicit constexpr
|
|
|
|
tuple(const _Elements&... __elements)
|
|
|
|
noexcept(__nothrow_constructible<const _Elements&...>())
|
|
|
|
: _Inherited(__elements...) { }
|
|
|
|
|
|
|
|
template<typename... _UElements,
|
|
|
|
bool _Valid = __valid_args<_UElements...>(),
|
|
|
|
_ImplicitCtor<_Valid, _UElements...> = true>
|
|
|
|
constexpr
|
|
|
|
tuple(_UElements&&... __elements)
|
|
|
|
noexcept(__nothrow_constructible<_UElements...>())
|
|
|
|
: _Inherited(std::forward<_UElements>(__elements)...) { }
|
|
|
|
|
|
|
|
template<typename... _UElements,
|
|
|
|
bool _Valid = __valid_args<_UElements...>(),
|
|
|
|
_ExplicitCtor<_Valid, _UElements...> = false>
|
|
|
|
explicit constexpr
|
|
|
|
tuple(_UElements&&... __elements)
|
|
|
|
noexcept(__nothrow_constructible<_UElements...>())
|
2008-02-18 14:32:01 +01:00
|
|
|
: _Inherited(std::forward<_UElements>(__elements)...) { }
|
2007-12-26 16:23:49 +01:00
|
|
|
|
2010-11-24 17:33:14 +01:00
|
|
|
constexpr tuple(const tuple&) = default;
|
2011-08-03 23:05:14 +02:00
|
|
|
|
2016-06-16 15:47:35 +02:00
|
|
|
constexpr tuple(tuple&&) = default;
|
tuple (_Tuple_impl<>::_Tuple_impl(typename std::remove_reference<>::type&&, typename std::remove_reference<>::type&&...), [...]): Add.
2007-12-30 Paolo Carlini <pcarlini@suse.de>
* include/std/tuple (_Tuple_impl<>::_Tuple_impl(typename
std::remove_reference<>::type&&, typename
std::remove_reference<>::type&&...),
_Tuple_impl(const _Tuple_impl<>&), _Tuple_impl(_Tuple_impl&&),
_Tuple_impl(_Tuple_impl<>&&), operator=(_Tuple_impl&&),
operator=(const _Tuple_impl<>&), operator=(_Tuple_impl<>&&)): Add.
(tuple<>::tuple(const _Elements&...), tuple(_UElements&&...),
tuple(tuple&&), tuple(const tuple<>&), tuple(tuple<>&&),
operator=(tuple&&), operator=(const tuple<>&), operator=(tuple<>&&)):
Likewise.
(tuple<_T1, _T2>::tuple(const _T1&, const _T2&, tuple(_U1&&, _U2&&),
tuple(tuple&&), tuple(tuple<>&&), tuple(pair<>&&), operator=(tuple&&),
operator=(tuple<>&&), operator=(pair<>&&)): Likewise.
(tuple<>::tuple(typename __add_c_ref<_Elements>::type...),
tuple<_T1, _T2>::tuple(typename __add_c_ref<>::type,
typename __add_c_ref<>::type)): Remove.
* testsuite/tr1/6_containers/tuple/creation_functions/tie2.cc: New.
* testsuite/20_util/tuple/creation_functions/tie2.cc: Likewise.
* testsuite/20_util/tuple/moveable.cc: Likewise.
From-SVN: r131230
2007-12-30 23:44:42 +01:00
|
|
|
|
Refactor SFINAE constraints on std::tuple constructors
Replace the _TC class template with the better-named _TupleConstraints
one, which provides a different set of member functions. The new members
do not distinguish construction from lvalues and rvalues, but expects
the caller to do that by providing different template arguments. Within
the std::tuple primary template and std::tuple<T1, T2> partial
specialization the _TupleConstraints members are used via new alias
templates like _ImplicitCtor and _ExplicitCtor which makes the
constructor constraints less verbose and repetitive. For example, where
we previously had:
template<typename... _UElements, typename
enable_if<
_TMC<_UElements...>::template
_MoveConstructibleTuple<_UElements...>()
&& _TMC<_UElements...>::template
_ImplicitlyMoveConvertibleTuple<_UElements...>()
&& (sizeof...(_Elements) >= 1),
bool>::type=true>
constexpr tuple(_UElements&&... __elements)
We now have:
template<typename... _UElements,
bool _Valid = __valid_args<_UElements...>(),
_ImplicitCtor<_Valid, _UElements...> = true>
constexpr
tuple(_UElements&&... __elements)
There are two semantic changes as a result of the refactoring:
- The allocator-extended default constructor is now constrained.
- The rewritten constraints fix PR 90700.
* include/std/tuple (_TC): Replace with _TupleConstraints.
(_TupleConstraints): New helper for SFINAE constraints, with more
expressive member functions to reduce duplication when used.
(tuple::_TC2, tuple::_TMC, tuple::_TNTC): Remove.
(tuple::_TCC): Replace dummy type parameter with bool non-type
parameter that can be used to check the pack size.
(tuple::_ImplicitDefaultCtor, tuple::_ExplicitDefaultCtor)
(tuple::_ImplicitCtor, tuple::_ExplicitCtor): New alias templates for
checking constraints in constructors.
(tuple::__valid_args, tuple::_UseOtherCtor, tuple::__use_other_ctor):
New SFINAE helpers.
(tuple::tuple): Use new helpers to reduce repitition in constraints.
(tuple::tuple(allocator_arg_t, const Alloc&)): Constrain.
(tuple<T1, T2>::_TCC, tuple<T1, T2>::_ImplicitDefaultCtor)
(tuple<T1, T2>::_ExplicitDefaultCtor, tuple<T1, T2>::_ImplicitCtor)
(tuple<T1, T2>::_ExplicitCtor): New alias templates for checking
constraints in constructors.
(tuple::__is_alloc_arg()): New SFINAE helpers.
(tuple<T1, T2>::tuple): Use new helpers to reduce repitition in
constraints.
(tuple<T1, T2>::tuple(allocator_arg_t, const Alloc&)): Constrain.
* testsuite/20_util/tuple/cons/90700.cc: New test.
* testsuite/20_util/tuple/cons/allocators.cc: Add default constructor
to meet new constraint on allocator-extended default constructor.
From-SVN: r271998
2019-06-06 14:13:36 +02:00
|
|
|
template<typename... _UElements,
|
|
|
|
bool _Valid = (sizeof...(_Elements) == sizeof...(_UElements))
|
|
|
|
&& !__use_other_ctor<const tuple<_UElements...>&>(),
|
|
|
|
_ImplicitCtor<_Valid, const _UElements&...> = true>
|
|
|
|
constexpr
|
|
|
|
tuple(const tuple<_UElements...>& __in)
|
|
|
|
noexcept(__nothrow_constructible<const _UElements&...>())
|
|
|
|
: _Inherited(static_cast<const _Tuple_impl<0, _UElements...>&>(__in))
|
|
|
|
{ }
|
|
|
|
|
|
|
|
template<typename... _UElements,
|
|
|
|
bool _Valid = (sizeof...(_Elements) == sizeof...(_UElements))
|
|
|
|
&& !__use_other_ctor<const tuple<_UElements...>&>(),
|
|
|
|
_ExplicitCtor<_Valid, const _UElements&...> = false>
|
|
|
|
explicit constexpr
|
|
|
|
tuple(const tuple<_UElements...>& __in)
|
|
|
|
noexcept(__nothrow_constructible<const _UElements&...>())
|
|
|
|
: _Inherited(static_cast<const _Tuple_impl<0, _UElements...>&>(__in))
|
|
|
|
{ }
|
|
|
|
|
|
|
|
template<typename... _UElements,
|
|
|
|
bool _Valid = (sizeof...(_Elements) == sizeof...(_UElements))
|
|
|
|
&& !__use_other_ctor<tuple<_UElements...>&&>(),
|
|
|
|
_ImplicitCtor<_Valid, _UElements...> = true>
|
|
|
|
constexpr
|
|
|
|
tuple(tuple<_UElements...>&& __in)
|
|
|
|
noexcept(__nothrow_constructible<_UElements...>())
|
|
|
|
: _Inherited(static_cast<_Tuple_impl<0, _UElements...>&&>(__in)) { }
|
|
|
|
|
|
|
|
template<typename... _UElements,
|
|
|
|
bool _Valid = (sizeof...(_Elements) == sizeof...(_UElements))
|
|
|
|
&& !__use_other_ctor<tuple<_UElements...>&&>(),
|
|
|
|
_ExplicitCtor<_Valid, _UElements...> = false>
|
|
|
|
explicit constexpr
|
|
|
|
tuple(tuple<_UElements...>&& __in)
|
|
|
|
noexcept(__nothrow_constructible<_UElements...>())
|
|
|
|
: _Inherited(static_cast<_Tuple_impl<0, _UElements...>&&>(__in)) { }
|
Implement N4387, "Improving pair and tuple", and LWG 2367.
2015-06-30 Ville Voutilainen <ville.voutilainen@gmail.com>
Implement N4387, "Improving pair and tuple", and LWG 2367.
* include/bits/stl_pair.h (_ConstructiblePair,
_ImplicitlyConvertiblePair, _MoveConstructiblePair,
_ImplicitlyMoveConvertiblePair): New.
(pair()): Constrain it.
(pair(const _T1&, const _T2&), pair(const pair<_U1, _U2>&),
pair(_U1&&, const _T2&), pair(const _T1&, _U2&&), pair(_U1&&, _U2&&),
pair(pair<_U1, _U2>&&)): Make conditionally explicit.
* include/std/tuple (_TC, tuple::_TC2, tuple::TCC, tuple::TMC): New.
(tuple()): Constrain it.
(tuple(const _UElements&...), tuple(_UElements&&...),
tuple(const tuple<_UElements...>&), tuple(tuple<_UElements...>&&),
tuple(allocator_arg_t, const _Alloc&, const _UElements&...),
tuple(allocator_arg_t, const _Alloc&, _UElements&&...),
tuple(allocator_arg_t, const _Alloc&, const tuple<_UElements...>&),
tuple(allocator_arg_t, const _Alloc&, tuple<_UElements...>&&),
tuple(const pair<_U1, _U2>&), tuple(pair<_U1, _U2>&&),
tuple(allocator_arg_t, const _Alloc&, const pair<_U1, _U2>&),
tuple(allocator_arg_t, const _Alloc&, pair<_U1, _U2>&&)): Make
conditionally explicit.
* include/experimental/functional (__boyer_moore_array_base): Name
array type explicitly instead of using an empty braced-init-list.
* testsuite/20_util/pair/cons/explicit_construct.cc: New.
* testsuite/20_util/pair/piecewise.cc: Use piecewise_construct.
* testsuite/20_util/pair/requirements/dr2367.cc: New.
* testsuite/20_util/tuple/cons/explicit_construct.cc: New.
* testsuite/20_util/tuple/requirements/dr2367.cc: New.
From-SVN: r225189
2015-06-30 15:26:49 +02:00
|
|
|
|
2011-08-03 23:05:14 +02:00
|
|
|
// Allocator-extended constructors.
|
2011-05-30 18:31:17 +02:00
|
|
|
|
Refactor SFINAE constraints on std::tuple constructors
Replace the _TC class template with the better-named _TupleConstraints
one, which provides a different set of member functions. The new members
do not distinguish construction from lvalues and rvalues, but expects
the caller to do that by providing different template arguments. Within
the std::tuple primary template and std::tuple<T1, T2> partial
specialization the _TupleConstraints members are used via new alias
templates like _ImplicitCtor and _ExplicitCtor which makes the
constructor constraints less verbose and repetitive. For example, where
we previously had:
template<typename... _UElements, typename
enable_if<
_TMC<_UElements...>::template
_MoveConstructibleTuple<_UElements...>()
&& _TMC<_UElements...>::template
_ImplicitlyMoveConvertibleTuple<_UElements...>()
&& (sizeof...(_Elements) >= 1),
bool>::type=true>
constexpr tuple(_UElements&&... __elements)
We now have:
template<typename... _UElements,
bool _Valid = __valid_args<_UElements...>(),
_ImplicitCtor<_Valid, _UElements...> = true>
constexpr
tuple(_UElements&&... __elements)
There are two semantic changes as a result of the refactoring:
- The allocator-extended default constructor is now constrained.
- The rewritten constraints fix PR 90700.
* include/std/tuple (_TC): Replace with _TupleConstraints.
(_TupleConstraints): New helper for SFINAE constraints, with more
expressive member functions to reduce duplication when used.
(tuple::_TC2, tuple::_TMC, tuple::_TNTC): Remove.
(tuple::_TCC): Replace dummy type parameter with bool non-type
parameter that can be used to check the pack size.
(tuple::_ImplicitDefaultCtor, tuple::_ExplicitDefaultCtor)
(tuple::_ImplicitCtor, tuple::_ExplicitCtor): New alias templates for
checking constraints in constructors.
(tuple::__valid_args, tuple::_UseOtherCtor, tuple::__use_other_ctor):
New SFINAE helpers.
(tuple::tuple): Use new helpers to reduce repitition in constraints.
(tuple::tuple(allocator_arg_t, const Alloc&)): Constrain.
(tuple<T1, T2>::_TCC, tuple<T1, T2>::_ImplicitDefaultCtor)
(tuple<T1, T2>::_ExplicitDefaultCtor, tuple<T1, T2>::_ImplicitCtor)
(tuple<T1, T2>::_ExplicitCtor): New alias templates for checking
constraints in constructors.
(tuple::__is_alloc_arg()): New SFINAE helpers.
(tuple<T1, T2>::tuple): Use new helpers to reduce repitition in
constraints.
(tuple<T1, T2>::tuple(allocator_arg_t, const Alloc&)): Constrain.
* testsuite/20_util/tuple/cons/90700.cc: New test.
* testsuite/20_util/tuple/cons/allocators.cc: Add default constructor
to meet new constraint on allocator-extended default constructor.
From-SVN: r271998
2019-06-06 14:13:36 +02:00
|
|
|
template<typename _Alloc,
|
|
|
|
_ImplicitDefaultCtor<is_object<_Alloc>::value> = true>
|
2011-05-30 18:31:17 +02:00
|
|
|
tuple(allocator_arg_t __tag, const _Alloc& __a)
|
|
|
|
: _Inherited(__tag, __a) { }
|
|
|
|
|
Refactor SFINAE constraints on std::tuple constructors
Replace the _TC class template with the better-named _TupleConstraints
one, which provides a different set of member functions. The new members
do not distinguish construction from lvalues and rvalues, but expects
the caller to do that by providing different template arguments. Within
the std::tuple primary template and std::tuple<T1, T2> partial
specialization the _TupleConstraints members are used via new alias
templates like _ImplicitCtor and _ExplicitCtor which makes the
constructor constraints less verbose and repetitive. For example, where
we previously had:
template<typename... _UElements, typename
enable_if<
_TMC<_UElements...>::template
_MoveConstructibleTuple<_UElements...>()
&& _TMC<_UElements...>::template
_ImplicitlyMoveConvertibleTuple<_UElements...>()
&& (sizeof...(_Elements) >= 1),
bool>::type=true>
constexpr tuple(_UElements&&... __elements)
We now have:
template<typename... _UElements,
bool _Valid = __valid_args<_UElements...>(),
_ImplicitCtor<_Valid, _UElements...> = true>
constexpr
tuple(_UElements&&... __elements)
There are two semantic changes as a result of the refactoring:
- The allocator-extended default constructor is now constrained.
- The rewritten constraints fix PR 90700.
* include/std/tuple (_TC): Replace with _TupleConstraints.
(_TupleConstraints): New helper for SFINAE constraints, with more
expressive member functions to reduce duplication when used.
(tuple::_TC2, tuple::_TMC, tuple::_TNTC): Remove.
(tuple::_TCC): Replace dummy type parameter with bool non-type
parameter that can be used to check the pack size.
(tuple::_ImplicitDefaultCtor, tuple::_ExplicitDefaultCtor)
(tuple::_ImplicitCtor, tuple::_ExplicitCtor): New alias templates for
checking constraints in constructors.
(tuple::__valid_args, tuple::_UseOtherCtor, tuple::__use_other_ctor):
New SFINAE helpers.
(tuple::tuple): Use new helpers to reduce repitition in constraints.
(tuple::tuple(allocator_arg_t, const Alloc&)): Constrain.
(tuple<T1, T2>::_TCC, tuple<T1, T2>::_ImplicitDefaultCtor)
(tuple<T1, T2>::_ExplicitDefaultCtor, tuple<T1, T2>::_ImplicitCtor)
(tuple<T1, T2>::_ExplicitCtor): New alias templates for checking
constraints in constructors.
(tuple::__is_alloc_arg()): New SFINAE helpers.
(tuple<T1, T2>::tuple): Use new helpers to reduce repitition in
constraints.
(tuple<T1, T2>::tuple(allocator_arg_t, const Alloc&)): Constrain.
* testsuite/20_util/tuple/cons/90700.cc: New test.
* testsuite/20_util/tuple/cons/allocators.cc: Add default constructor
to meet new constraint on allocator-extended default constructor.
From-SVN: r271998
2019-06-06 14:13:36 +02:00
|
|
|
template<typename _Alloc, bool _NotEmpty = (sizeof...(_Elements) >= 1),
|
|
|
|
_ImplicitCtor<_NotEmpty, const _Elements&...> = true>
|
2011-05-30 18:31:17 +02:00
|
|
|
tuple(allocator_arg_t __tag, const _Alloc& __a,
|
|
|
|
const _Elements&... __elements)
|
|
|
|
: _Inherited(__tag, __a, __elements...) { }
|
|
|
|
|
Refactor SFINAE constraints on std::tuple constructors
Replace the _TC class template with the better-named _TupleConstraints
one, which provides a different set of member functions. The new members
do not distinguish construction from lvalues and rvalues, but expects
the caller to do that by providing different template arguments. Within
the std::tuple primary template and std::tuple<T1, T2> partial
specialization the _TupleConstraints members are used via new alias
templates like _ImplicitCtor and _ExplicitCtor which makes the
constructor constraints less verbose and repetitive. For example, where
we previously had:
template<typename... _UElements, typename
enable_if<
_TMC<_UElements...>::template
_MoveConstructibleTuple<_UElements...>()
&& _TMC<_UElements...>::template
_ImplicitlyMoveConvertibleTuple<_UElements...>()
&& (sizeof...(_Elements) >= 1),
bool>::type=true>
constexpr tuple(_UElements&&... __elements)
We now have:
template<typename... _UElements,
bool _Valid = __valid_args<_UElements...>(),
_ImplicitCtor<_Valid, _UElements...> = true>
constexpr
tuple(_UElements&&... __elements)
There are two semantic changes as a result of the refactoring:
- The allocator-extended default constructor is now constrained.
- The rewritten constraints fix PR 90700.
* include/std/tuple (_TC): Replace with _TupleConstraints.
(_TupleConstraints): New helper for SFINAE constraints, with more
expressive member functions to reduce duplication when used.
(tuple::_TC2, tuple::_TMC, tuple::_TNTC): Remove.
(tuple::_TCC): Replace dummy type parameter with bool non-type
parameter that can be used to check the pack size.
(tuple::_ImplicitDefaultCtor, tuple::_ExplicitDefaultCtor)
(tuple::_ImplicitCtor, tuple::_ExplicitCtor): New alias templates for
checking constraints in constructors.
(tuple::__valid_args, tuple::_UseOtherCtor, tuple::__use_other_ctor):
New SFINAE helpers.
(tuple::tuple): Use new helpers to reduce repitition in constraints.
(tuple::tuple(allocator_arg_t, const Alloc&)): Constrain.
(tuple<T1, T2>::_TCC, tuple<T1, T2>::_ImplicitDefaultCtor)
(tuple<T1, T2>::_ExplicitDefaultCtor, tuple<T1, T2>::_ImplicitCtor)
(tuple<T1, T2>::_ExplicitCtor): New alias templates for checking
constraints in constructors.
(tuple::__is_alloc_arg()): New SFINAE helpers.
(tuple<T1, T2>::tuple): Use new helpers to reduce repitition in
constraints.
(tuple<T1, T2>::tuple(allocator_arg_t, const Alloc&)): Constrain.
* testsuite/20_util/tuple/cons/90700.cc: New test.
* testsuite/20_util/tuple/cons/allocators.cc: Add default constructor
to meet new constraint on allocator-extended default constructor.
From-SVN: r271998
2019-06-06 14:13:36 +02:00
|
|
|
template<typename _Alloc, bool _NotEmpty = (sizeof...(_Elements) >= 1),
|
|
|
|
_ExplicitCtor<_NotEmpty, const _Elements&...> = false>
|
|
|
|
explicit
|
|
|
|
tuple(allocator_arg_t __tag, const _Alloc& __a,
|
|
|
|
const _Elements&... __elements)
|
Implement N4387, "Improving pair and tuple", and LWG 2367.
2015-06-30 Ville Voutilainen <ville.voutilainen@gmail.com>
Implement N4387, "Improving pair and tuple", and LWG 2367.
* include/bits/stl_pair.h (_ConstructiblePair,
_ImplicitlyConvertiblePair, _MoveConstructiblePair,
_ImplicitlyMoveConvertiblePair): New.
(pair()): Constrain it.
(pair(const _T1&, const _T2&), pair(const pair<_U1, _U2>&),
pair(_U1&&, const _T2&), pair(const _T1&, _U2&&), pair(_U1&&, _U2&&),
pair(pair<_U1, _U2>&&)): Make conditionally explicit.
* include/std/tuple (_TC, tuple::_TC2, tuple::TCC, tuple::TMC): New.
(tuple()): Constrain it.
(tuple(const _UElements&...), tuple(_UElements&&...),
tuple(const tuple<_UElements...>&), tuple(tuple<_UElements...>&&),
tuple(allocator_arg_t, const _Alloc&, const _UElements&...),
tuple(allocator_arg_t, const _Alloc&, _UElements&&...),
tuple(allocator_arg_t, const _Alloc&, const tuple<_UElements...>&),
tuple(allocator_arg_t, const _Alloc&, tuple<_UElements...>&&),
tuple(const pair<_U1, _U2>&), tuple(pair<_U1, _U2>&&),
tuple(allocator_arg_t, const _Alloc&, const pair<_U1, _U2>&),
tuple(allocator_arg_t, const _Alloc&, pair<_U1, _U2>&&)): Make
conditionally explicit.
* include/experimental/functional (__boyer_moore_array_base): Name
array type explicitly instead of using an empty braced-init-list.
* testsuite/20_util/pair/cons/explicit_construct.cc: New.
* testsuite/20_util/pair/piecewise.cc: Use piecewise_construct.
* testsuite/20_util/pair/requirements/dr2367.cc: New.
* testsuite/20_util/tuple/cons/explicit_construct.cc: New.
* testsuite/20_util/tuple/requirements/dr2367.cc: New.
From-SVN: r225189
2015-06-30 15:26:49 +02:00
|
|
|
: _Inherited(__tag, __a, __elements...) { }
|
|
|
|
|
Refactor SFINAE constraints on std::tuple constructors
Replace the _TC class template with the better-named _TupleConstraints
one, which provides a different set of member functions. The new members
do not distinguish construction from lvalues and rvalues, but expects
the caller to do that by providing different template arguments. Within
the std::tuple primary template and std::tuple<T1, T2> partial
specialization the _TupleConstraints members are used via new alias
templates like _ImplicitCtor and _ExplicitCtor which makes the
constructor constraints less verbose and repetitive. For example, where
we previously had:
template<typename... _UElements, typename
enable_if<
_TMC<_UElements...>::template
_MoveConstructibleTuple<_UElements...>()
&& _TMC<_UElements...>::template
_ImplicitlyMoveConvertibleTuple<_UElements...>()
&& (sizeof...(_Elements) >= 1),
bool>::type=true>
constexpr tuple(_UElements&&... __elements)
We now have:
template<typename... _UElements,
bool _Valid = __valid_args<_UElements...>(),
_ImplicitCtor<_Valid, _UElements...> = true>
constexpr
tuple(_UElements&&... __elements)
There are two semantic changes as a result of the refactoring:
- The allocator-extended default constructor is now constrained.
- The rewritten constraints fix PR 90700.
* include/std/tuple (_TC): Replace with _TupleConstraints.
(_TupleConstraints): New helper for SFINAE constraints, with more
expressive member functions to reduce duplication when used.
(tuple::_TC2, tuple::_TMC, tuple::_TNTC): Remove.
(tuple::_TCC): Replace dummy type parameter with bool non-type
parameter that can be used to check the pack size.
(tuple::_ImplicitDefaultCtor, tuple::_ExplicitDefaultCtor)
(tuple::_ImplicitCtor, tuple::_ExplicitCtor): New alias templates for
checking constraints in constructors.
(tuple::__valid_args, tuple::_UseOtherCtor, tuple::__use_other_ctor):
New SFINAE helpers.
(tuple::tuple): Use new helpers to reduce repitition in constraints.
(tuple::tuple(allocator_arg_t, const Alloc&)): Constrain.
(tuple<T1, T2>::_TCC, tuple<T1, T2>::_ImplicitDefaultCtor)
(tuple<T1, T2>::_ExplicitDefaultCtor, tuple<T1, T2>::_ImplicitCtor)
(tuple<T1, T2>::_ExplicitCtor): New alias templates for checking
constraints in constructors.
(tuple::__is_alloc_arg()): New SFINAE helpers.
(tuple<T1, T2>::tuple): Use new helpers to reduce repitition in
constraints.
(tuple<T1, T2>::tuple(allocator_arg_t, const Alloc&)): Constrain.
* testsuite/20_util/tuple/cons/90700.cc: New test.
* testsuite/20_util/tuple/cons/allocators.cc: Add default constructor
to meet new constraint on allocator-extended default constructor.
From-SVN: r271998
2019-06-06 14:13:36 +02:00
|
|
|
template<typename _Alloc, typename... _UElements,
|
|
|
|
bool _Valid = __valid_args<_UElements...>(),
|
|
|
|
_ImplicitCtor<_Valid, _UElements...> = true>
|
2011-05-30 18:31:17 +02:00
|
|
|
tuple(allocator_arg_t __tag, const _Alloc& __a,
|
|
|
|
_UElements&&... __elements)
|
|
|
|
: _Inherited(__tag, __a, std::forward<_UElements>(__elements)...)
|
Refactor SFINAE constraints on std::tuple constructors
Replace the _TC class template with the better-named _TupleConstraints
one, which provides a different set of member functions. The new members
do not distinguish construction from lvalues and rvalues, but expects
the caller to do that by providing different template arguments. Within
the std::tuple primary template and std::tuple<T1, T2> partial
specialization the _TupleConstraints members are used via new alias
templates like _ImplicitCtor and _ExplicitCtor which makes the
constructor constraints less verbose and repetitive. For example, where
we previously had:
template<typename... _UElements, typename
enable_if<
_TMC<_UElements...>::template
_MoveConstructibleTuple<_UElements...>()
&& _TMC<_UElements...>::template
_ImplicitlyMoveConvertibleTuple<_UElements...>()
&& (sizeof...(_Elements) >= 1),
bool>::type=true>
constexpr tuple(_UElements&&... __elements)
We now have:
template<typename... _UElements,
bool _Valid = __valid_args<_UElements...>(),
_ImplicitCtor<_Valid, _UElements...> = true>
constexpr
tuple(_UElements&&... __elements)
There are two semantic changes as a result of the refactoring:
- The allocator-extended default constructor is now constrained.
- The rewritten constraints fix PR 90700.
* include/std/tuple (_TC): Replace with _TupleConstraints.
(_TupleConstraints): New helper for SFINAE constraints, with more
expressive member functions to reduce duplication when used.
(tuple::_TC2, tuple::_TMC, tuple::_TNTC): Remove.
(tuple::_TCC): Replace dummy type parameter with bool non-type
parameter that can be used to check the pack size.
(tuple::_ImplicitDefaultCtor, tuple::_ExplicitDefaultCtor)
(tuple::_ImplicitCtor, tuple::_ExplicitCtor): New alias templates for
checking constraints in constructors.
(tuple::__valid_args, tuple::_UseOtherCtor, tuple::__use_other_ctor):
New SFINAE helpers.
(tuple::tuple): Use new helpers to reduce repitition in constraints.
(tuple::tuple(allocator_arg_t, const Alloc&)): Constrain.
(tuple<T1, T2>::_TCC, tuple<T1, T2>::_ImplicitDefaultCtor)
(tuple<T1, T2>::_ExplicitDefaultCtor, tuple<T1, T2>::_ImplicitCtor)
(tuple<T1, T2>::_ExplicitCtor): New alias templates for checking
constraints in constructors.
(tuple::__is_alloc_arg()): New SFINAE helpers.
(tuple<T1, T2>::tuple): Use new helpers to reduce repitition in
constraints.
(tuple<T1, T2>::tuple(allocator_arg_t, const Alloc&)): Constrain.
* testsuite/20_util/tuple/cons/90700.cc: New test.
* testsuite/20_util/tuple/cons/allocators.cc: Add default constructor
to meet new constraint on allocator-extended default constructor.
From-SVN: r271998
2019-06-06 14:13:36 +02:00
|
|
|
{ }
|
|
|
|
|
|
|
|
template<typename _Alloc, typename... _UElements,
|
|
|
|
bool _Valid = __valid_args<_UElements...>(),
|
|
|
|
_ExplicitCtor<_Valid, _UElements...> = false>
|
|
|
|
explicit
|
|
|
|
tuple(allocator_arg_t __tag, const _Alloc& __a,
|
Implement N4387, "Improving pair and tuple", and LWG 2367.
2015-06-30 Ville Voutilainen <ville.voutilainen@gmail.com>
Implement N4387, "Improving pair and tuple", and LWG 2367.
* include/bits/stl_pair.h (_ConstructiblePair,
_ImplicitlyConvertiblePair, _MoveConstructiblePair,
_ImplicitlyMoveConvertiblePair): New.
(pair()): Constrain it.
(pair(const _T1&, const _T2&), pair(const pair<_U1, _U2>&),
pair(_U1&&, const _T2&), pair(const _T1&, _U2&&), pair(_U1&&, _U2&&),
pair(pair<_U1, _U2>&&)): Make conditionally explicit.
* include/std/tuple (_TC, tuple::_TC2, tuple::TCC, tuple::TMC): New.
(tuple()): Constrain it.
(tuple(const _UElements&...), tuple(_UElements&&...),
tuple(const tuple<_UElements...>&), tuple(tuple<_UElements...>&&),
tuple(allocator_arg_t, const _Alloc&, const _UElements&...),
tuple(allocator_arg_t, const _Alloc&, _UElements&&...),
tuple(allocator_arg_t, const _Alloc&, const tuple<_UElements...>&),
tuple(allocator_arg_t, const _Alloc&, tuple<_UElements...>&&),
tuple(const pair<_U1, _U2>&), tuple(pair<_U1, _U2>&&),
tuple(allocator_arg_t, const _Alloc&, const pair<_U1, _U2>&),
tuple(allocator_arg_t, const _Alloc&, pair<_U1, _U2>&&)): Make
conditionally explicit.
* include/experimental/functional (__boyer_moore_array_base): Name
array type explicitly instead of using an empty braced-init-list.
* testsuite/20_util/pair/cons/explicit_construct.cc: New.
* testsuite/20_util/pair/piecewise.cc: Use piecewise_construct.
* testsuite/20_util/pair/requirements/dr2367.cc: New.
* testsuite/20_util/tuple/cons/explicit_construct.cc: New.
* testsuite/20_util/tuple/requirements/dr2367.cc: New.
From-SVN: r225189
2015-06-30 15:26:49 +02:00
|
|
|
_UElements&&... __elements)
|
|
|
|
: _Inherited(__tag, __a, std::forward<_UElements>(__elements)...)
|
Refactor SFINAE constraints on std::tuple constructors
Replace the _TC class template with the better-named _TupleConstraints
one, which provides a different set of member functions. The new members
do not distinguish construction from lvalues and rvalues, but expects
the caller to do that by providing different template arguments. Within
the std::tuple primary template and std::tuple<T1, T2> partial
specialization the _TupleConstraints members are used via new alias
templates like _ImplicitCtor and _ExplicitCtor which makes the
constructor constraints less verbose and repetitive. For example, where
we previously had:
template<typename... _UElements, typename
enable_if<
_TMC<_UElements...>::template
_MoveConstructibleTuple<_UElements...>()
&& _TMC<_UElements...>::template
_ImplicitlyMoveConvertibleTuple<_UElements...>()
&& (sizeof...(_Elements) >= 1),
bool>::type=true>
constexpr tuple(_UElements&&... __elements)
We now have:
template<typename... _UElements,
bool _Valid = __valid_args<_UElements...>(),
_ImplicitCtor<_Valid, _UElements...> = true>
constexpr
tuple(_UElements&&... __elements)
There are two semantic changes as a result of the refactoring:
- The allocator-extended default constructor is now constrained.
- The rewritten constraints fix PR 90700.
* include/std/tuple (_TC): Replace with _TupleConstraints.
(_TupleConstraints): New helper for SFINAE constraints, with more
expressive member functions to reduce duplication when used.
(tuple::_TC2, tuple::_TMC, tuple::_TNTC): Remove.
(tuple::_TCC): Replace dummy type parameter with bool non-type
parameter that can be used to check the pack size.
(tuple::_ImplicitDefaultCtor, tuple::_ExplicitDefaultCtor)
(tuple::_ImplicitCtor, tuple::_ExplicitCtor): New alias templates for
checking constraints in constructors.
(tuple::__valid_args, tuple::_UseOtherCtor, tuple::__use_other_ctor):
New SFINAE helpers.
(tuple::tuple): Use new helpers to reduce repitition in constraints.
(tuple::tuple(allocator_arg_t, const Alloc&)): Constrain.
(tuple<T1, T2>::_TCC, tuple<T1, T2>::_ImplicitDefaultCtor)
(tuple<T1, T2>::_ExplicitDefaultCtor, tuple<T1, T2>::_ImplicitCtor)
(tuple<T1, T2>::_ExplicitCtor): New alias templates for checking
constraints in constructors.
(tuple::__is_alloc_arg()): New SFINAE helpers.
(tuple<T1, T2>::tuple): Use new helpers to reduce repitition in
constraints.
(tuple<T1, T2>::tuple(allocator_arg_t, const Alloc&)): Constrain.
* testsuite/20_util/tuple/cons/90700.cc: New test.
* testsuite/20_util/tuple/cons/allocators.cc: Add default constructor
to meet new constraint on allocator-extended default constructor.
From-SVN: r271998
2019-06-06 14:13:36 +02:00
|
|
|
{ }
|
Implement N4387, "Improving pair and tuple", and LWG 2367.
2015-06-30 Ville Voutilainen <ville.voutilainen@gmail.com>
Implement N4387, "Improving pair and tuple", and LWG 2367.
* include/bits/stl_pair.h (_ConstructiblePair,
_ImplicitlyConvertiblePair, _MoveConstructiblePair,
_ImplicitlyMoveConvertiblePair): New.
(pair()): Constrain it.
(pair(const _T1&, const _T2&), pair(const pair<_U1, _U2>&),
pair(_U1&&, const _T2&), pair(const _T1&, _U2&&), pair(_U1&&, _U2&&),
pair(pair<_U1, _U2>&&)): Make conditionally explicit.
* include/std/tuple (_TC, tuple::_TC2, tuple::TCC, tuple::TMC): New.
(tuple()): Constrain it.
(tuple(const _UElements&...), tuple(_UElements&&...),
tuple(const tuple<_UElements...>&), tuple(tuple<_UElements...>&&),
tuple(allocator_arg_t, const _Alloc&, const _UElements&...),
tuple(allocator_arg_t, const _Alloc&, _UElements&&...),
tuple(allocator_arg_t, const _Alloc&, const tuple<_UElements...>&),
tuple(allocator_arg_t, const _Alloc&, tuple<_UElements...>&&),
tuple(const pair<_U1, _U2>&), tuple(pair<_U1, _U2>&&),
tuple(allocator_arg_t, const _Alloc&, const pair<_U1, _U2>&),
tuple(allocator_arg_t, const _Alloc&, pair<_U1, _U2>&&)): Make
conditionally explicit.
* include/experimental/functional (__boyer_moore_array_base): Name
array type explicitly instead of using an empty braced-init-list.
* testsuite/20_util/pair/cons/explicit_construct.cc: New.
* testsuite/20_util/pair/piecewise.cc: Use piecewise_construct.
* testsuite/20_util/pair/requirements/dr2367.cc: New.
* testsuite/20_util/tuple/cons/explicit_construct.cc: New.
* testsuite/20_util/tuple/requirements/dr2367.cc: New.
From-SVN: r225189
2015-06-30 15:26:49 +02:00
|
|
|
|
2011-05-30 18:31:17 +02:00
|
|
|
template<typename _Alloc>
|
|
|
|
tuple(allocator_arg_t __tag, const _Alloc& __a, const tuple& __in)
|
|
|
|
: _Inherited(__tag, __a, static_cast<const _Inherited&>(__in)) { }
|
|
|
|
|
|
|
|
template<typename _Alloc>
|
|
|
|
tuple(allocator_arg_t __tag, const _Alloc& __a, tuple&& __in)
|
|
|
|
: _Inherited(__tag, __a, static_cast<_Inherited&&>(__in)) { }
|
|
|
|
|
Refactor SFINAE constraints on std::tuple constructors
Replace the _TC class template with the better-named _TupleConstraints
one, which provides a different set of member functions. The new members
do not distinguish construction from lvalues and rvalues, but expects
the caller to do that by providing different template arguments. Within
the std::tuple primary template and std::tuple<T1, T2> partial
specialization the _TupleConstraints members are used via new alias
templates like _ImplicitCtor and _ExplicitCtor which makes the
constructor constraints less verbose and repetitive. For example, where
we previously had:
template<typename... _UElements, typename
enable_if<
_TMC<_UElements...>::template
_MoveConstructibleTuple<_UElements...>()
&& _TMC<_UElements...>::template
_ImplicitlyMoveConvertibleTuple<_UElements...>()
&& (sizeof...(_Elements) >= 1),
bool>::type=true>
constexpr tuple(_UElements&&... __elements)
We now have:
template<typename... _UElements,
bool _Valid = __valid_args<_UElements...>(),
_ImplicitCtor<_Valid, _UElements...> = true>
constexpr
tuple(_UElements&&... __elements)
There are two semantic changes as a result of the refactoring:
- The allocator-extended default constructor is now constrained.
- The rewritten constraints fix PR 90700.
* include/std/tuple (_TC): Replace with _TupleConstraints.
(_TupleConstraints): New helper for SFINAE constraints, with more
expressive member functions to reduce duplication when used.
(tuple::_TC2, tuple::_TMC, tuple::_TNTC): Remove.
(tuple::_TCC): Replace dummy type parameter with bool non-type
parameter that can be used to check the pack size.
(tuple::_ImplicitDefaultCtor, tuple::_ExplicitDefaultCtor)
(tuple::_ImplicitCtor, tuple::_ExplicitCtor): New alias templates for
checking constraints in constructors.
(tuple::__valid_args, tuple::_UseOtherCtor, tuple::__use_other_ctor):
New SFINAE helpers.
(tuple::tuple): Use new helpers to reduce repitition in constraints.
(tuple::tuple(allocator_arg_t, const Alloc&)): Constrain.
(tuple<T1, T2>::_TCC, tuple<T1, T2>::_ImplicitDefaultCtor)
(tuple<T1, T2>::_ExplicitDefaultCtor, tuple<T1, T2>::_ImplicitCtor)
(tuple<T1, T2>::_ExplicitCtor): New alias templates for checking
constraints in constructors.
(tuple::__is_alloc_arg()): New SFINAE helpers.
(tuple<T1, T2>::tuple): Use new helpers to reduce repitition in
constraints.
(tuple<T1, T2>::tuple(allocator_arg_t, const Alloc&)): Constrain.
* testsuite/20_util/tuple/cons/90700.cc: New test.
* testsuite/20_util/tuple/cons/allocators.cc: Add default constructor
to meet new constraint on allocator-extended default constructor.
From-SVN: r271998
2019-06-06 14:13:36 +02:00
|
|
|
template<typename _Alloc, typename... _UElements,
|
|
|
|
bool _Valid = (sizeof...(_Elements) == sizeof...(_UElements))
|
|
|
|
&& !__use_other_ctor<const tuple<_UElements...>&>(),
|
|
|
|
_ImplicitCtor<_Valid, const _UElements&...> = true>
|
2011-05-30 18:31:17 +02:00
|
|
|
tuple(allocator_arg_t __tag, const _Alloc& __a,
|
|
|
|
const tuple<_UElements...>& __in)
|
|
|
|
: _Inherited(__tag, __a,
|
|
|
|
static_cast<const _Tuple_impl<0, _UElements...>&>(__in))
|
|
|
|
{ }
|
|
|
|
|
Refactor SFINAE constraints on std::tuple constructors
Replace the _TC class template with the better-named _TupleConstraints
one, which provides a different set of member functions. The new members
do not distinguish construction from lvalues and rvalues, but expects
the caller to do that by providing different template arguments. Within
the std::tuple primary template and std::tuple<T1, T2> partial
specialization the _TupleConstraints members are used via new alias
templates like _ImplicitCtor and _ExplicitCtor which makes the
constructor constraints less verbose and repetitive. For example, where
we previously had:
template<typename... _UElements, typename
enable_if<
_TMC<_UElements...>::template
_MoveConstructibleTuple<_UElements...>()
&& _TMC<_UElements...>::template
_ImplicitlyMoveConvertibleTuple<_UElements...>()
&& (sizeof...(_Elements) >= 1),
bool>::type=true>
constexpr tuple(_UElements&&... __elements)
We now have:
template<typename... _UElements,
bool _Valid = __valid_args<_UElements...>(),
_ImplicitCtor<_Valid, _UElements...> = true>
constexpr
tuple(_UElements&&... __elements)
There are two semantic changes as a result of the refactoring:
- The allocator-extended default constructor is now constrained.
- The rewritten constraints fix PR 90700.
* include/std/tuple (_TC): Replace with _TupleConstraints.
(_TupleConstraints): New helper for SFINAE constraints, with more
expressive member functions to reduce duplication when used.
(tuple::_TC2, tuple::_TMC, tuple::_TNTC): Remove.
(tuple::_TCC): Replace dummy type parameter with bool non-type
parameter that can be used to check the pack size.
(tuple::_ImplicitDefaultCtor, tuple::_ExplicitDefaultCtor)
(tuple::_ImplicitCtor, tuple::_ExplicitCtor): New alias templates for
checking constraints in constructors.
(tuple::__valid_args, tuple::_UseOtherCtor, tuple::__use_other_ctor):
New SFINAE helpers.
(tuple::tuple): Use new helpers to reduce repitition in constraints.
(tuple::tuple(allocator_arg_t, const Alloc&)): Constrain.
(tuple<T1, T2>::_TCC, tuple<T1, T2>::_ImplicitDefaultCtor)
(tuple<T1, T2>::_ExplicitDefaultCtor, tuple<T1, T2>::_ImplicitCtor)
(tuple<T1, T2>::_ExplicitCtor): New alias templates for checking
constraints in constructors.
(tuple::__is_alloc_arg()): New SFINAE helpers.
(tuple<T1, T2>::tuple): Use new helpers to reduce repitition in
constraints.
(tuple<T1, T2>::tuple(allocator_arg_t, const Alloc&)): Constrain.
* testsuite/20_util/tuple/cons/90700.cc: New test.
* testsuite/20_util/tuple/cons/allocators.cc: Add default constructor
to meet new constraint on allocator-extended default constructor.
From-SVN: r271998
2019-06-06 14:13:36 +02:00
|
|
|
template<typename _Alloc, typename... _UElements,
|
|
|
|
bool _Valid = (sizeof...(_Elements) == sizeof...(_UElements))
|
|
|
|
&& !__use_other_ctor<const tuple<_UElements...>&>(),
|
|
|
|
_ExplicitCtor<_Valid, const _UElements&...> = false>
|
|
|
|
explicit
|
|
|
|
tuple(allocator_arg_t __tag, const _Alloc& __a,
|
Implement N4387, "Improving pair and tuple", and LWG 2367.
2015-06-30 Ville Voutilainen <ville.voutilainen@gmail.com>
Implement N4387, "Improving pair and tuple", and LWG 2367.
* include/bits/stl_pair.h (_ConstructiblePair,
_ImplicitlyConvertiblePair, _MoveConstructiblePair,
_ImplicitlyMoveConvertiblePair): New.
(pair()): Constrain it.
(pair(const _T1&, const _T2&), pair(const pair<_U1, _U2>&),
pair(_U1&&, const _T2&), pair(const _T1&, _U2&&), pair(_U1&&, _U2&&),
pair(pair<_U1, _U2>&&)): Make conditionally explicit.
* include/std/tuple (_TC, tuple::_TC2, tuple::TCC, tuple::TMC): New.
(tuple()): Constrain it.
(tuple(const _UElements&...), tuple(_UElements&&...),
tuple(const tuple<_UElements...>&), tuple(tuple<_UElements...>&&),
tuple(allocator_arg_t, const _Alloc&, const _UElements&...),
tuple(allocator_arg_t, const _Alloc&, _UElements&&...),
tuple(allocator_arg_t, const _Alloc&, const tuple<_UElements...>&),
tuple(allocator_arg_t, const _Alloc&, tuple<_UElements...>&&),
tuple(const pair<_U1, _U2>&), tuple(pair<_U1, _U2>&&),
tuple(allocator_arg_t, const _Alloc&, const pair<_U1, _U2>&),
tuple(allocator_arg_t, const _Alloc&, pair<_U1, _U2>&&)): Make
conditionally explicit.
* include/experimental/functional (__boyer_moore_array_base): Name
array type explicitly instead of using an empty braced-init-list.
* testsuite/20_util/pair/cons/explicit_construct.cc: New.
* testsuite/20_util/pair/piecewise.cc: Use piecewise_construct.
* testsuite/20_util/pair/requirements/dr2367.cc: New.
* testsuite/20_util/tuple/cons/explicit_construct.cc: New.
* testsuite/20_util/tuple/requirements/dr2367.cc: New.
From-SVN: r225189
2015-06-30 15:26:49 +02:00
|
|
|
const tuple<_UElements...>& __in)
|
|
|
|
: _Inherited(__tag, __a,
|
|
|
|
static_cast<const _Tuple_impl<0, _UElements...>&>(__in))
|
|
|
|
{ }
|
|
|
|
|
Refactor SFINAE constraints on std::tuple constructors
Replace the _TC class template with the better-named _TupleConstraints
one, which provides a different set of member functions. The new members
do not distinguish construction from lvalues and rvalues, but expects
the caller to do that by providing different template arguments. Within
the std::tuple primary template and std::tuple<T1, T2> partial
specialization the _TupleConstraints members are used via new alias
templates like _ImplicitCtor and _ExplicitCtor which makes the
constructor constraints less verbose and repetitive. For example, where
we previously had:
template<typename... _UElements, typename
enable_if<
_TMC<_UElements...>::template
_MoveConstructibleTuple<_UElements...>()
&& _TMC<_UElements...>::template
_ImplicitlyMoveConvertibleTuple<_UElements...>()
&& (sizeof...(_Elements) >= 1),
bool>::type=true>
constexpr tuple(_UElements&&... __elements)
We now have:
template<typename... _UElements,
bool _Valid = __valid_args<_UElements...>(),
_ImplicitCtor<_Valid, _UElements...> = true>
constexpr
tuple(_UElements&&... __elements)
There are two semantic changes as a result of the refactoring:
- The allocator-extended default constructor is now constrained.
- The rewritten constraints fix PR 90700.
* include/std/tuple (_TC): Replace with _TupleConstraints.
(_TupleConstraints): New helper for SFINAE constraints, with more
expressive member functions to reduce duplication when used.
(tuple::_TC2, tuple::_TMC, tuple::_TNTC): Remove.
(tuple::_TCC): Replace dummy type parameter with bool non-type
parameter that can be used to check the pack size.
(tuple::_ImplicitDefaultCtor, tuple::_ExplicitDefaultCtor)
(tuple::_ImplicitCtor, tuple::_ExplicitCtor): New alias templates for
checking constraints in constructors.
(tuple::__valid_args, tuple::_UseOtherCtor, tuple::__use_other_ctor):
New SFINAE helpers.
(tuple::tuple): Use new helpers to reduce repitition in constraints.
(tuple::tuple(allocator_arg_t, const Alloc&)): Constrain.
(tuple<T1, T2>::_TCC, tuple<T1, T2>::_ImplicitDefaultCtor)
(tuple<T1, T2>::_ExplicitDefaultCtor, tuple<T1, T2>::_ImplicitCtor)
(tuple<T1, T2>::_ExplicitCtor): New alias templates for checking
constraints in constructors.
(tuple::__is_alloc_arg()): New SFINAE helpers.
(tuple<T1, T2>::tuple): Use new helpers to reduce repitition in
constraints.
(tuple<T1, T2>::tuple(allocator_arg_t, const Alloc&)): Constrain.
* testsuite/20_util/tuple/cons/90700.cc: New test.
* testsuite/20_util/tuple/cons/allocators.cc: Add default constructor
to meet new constraint on allocator-extended default constructor.
From-SVN: r271998
2019-06-06 14:13:36 +02:00
|
|
|
template<typename _Alloc, typename... _UElements,
|
|
|
|
bool _Valid = (sizeof...(_Elements) == sizeof...(_UElements))
|
|
|
|
&& !__use_other_ctor<tuple<_UElements...>&&>(),
|
|
|
|
_ImplicitCtor<_Valid, _UElements...> = true>
|
2011-05-30 18:31:17 +02:00
|
|
|
tuple(allocator_arg_t __tag, const _Alloc& __a,
|
|
|
|
tuple<_UElements...>&& __in)
|
|
|
|
: _Inherited(__tag, __a,
|
|
|
|
static_cast<_Tuple_impl<0, _UElements...>&&>(__in))
|
|
|
|
{ }
|
|
|
|
|
Refactor SFINAE constraints on std::tuple constructors
Replace the _TC class template with the better-named _TupleConstraints
one, which provides a different set of member functions. The new members
do not distinguish construction from lvalues and rvalues, but expects
the caller to do that by providing different template arguments. Within
the std::tuple primary template and std::tuple<T1, T2> partial
specialization the _TupleConstraints members are used via new alias
templates like _ImplicitCtor and _ExplicitCtor which makes the
constructor constraints less verbose and repetitive. For example, where
we previously had:
template<typename... _UElements, typename
enable_if<
_TMC<_UElements...>::template
_MoveConstructibleTuple<_UElements...>()
&& _TMC<_UElements...>::template
_ImplicitlyMoveConvertibleTuple<_UElements...>()
&& (sizeof...(_Elements) >= 1),
bool>::type=true>
constexpr tuple(_UElements&&... __elements)
We now have:
template<typename... _UElements,
bool _Valid = __valid_args<_UElements...>(),
_ImplicitCtor<_Valid, _UElements...> = true>
constexpr
tuple(_UElements&&... __elements)
There are two semantic changes as a result of the refactoring:
- The allocator-extended default constructor is now constrained.
- The rewritten constraints fix PR 90700.
* include/std/tuple (_TC): Replace with _TupleConstraints.
(_TupleConstraints): New helper for SFINAE constraints, with more
expressive member functions to reduce duplication when used.
(tuple::_TC2, tuple::_TMC, tuple::_TNTC): Remove.
(tuple::_TCC): Replace dummy type parameter with bool non-type
parameter that can be used to check the pack size.
(tuple::_ImplicitDefaultCtor, tuple::_ExplicitDefaultCtor)
(tuple::_ImplicitCtor, tuple::_ExplicitCtor): New alias templates for
checking constraints in constructors.
(tuple::__valid_args, tuple::_UseOtherCtor, tuple::__use_other_ctor):
New SFINAE helpers.
(tuple::tuple): Use new helpers to reduce repitition in constraints.
(tuple::tuple(allocator_arg_t, const Alloc&)): Constrain.
(tuple<T1, T2>::_TCC, tuple<T1, T2>::_ImplicitDefaultCtor)
(tuple<T1, T2>::_ExplicitDefaultCtor, tuple<T1, T2>::_ImplicitCtor)
(tuple<T1, T2>::_ExplicitCtor): New alias templates for checking
constraints in constructors.
(tuple::__is_alloc_arg()): New SFINAE helpers.
(tuple<T1, T2>::tuple): Use new helpers to reduce repitition in
constraints.
(tuple<T1, T2>::tuple(allocator_arg_t, const Alloc&)): Constrain.
* testsuite/20_util/tuple/cons/90700.cc: New test.
* testsuite/20_util/tuple/cons/allocators.cc: Add default constructor
to meet new constraint on allocator-extended default constructor.
From-SVN: r271998
2019-06-06 14:13:36 +02:00
|
|
|
template<typename _Alloc, typename... _UElements,
|
|
|
|
bool _Valid = (sizeof...(_Elements) == sizeof...(_UElements))
|
|
|
|
&& !__use_other_ctor<tuple<_UElements...>&&>(),
|
|
|
|
_ExplicitCtor<_Valid, _UElements...> = false>
|
|
|
|
explicit
|
|
|
|
tuple(allocator_arg_t __tag, const _Alloc& __a,
|
Implement N4387, "Improving pair and tuple", and LWG 2367.
2015-06-30 Ville Voutilainen <ville.voutilainen@gmail.com>
Implement N4387, "Improving pair and tuple", and LWG 2367.
* include/bits/stl_pair.h (_ConstructiblePair,
_ImplicitlyConvertiblePair, _MoveConstructiblePair,
_ImplicitlyMoveConvertiblePair): New.
(pair()): Constrain it.
(pair(const _T1&, const _T2&), pair(const pair<_U1, _U2>&),
pair(_U1&&, const _T2&), pair(const _T1&, _U2&&), pair(_U1&&, _U2&&),
pair(pair<_U1, _U2>&&)): Make conditionally explicit.
* include/std/tuple (_TC, tuple::_TC2, tuple::TCC, tuple::TMC): New.
(tuple()): Constrain it.
(tuple(const _UElements&...), tuple(_UElements&&...),
tuple(const tuple<_UElements...>&), tuple(tuple<_UElements...>&&),
tuple(allocator_arg_t, const _Alloc&, const _UElements&...),
tuple(allocator_arg_t, const _Alloc&, _UElements&&...),
tuple(allocator_arg_t, const _Alloc&, const tuple<_UElements...>&),
tuple(allocator_arg_t, const _Alloc&, tuple<_UElements...>&&),
tuple(const pair<_U1, _U2>&), tuple(pair<_U1, _U2>&&),
tuple(allocator_arg_t, const _Alloc&, const pair<_U1, _U2>&),
tuple(allocator_arg_t, const _Alloc&, pair<_U1, _U2>&&)): Make
conditionally explicit.
* include/experimental/functional (__boyer_moore_array_base): Name
array type explicitly instead of using an empty braced-init-list.
* testsuite/20_util/pair/cons/explicit_construct.cc: New.
* testsuite/20_util/pair/piecewise.cc: Use piecewise_construct.
* testsuite/20_util/pair/requirements/dr2367.cc: New.
* testsuite/20_util/tuple/cons/explicit_construct.cc: New.
* testsuite/20_util/tuple/requirements/dr2367.cc: New.
From-SVN: r225189
2015-06-30 15:26:49 +02:00
|
|
|
tuple<_UElements...>&& __in)
|
|
|
|
: _Inherited(__tag, __a,
|
|
|
|
static_cast<_Tuple_impl<0, _UElements...>&&>(__in))
|
|
|
|
{ }
|
|
|
|
|
PR libstdc++/86963 Remove use of __tuple_base in std::tuple
The _Tuple_impl base class can be used to disable copy/move assignment,
without requiring an extra base class.
Exception specifications on std::tuple assignment and swap functions can
be defined directly using is_nothrow_swappable, instead of querying the
base classes.
PR libstdc++/86963
* include/std/tuple (_Tuple_impl::operator=): Define as deleted.
(_Tuple_impl::_M_assign): New functions to perform assignment instead
of assignment operators.
(_Tuple_impl::_M_swap): Remove exception specification.
(_Tuple_impl<_Idx, _Head>): Likewise.
(_TC::_NonNestedTuple, _TC::_NotSameTuple): Use __remove_cvref_t.
(__tuple_base): Remove.
(tuple, tuple<_T1, _T2>): Remove inheritance from __tuple_base.
(tuple::operator=, tuple<_T1, _T2>::operator=): Call _M_assign.
(tuple::swap, tuple<_T1, _T2>::swap): Define exception specification
using __is_nothrow_swappable.
(tuple<_T1, _T2>::tuple(_U1&&, _U2&&)): Use __remove_cvref_t.
From-SVN: r263661
2018-08-20 15:53:56 +02:00
|
|
|
// tuple assignment
|
|
|
|
|
2007-12-26 16:23:49 +01:00
|
|
|
tuple&
|
PR libstdc++/86963 Implement LWG 2729 constraints on tuple assignment
PR libstdc++/86963
* include/std/tuple (__tuple_base): New class template with deleted
copy assignment operator.
(tuple, tuple<_T1, _T2>): Derive from __tuple_base<tuple> so that
implicit copy/move assignment operator will be deleted/suppressed.
(tuple::__assignable, tuple<_T1, _T2>::__assignable): New helper
functions for SFINAE constraints on assignment operators.
(tuple::__nothrow_assignable, tuple<_T1, _T2>::__nothrow_assignable):
New helper functions for exception specifications.
(tuple::operator=(const tuple&), tuple::operator=(tuple&&))
(tuple<_T1, _T2>::operator=(const tuple&))
(tuple<_T1, _T2>::operator=(tuple&&)): Change parameter types to
__nonesuch_no_braces when the operator should be defined implicitly.
Use __nothrow_assignable for exception specifications.
(tuple::operator=(const tuple<_UElements...>&))
(tuple::operator=(tuple<_UElements...>&&))
(tuple<_T1, _T2>::operator=(const tuple<_U1, _U2>&))
(tuple<_T1, _T2>::operator=(tuple<_U1, _U2>&&))
(tuple<_T1, _T2>::operator=(const pair<_U1, _U2>&))
(tuple<_T1, _T2>::operator=(pair<_U1, _U2>&&)): Constrain using
__assignable and use __nothrow_assignable for exception
specifications.
* python/libstdcxx/v6/printers.py (is_specialization_of): Accept
gdb.Type as first argument, instead of a string.
(StdTuplePrinter._iterator._is_nonempty_tuple): New method to check
tuple for expected structure.
(StdTuplePrinter._iterator.__init__): Use _is_nonempty_tuple.
* testsuite/20_util/tuple/dr2729.cc: New test.
* testsuite/20_util/tuple/element_access/get_neg.cc: Change dg-error
to dg-prune-output.
From-SVN: r263625
2018-08-17 19:52:49 +02:00
|
|
|
operator=(typename conditional<__assignable<const _Elements&...>(),
|
|
|
|
const tuple&,
|
2019-05-14 17:48:27 +02:00
|
|
|
const __nonesuch&>::type __in)
|
PR libstdc++/86963 Implement LWG 2729 constraints on tuple assignment
PR libstdc++/86963
* include/std/tuple (__tuple_base): New class template with deleted
copy assignment operator.
(tuple, tuple<_T1, _T2>): Derive from __tuple_base<tuple> so that
implicit copy/move assignment operator will be deleted/suppressed.
(tuple::__assignable, tuple<_T1, _T2>::__assignable): New helper
functions for SFINAE constraints on assignment operators.
(tuple::__nothrow_assignable, tuple<_T1, _T2>::__nothrow_assignable):
New helper functions for exception specifications.
(tuple::operator=(const tuple&), tuple::operator=(tuple&&))
(tuple<_T1, _T2>::operator=(const tuple&))
(tuple<_T1, _T2>::operator=(tuple&&)): Change parameter types to
__nonesuch_no_braces when the operator should be defined implicitly.
Use __nothrow_assignable for exception specifications.
(tuple::operator=(const tuple<_UElements...>&))
(tuple::operator=(tuple<_UElements...>&&))
(tuple<_T1, _T2>::operator=(const tuple<_U1, _U2>&))
(tuple<_T1, _T2>::operator=(tuple<_U1, _U2>&&))
(tuple<_T1, _T2>::operator=(const pair<_U1, _U2>&))
(tuple<_T1, _T2>::operator=(pair<_U1, _U2>&&)): Constrain using
__assignable and use __nothrow_assignable for exception
specifications.
* python/libstdcxx/v6/printers.py (is_specialization_of): Accept
gdb.Type as first argument, instead of a string.
(StdTuplePrinter._iterator._is_nonempty_tuple): New method to check
tuple for expected structure.
(StdTuplePrinter._iterator.__init__): Use _is_nonempty_tuple.
* testsuite/20_util/tuple/dr2729.cc: New test.
* testsuite/20_util/tuple/element_access/get_neg.cc: Change dg-error
to dg-prune-output.
From-SVN: r263625
2018-08-17 19:52:49 +02:00
|
|
|
noexcept(__nothrow_assignable<const _Elements&...>())
|
2007-12-26 16:23:49 +01:00
|
|
|
{
|
PR libstdc++/86963 Remove use of __tuple_base in std::tuple
The _Tuple_impl base class can be used to disable copy/move assignment,
without requiring an extra base class.
Exception specifications on std::tuple assignment and swap functions can
be defined directly using is_nothrow_swappable, instead of querying the
base classes.
PR libstdc++/86963
* include/std/tuple (_Tuple_impl::operator=): Define as deleted.
(_Tuple_impl::_M_assign): New functions to perform assignment instead
of assignment operators.
(_Tuple_impl::_M_swap): Remove exception specification.
(_Tuple_impl<_Idx, _Head>): Likewise.
(_TC::_NonNestedTuple, _TC::_NotSameTuple): Use __remove_cvref_t.
(__tuple_base): Remove.
(tuple, tuple<_T1, _T2>): Remove inheritance from __tuple_base.
(tuple::operator=, tuple<_T1, _T2>::operator=): Call _M_assign.
(tuple::swap, tuple<_T1, _T2>::swap): Define exception specification
using __is_nothrow_swappable.
(tuple<_T1, _T2>::tuple(_U1&&, _U2&&)): Use __remove_cvref_t.
From-SVN: r263661
2018-08-20 15:53:56 +02:00
|
|
|
this->_M_assign(__in);
|
2007-12-26 16:23:49 +01:00
|
|
|
return *this;
|
|
|
|
}
|
tuple (_Tuple_impl<>::_Tuple_impl(typename std::remove_reference<>::type&&, typename std::remove_reference<>::type&&...), [...]): Add.
2007-12-30 Paolo Carlini <pcarlini@suse.de>
* include/std/tuple (_Tuple_impl<>::_Tuple_impl(typename
std::remove_reference<>::type&&, typename
std::remove_reference<>::type&&...),
_Tuple_impl(const _Tuple_impl<>&), _Tuple_impl(_Tuple_impl&&),
_Tuple_impl(_Tuple_impl<>&&), operator=(_Tuple_impl&&),
operator=(const _Tuple_impl<>&), operator=(_Tuple_impl<>&&)): Add.
(tuple<>::tuple(const _Elements&...), tuple(_UElements&&...),
tuple(tuple&&), tuple(const tuple<>&), tuple(tuple<>&&),
operator=(tuple&&), operator=(const tuple<>&), operator=(tuple<>&&)):
Likewise.
(tuple<_T1, _T2>::tuple(const _T1&, const _T2&, tuple(_U1&&, _U2&&),
tuple(tuple&&), tuple(tuple<>&&), tuple(pair<>&&), operator=(tuple&&),
operator=(tuple<>&&), operator=(pair<>&&)): Likewise.
(tuple<>::tuple(typename __add_c_ref<_Elements>::type...),
tuple<_T1, _T2>::tuple(typename __add_c_ref<>::type,
typename __add_c_ref<>::type)): Remove.
* testsuite/tr1/6_containers/tuple/creation_functions/tie2.cc: New.
* testsuite/20_util/tuple/creation_functions/tie2.cc: Likewise.
* testsuite/20_util/tuple/moveable.cc: Likewise.
From-SVN: r131230
2007-12-30 23:44:42 +01:00
|
|
|
|
|
|
|
tuple&
|
PR libstdc++/86963 Implement LWG 2729 constraints on tuple assignment
PR libstdc++/86963
* include/std/tuple (__tuple_base): New class template with deleted
copy assignment operator.
(tuple, tuple<_T1, _T2>): Derive from __tuple_base<tuple> so that
implicit copy/move assignment operator will be deleted/suppressed.
(tuple::__assignable, tuple<_T1, _T2>::__assignable): New helper
functions for SFINAE constraints on assignment operators.
(tuple::__nothrow_assignable, tuple<_T1, _T2>::__nothrow_assignable):
New helper functions for exception specifications.
(tuple::operator=(const tuple&), tuple::operator=(tuple&&))
(tuple<_T1, _T2>::operator=(const tuple&))
(tuple<_T1, _T2>::operator=(tuple&&)): Change parameter types to
__nonesuch_no_braces when the operator should be defined implicitly.
Use __nothrow_assignable for exception specifications.
(tuple::operator=(const tuple<_UElements...>&))
(tuple::operator=(tuple<_UElements...>&&))
(tuple<_T1, _T2>::operator=(const tuple<_U1, _U2>&))
(tuple<_T1, _T2>::operator=(tuple<_U1, _U2>&&))
(tuple<_T1, _T2>::operator=(const pair<_U1, _U2>&))
(tuple<_T1, _T2>::operator=(pair<_U1, _U2>&&)): Constrain using
__assignable and use __nothrow_assignable for exception
specifications.
* python/libstdcxx/v6/printers.py (is_specialization_of): Accept
gdb.Type as first argument, instead of a string.
(StdTuplePrinter._iterator._is_nonempty_tuple): New method to check
tuple for expected structure.
(StdTuplePrinter._iterator.__init__): Use _is_nonempty_tuple.
* testsuite/20_util/tuple/dr2729.cc: New test.
* testsuite/20_util/tuple/element_access/get_neg.cc: Change dg-error
to dg-prune-output.
From-SVN: r263625
2018-08-17 19:52:49 +02:00
|
|
|
operator=(typename conditional<__assignable<_Elements...>(),
|
|
|
|
tuple&&,
|
2019-05-14 17:48:27 +02:00
|
|
|
__nonesuch&&>::type __in)
|
PR libstdc++/86963 Implement LWG 2729 constraints on tuple assignment
PR libstdc++/86963
* include/std/tuple (__tuple_base): New class template with deleted
copy assignment operator.
(tuple, tuple<_T1, _T2>): Derive from __tuple_base<tuple> so that
implicit copy/move assignment operator will be deleted/suppressed.
(tuple::__assignable, tuple<_T1, _T2>::__assignable): New helper
functions for SFINAE constraints on assignment operators.
(tuple::__nothrow_assignable, tuple<_T1, _T2>::__nothrow_assignable):
New helper functions for exception specifications.
(tuple::operator=(const tuple&), tuple::operator=(tuple&&))
(tuple<_T1, _T2>::operator=(const tuple&))
(tuple<_T1, _T2>::operator=(tuple&&)): Change parameter types to
__nonesuch_no_braces when the operator should be defined implicitly.
Use __nothrow_assignable for exception specifications.
(tuple::operator=(const tuple<_UElements...>&))
(tuple::operator=(tuple<_UElements...>&&))
(tuple<_T1, _T2>::operator=(const tuple<_U1, _U2>&))
(tuple<_T1, _T2>::operator=(tuple<_U1, _U2>&&))
(tuple<_T1, _T2>::operator=(const pair<_U1, _U2>&))
(tuple<_T1, _T2>::operator=(pair<_U1, _U2>&&)): Constrain using
__assignable and use __nothrow_assignable for exception
specifications.
* python/libstdcxx/v6/printers.py (is_specialization_of): Accept
gdb.Type as first argument, instead of a string.
(StdTuplePrinter._iterator._is_nonempty_tuple): New method to check
tuple for expected structure.
(StdTuplePrinter._iterator.__init__): Use _is_nonempty_tuple.
* testsuite/20_util/tuple/dr2729.cc: New test.
* testsuite/20_util/tuple/element_access/get_neg.cc: Change dg-error
to dg-prune-output.
From-SVN: r263625
2018-08-17 19:52:49 +02:00
|
|
|
noexcept(__nothrow_assignable<_Elements...>())
|
tuple (_Tuple_impl<>::_Tuple_impl(typename std::remove_reference<>::type&&, typename std::remove_reference<>::type&&...), [...]): Add.
2007-12-30 Paolo Carlini <pcarlini@suse.de>
* include/std/tuple (_Tuple_impl<>::_Tuple_impl(typename
std::remove_reference<>::type&&, typename
std::remove_reference<>::type&&...),
_Tuple_impl(const _Tuple_impl<>&), _Tuple_impl(_Tuple_impl&&),
_Tuple_impl(_Tuple_impl<>&&), operator=(_Tuple_impl&&),
operator=(const _Tuple_impl<>&), operator=(_Tuple_impl<>&&)): Add.
(tuple<>::tuple(const _Elements&...), tuple(_UElements&&...),
tuple(tuple&&), tuple(const tuple<>&), tuple(tuple<>&&),
operator=(tuple&&), operator=(const tuple<>&), operator=(tuple<>&&)):
Likewise.
(tuple<_T1, _T2>::tuple(const _T1&, const _T2&, tuple(_U1&&, _U2&&),
tuple(tuple&&), tuple(tuple<>&&), tuple(pair<>&&), operator=(tuple&&),
operator=(tuple<>&&), operator=(pair<>&&)): Likewise.
(tuple<>::tuple(typename __add_c_ref<_Elements>::type...),
tuple<_T1, _T2>::tuple(typename __add_c_ref<>::type,
typename __add_c_ref<>::type)): Remove.
* testsuite/tr1/6_containers/tuple/creation_functions/tie2.cc: New.
* testsuite/20_util/tuple/creation_functions/tie2.cc: Likewise.
* testsuite/20_util/tuple/moveable.cc: Likewise.
From-SVN: r131230
2007-12-30 23:44:42 +01:00
|
|
|
{
|
PR libstdc++/86963 Remove use of __tuple_base in std::tuple
The _Tuple_impl base class can be used to disable copy/move assignment,
without requiring an extra base class.
Exception specifications on std::tuple assignment and swap functions can
be defined directly using is_nothrow_swappable, instead of querying the
base classes.
PR libstdc++/86963
* include/std/tuple (_Tuple_impl::operator=): Define as deleted.
(_Tuple_impl::_M_assign): New functions to perform assignment instead
of assignment operators.
(_Tuple_impl::_M_swap): Remove exception specification.
(_Tuple_impl<_Idx, _Head>): Likewise.
(_TC::_NonNestedTuple, _TC::_NotSameTuple): Use __remove_cvref_t.
(__tuple_base): Remove.
(tuple, tuple<_T1, _T2>): Remove inheritance from __tuple_base.
(tuple::operator=, tuple<_T1, _T2>::operator=): Call _M_assign.
(tuple::swap, tuple<_T1, _T2>::swap): Define exception specification
using __is_nothrow_swappable.
(tuple<_T1, _T2>::tuple(_U1&&, _U2&&)): Use __remove_cvref_t.
From-SVN: r263661
2018-08-20 15:53:56 +02:00
|
|
|
this->_M_assign(std::move(__in));
|
tuple (_Tuple_impl<>::_Tuple_impl(typename std::remove_reference<>::type&&, typename std::remove_reference<>::type&&...), [...]): Add.
2007-12-30 Paolo Carlini <pcarlini@suse.de>
* include/std/tuple (_Tuple_impl<>::_Tuple_impl(typename
std::remove_reference<>::type&&, typename
std::remove_reference<>::type&&...),
_Tuple_impl(const _Tuple_impl<>&), _Tuple_impl(_Tuple_impl&&),
_Tuple_impl(_Tuple_impl<>&&), operator=(_Tuple_impl&&),
operator=(const _Tuple_impl<>&), operator=(_Tuple_impl<>&&)): Add.
(tuple<>::tuple(const _Elements&...), tuple(_UElements&&...),
tuple(tuple&&), tuple(const tuple<>&), tuple(tuple<>&&),
operator=(tuple&&), operator=(const tuple<>&), operator=(tuple<>&&)):
Likewise.
(tuple<_T1, _T2>::tuple(const _T1&, const _T2&, tuple(_U1&&, _U2&&),
tuple(tuple&&), tuple(tuple<>&&), tuple(pair<>&&), operator=(tuple&&),
operator=(tuple<>&&), operator=(pair<>&&)): Likewise.
(tuple<>::tuple(typename __add_c_ref<_Elements>::type...),
tuple<_T1, _T2>::tuple(typename __add_c_ref<>::type,
typename __add_c_ref<>::type)): Remove.
* testsuite/tr1/6_containers/tuple/creation_functions/tie2.cc: New.
* testsuite/20_util/tuple/creation_functions/tie2.cc: Likewise.
* testsuite/20_util/tuple/moveable.cc: Likewise.
From-SVN: r131230
2007-12-30 23:44:42 +01:00
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
2016-11-14 16:30:37 +01:00
|
|
|
template<typename... _UElements>
|
PR libstdc++/86963 Implement LWG 2729 constraints on tuple assignment
PR libstdc++/86963
* include/std/tuple (__tuple_base): New class template with deleted
copy assignment operator.
(tuple, tuple<_T1, _T2>): Derive from __tuple_base<tuple> so that
implicit copy/move assignment operator will be deleted/suppressed.
(tuple::__assignable, tuple<_T1, _T2>::__assignable): New helper
functions for SFINAE constraints on assignment operators.
(tuple::__nothrow_assignable, tuple<_T1, _T2>::__nothrow_assignable):
New helper functions for exception specifications.
(tuple::operator=(const tuple&), tuple::operator=(tuple&&))
(tuple<_T1, _T2>::operator=(const tuple&))
(tuple<_T1, _T2>::operator=(tuple&&)): Change parameter types to
__nonesuch_no_braces when the operator should be defined implicitly.
Use __nothrow_assignable for exception specifications.
(tuple::operator=(const tuple<_UElements...>&))
(tuple::operator=(tuple<_UElements...>&&))
(tuple<_T1, _T2>::operator=(const tuple<_U1, _U2>&))
(tuple<_T1, _T2>::operator=(tuple<_U1, _U2>&&))
(tuple<_T1, _T2>::operator=(const pair<_U1, _U2>&))
(tuple<_T1, _T2>::operator=(pair<_U1, _U2>&&)): Constrain using
__assignable and use __nothrow_assignable for exception
specifications.
* python/libstdcxx/v6/printers.py (is_specialization_of): Accept
gdb.Type as first argument, instead of a string.
(StdTuplePrinter._iterator._is_nonempty_tuple): New method to check
tuple for expected structure.
(StdTuplePrinter._iterator.__init__): Use _is_nonempty_tuple.
* testsuite/20_util/tuple/dr2729.cc: New test.
* testsuite/20_util/tuple/element_access/get_neg.cc: Change dg-error
to dg-prune-output.
From-SVN: r263625
2018-08-17 19:52:49 +02:00
|
|
|
__enable_if_t<__assignable<const _UElements&...>(), tuple&>
|
|
|
|
operator=(const tuple<_UElements...>& __in)
|
|
|
|
noexcept(__nothrow_assignable<const _UElements&...>())
|
|
|
|
{
|
PR libstdc++/86963 Remove use of __tuple_base in std::tuple
The _Tuple_impl base class can be used to disable copy/move assignment,
without requiring an extra base class.
Exception specifications on std::tuple assignment and swap functions can
be defined directly using is_nothrow_swappable, instead of querying the
base classes.
PR libstdc++/86963
* include/std/tuple (_Tuple_impl::operator=): Define as deleted.
(_Tuple_impl::_M_assign): New functions to perform assignment instead
of assignment operators.
(_Tuple_impl::_M_swap): Remove exception specification.
(_Tuple_impl<_Idx, _Head>): Likewise.
(_TC::_NonNestedTuple, _TC::_NotSameTuple): Use __remove_cvref_t.
(__tuple_base): Remove.
(tuple, tuple<_T1, _T2>): Remove inheritance from __tuple_base.
(tuple::operator=, tuple<_T1, _T2>::operator=): Call _M_assign.
(tuple::swap, tuple<_T1, _T2>::swap): Define exception specification
using __is_nothrow_swappable.
(tuple<_T1, _T2>::tuple(_U1&&, _U2&&)): Use __remove_cvref_t.
From-SVN: r263661
2018-08-20 15:53:56 +02:00
|
|
|
this->_M_assign(__in);
|
tuple (_Tuple_impl<>::_Tuple_impl(typename std::remove_reference<>::type&&, typename std::remove_reference<>::type&&...), [...]): Add.
2007-12-30 Paolo Carlini <pcarlini@suse.de>
* include/std/tuple (_Tuple_impl<>::_Tuple_impl(typename
std::remove_reference<>::type&&, typename
std::remove_reference<>::type&&...),
_Tuple_impl(const _Tuple_impl<>&), _Tuple_impl(_Tuple_impl&&),
_Tuple_impl(_Tuple_impl<>&&), operator=(_Tuple_impl&&),
operator=(const _Tuple_impl<>&), operator=(_Tuple_impl<>&&)): Add.
(tuple<>::tuple(const _Elements&...), tuple(_UElements&&...),
tuple(tuple&&), tuple(const tuple<>&), tuple(tuple<>&&),
operator=(tuple&&), operator=(const tuple<>&), operator=(tuple<>&&)):
Likewise.
(tuple<_T1, _T2>::tuple(const _T1&, const _T2&, tuple(_U1&&, _U2&&),
tuple(tuple&&), tuple(tuple<>&&), tuple(pair<>&&), operator=(tuple&&),
operator=(tuple<>&&), operator=(pair<>&&)): Likewise.
(tuple<>::tuple(typename __add_c_ref<_Elements>::type...),
tuple<_T1, _T2>::tuple(typename __add_c_ref<>::type,
typename __add_c_ref<>::type)): Remove.
* testsuite/tr1/6_containers/tuple/creation_functions/tie2.cc: New.
* testsuite/20_util/tuple/creation_functions/tie2.cc: Likewise.
* testsuite/20_util/tuple/moveable.cc: Likewise.
From-SVN: r131230
2007-12-30 23:44:42 +01:00
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
2016-11-14 16:30:37 +01:00
|
|
|
template<typename... _UElements>
|
PR libstdc++/86963 Implement LWG 2729 constraints on tuple assignment
PR libstdc++/86963
* include/std/tuple (__tuple_base): New class template with deleted
copy assignment operator.
(tuple, tuple<_T1, _T2>): Derive from __tuple_base<tuple> so that
implicit copy/move assignment operator will be deleted/suppressed.
(tuple::__assignable, tuple<_T1, _T2>::__assignable): New helper
functions for SFINAE constraints on assignment operators.
(tuple::__nothrow_assignable, tuple<_T1, _T2>::__nothrow_assignable):
New helper functions for exception specifications.
(tuple::operator=(const tuple&), tuple::operator=(tuple&&))
(tuple<_T1, _T2>::operator=(const tuple&))
(tuple<_T1, _T2>::operator=(tuple&&)): Change parameter types to
__nonesuch_no_braces when the operator should be defined implicitly.
Use __nothrow_assignable for exception specifications.
(tuple::operator=(const tuple<_UElements...>&))
(tuple::operator=(tuple<_UElements...>&&))
(tuple<_T1, _T2>::operator=(const tuple<_U1, _U2>&))
(tuple<_T1, _T2>::operator=(tuple<_U1, _U2>&&))
(tuple<_T1, _T2>::operator=(const pair<_U1, _U2>&))
(tuple<_T1, _T2>::operator=(pair<_U1, _U2>&&)): Constrain using
__assignable and use __nothrow_assignable for exception
specifications.
* python/libstdcxx/v6/printers.py (is_specialization_of): Accept
gdb.Type as first argument, instead of a string.
(StdTuplePrinter._iterator._is_nonempty_tuple): New method to check
tuple for expected structure.
(StdTuplePrinter._iterator.__init__): Use _is_nonempty_tuple.
* testsuite/20_util/tuple/dr2729.cc: New test.
* testsuite/20_util/tuple/element_access/get_neg.cc: Change dg-error
to dg-prune-output.
From-SVN: r263625
2018-08-17 19:52:49 +02:00
|
|
|
__enable_if_t<__assignable<_UElements...>(), tuple&>
|
|
|
|
operator=(tuple<_UElements...>&& __in)
|
|
|
|
noexcept(__nothrow_assignable<_UElements...>())
|
|
|
|
{
|
PR libstdc++/86963 Remove use of __tuple_base in std::tuple
The _Tuple_impl base class can be used to disable copy/move assignment,
without requiring an extra base class.
Exception specifications on std::tuple assignment and swap functions can
be defined directly using is_nothrow_swappable, instead of querying the
base classes.
PR libstdc++/86963
* include/std/tuple (_Tuple_impl::operator=): Define as deleted.
(_Tuple_impl::_M_assign): New functions to perform assignment instead
of assignment operators.
(_Tuple_impl::_M_swap): Remove exception specification.
(_Tuple_impl<_Idx, _Head>): Likewise.
(_TC::_NonNestedTuple, _TC::_NotSameTuple): Use __remove_cvref_t.
(__tuple_base): Remove.
(tuple, tuple<_T1, _T2>): Remove inheritance from __tuple_base.
(tuple::operator=, tuple<_T1, _T2>::operator=): Call _M_assign.
(tuple::swap, tuple<_T1, _T2>::swap): Define exception specification
using __is_nothrow_swappable.
(tuple<_T1, _T2>::tuple(_U1&&, _U2&&)): Use __remove_cvref_t.
From-SVN: r263661
2018-08-20 15:53:56 +02:00
|
|
|
this->_M_assign(std::move(__in));
|
tuple (_Tuple_impl<>::_Tuple_impl(typename std::remove_reference<>::type&&, typename std::remove_reference<>::type&&...), [...]): Add.
2007-12-30 Paolo Carlini <pcarlini@suse.de>
* include/std/tuple (_Tuple_impl<>::_Tuple_impl(typename
std::remove_reference<>::type&&, typename
std::remove_reference<>::type&&...),
_Tuple_impl(const _Tuple_impl<>&), _Tuple_impl(_Tuple_impl&&),
_Tuple_impl(_Tuple_impl<>&&), operator=(_Tuple_impl&&),
operator=(const _Tuple_impl<>&), operator=(_Tuple_impl<>&&)): Add.
(tuple<>::tuple(const _Elements&...), tuple(_UElements&&...),
tuple(tuple&&), tuple(const tuple<>&), tuple(tuple<>&&),
operator=(tuple&&), operator=(const tuple<>&), operator=(tuple<>&&)):
Likewise.
(tuple<_T1, _T2>::tuple(const _T1&, const _T2&, tuple(_U1&&, _U2&&),
tuple(tuple&&), tuple(tuple<>&&), tuple(pair<>&&), operator=(tuple&&),
operator=(tuple<>&&), operator=(pair<>&&)): Likewise.
(tuple<>::tuple(typename __add_c_ref<_Elements>::type...),
tuple<_T1, _T2>::tuple(typename __add_c_ref<>::type,
typename __add_c_ref<>::type)): Remove.
* testsuite/tr1/6_containers/tuple/creation_functions/tie2.cc: New.
* testsuite/20_util/tuple/creation_functions/tie2.cc: Likewise.
* testsuite/20_util/tuple/moveable.cc: Likewise.
From-SVN: r131230
2007-12-30 23:44:42 +01:00
|
|
|
return *this;
|
|
|
|
}
|
2008-10-02 00:04:02 +02:00
|
|
|
|
PR libstdc++/86963 Remove use of __tuple_base in std::tuple
The _Tuple_impl base class can be used to disable copy/move assignment,
without requiring an extra base class.
Exception specifications on std::tuple assignment and swap functions can
be defined directly using is_nothrow_swappable, instead of querying the
base classes.
PR libstdc++/86963
* include/std/tuple (_Tuple_impl::operator=): Define as deleted.
(_Tuple_impl::_M_assign): New functions to perform assignment instead
of assignment operators.
(_Tuple_impl::_M_swap): Remove exception specification.
(_Tuple_impl<_Idx, _Head>): Likewise.
(_TC::_NonNestedTuple, _TC::_NotSameTuple): Use __remove_cvref_t.
(__tuple_base): Remove.
(tuple, tuple<_T1, _T2>): Remove inheritance from __tuple_base.
(tuple::operator=, tuple<_T1, _T2>::operator=): Call _M_assign.
(tuple::swap, tuple<_T1, _T2>::swap): Define exception specification
using __is_nothrow_swappable.
(tuple<_T1, _T2>::tuple(_U1&&, _U2&&)): Use __remove_cvref_t.
From-SVN: r263661
2018-08-20 15:53:56 +02:00
|
|
|
// tuple swap
|
2008-10-02 00:04:02 +02:00
|
|
|
void
|
2009-05-19 00:15:56 +02:00
|
|
|
swap(tuple& __in)
|
PR libstdc++/86963 Remove use of __tuple_base in std::tuple
The _Tuple_impl base class can be used to disable copy/move assignment,
without requiring an extra base class.
Exception specifications on std::tuple assignment and swap functions can
be defined directly using is_nothrow_swappable, instead of querying the
base classes.
PR libstdc++/86963
* include/std/tuple (_Tuple_impl::operator=): Define as deleted.
(_Tuple_impl::_M_assign): New functions to perform assignment instead
of assignment operators.
(_Tuple_impl::_M_swap): Remove exception specification.
(_Tuple_impl<_Idx, _Head>): Likewise.
(_TC::_NonNestedTuple, _TC::_NotSameTuple): Use __remove_cvref_t.
(__tuple_base): Remove.
(tuple, tuple<_T1, _T2>): Remove inheritance from __tuple_base.
(tuple::operator=, tuple<_T1, _T2>::operator=): Call _M_assign.
(tuple::swap, tuple<_T1, _T2>::swap): Define exception specification
using __is_nothrow_swappable.
(tuple<_T1, _T2>::tuple(_U1&&, _U2&&)): Use __remove_cvref_t.
From-SVN: r263661
2018-08-20 15:53:56 +02:00
|
|
|
noexcept(__and_<__is_nothrow_swappable<_Elements>...>::value)
|
2011-05-18 02:12:58 +02:00
|
|
|
{ _Inherited::_M_swap(__in); }
|
2007-12-26 16:23:49 +01:00
|
|
|
};
|
|
|
|
|
2017-03-22 16:58:35 +01:00
|
|
|
#if __cpp_deduction_guides >= 201606
|
|
|
|
template<typename... _UTypes>
|
|
|
|
tuple(_UTypes...) -> tuple<_UTypes...>;
|
|
|
|
template<typename _T1, typename _T2>
|
|
|
|
tuple(pair<_T1, _T2>) -> tuple<_T1, _T2>;
|
|
|
|
template<typename _Alloc, typename... _UTypes>
|
|
|
|
tuple(allocator_arg_t, _Alloc, _UTypes...) -> tuple<_UTypes...>;
|
|
|
|
template<typename _Alloc, typename _T1, typename _T2>
|
|
|
|
tuple(allocator_arg_t, _Alloc, pair<_T1, _T2>) -> tuple<_T1, _T2>;
|
|
|
|
template<typename _Alloc, typename... _UTypes>
|
|
|
|
tuple(allocator_arg_t, _Alloc, tuple<_UTypes...>) -> tuple<_UTypes...>;
|
|
|
|
#endif
|
|
|
|
|
2011-08-03 23:05:14 +02:00
|
|
|
// Explicit specialization, zero-element tuple.
|
Implement N4387, "Improving pair and tuple", and LWG 2367.
2015-06-30 Ville Voutilainen <ville.voutilainen@gmail.com>
Implement N4387, "Improving pair and tuple", and LWG 2367.
* include/bits/stl_pair.h (_ConstructiblePair,
_ImplicitlyConvertiblePair, _MoveConstructiblePair,
_ImplicitlyMoveConvertiblePair): New.
(pair()): Constrain it.
(pair(const _T1&, const _T2&), pair(const pair<_U1, _U2>&),
pair(_U1&&, const _T2&), pair(const _T1&, _U2&&), pair(_U1&&, _U2&&),
pair(pair<_U1, _U2>&&)): Make conditionally explicit.
* include/std/tuple (_TC, tuple::_TC2, tuple::TCC, tuple::TMC): New.
(tuple()): Constrain it.
(tuple(const _UElements&...), tuple(_UElements&&...),
tuple(const tuple<_UElements...>&), tuple(tuple<_UElements...>&&),
tuple(allocator_arg_t, const _Alloc&, const _UElements&...),
tuple(allocator_arg_t, const _Alloc&, _UElements&&...),
tuple(allocator_arg_t, const _Alloc&, const tuple<_UElements...>&),
tuple(allocator_arg_t, const _Alloc&, tuple<_UElements...>&&),
tuple(const pair<_U1, _U2>&), tuple(pair<_U1, _U2>&&),
tuple(allocator_arg_t, const _Alloc&, const pair<_U1, _U2>&),
tuple(allocator_arg_t, const _Alloc&, pair<_U1, _U2>&&)): Make
conditionally explicit.
* include/experimental/functional (__boyer_moore_array_base): Name
array type explicitly instead of using an empty braced-init-list.
* testsuite/20_util/pair/cons/explicit_construct.cc: New.
* testsuite/20_util/pair/piecewise.cc: Use piecewise_construct.
* testsuite/20_util/pair/requirements/dr2367.cc: New.
* testsuite/20_util/tuple/cons/explicit_construct.cc: New.
* testsuite/20_util/tuple/requirements/dr2367.cc: New.
From-SVN: r225189
2015-06-30 15:26:49 +02:00
|
|
|
template<>
|
2008-10-02 00:04:02 +02:00
|
|
|
class tuple<>
|
|
|
|
{
|
|
|
|
public:
|
2011-05-18 02:12:58 +02:00
|
|
|
void swap(tuple&) noexcept { /* no-op */ }
|
2016-06-06 18:28:59 +02:00
|
|
|
// We need the default since we're going to define no-op
|
|
|
|
// allocator constructors.
|
|
|
|
tuple() = default;
|
|
|
|
// No-op allocator constructors.
|
|
|
|
template<typename _Alloc>
|
2019-05-31 16:58:05 +02:00
|
|
|
tuple(allocator_arg_t, const _Alloc&) noexcept { }
|
2016-06-06 18:28:59 +02:00
|
|
|
template<typename _Alloc>
|
2019-05-31 16:58:05 +02:00
|
|
|
tuple(allocator_arg_t, const _Alloc&, const tuple&) noexcept { }
|
2008-10-02 00:04:02 +02:00
|
|
|
};
|
2008-03-26 07:27:35 +01:00
|
|
|
|
2011-08-03 23:05:14 +02:00
|
|
|
/// Partial specialization, 2-element tuple.
|
|
|
|
/// Includes construction and assignment from a pair.
|
2007-12-26 16:23:49 +01:00
|
|
|
template<typename _T1, typename _T2>
|
PR libstdc++/86963 Remove use of __tuple_base in std::tuple
The _Tuple_impl base class can be used to disable copy/move assignment,
without requiring an extra base class.
Exception specifications on std::tuple assignment and swap functions can
be defined directly using is_nothrow_swappable, instead of querying the
base classes.
PR libstdc++/86963
* include/std/tuple (_Tuple_impl::operator=): Define as deleted.
(_Tuple_impl::_M_assign): New functions to perform assignment instead
of assignment operators.
(_Tuple_impl::_M_swap): Remove exception specification.
(_Tuple_impl<_Idx, _Head>): Likewise.
(_TC::_NonNestedTuple, _TC::_NotSameTuple): Use __remove_cvref_t.
(__tuple_base): Remove.
(tuple, tuple<_T1, _T2>): Remove inheritance from __tuple_base.
(tuple::operator=, tuple<_T1, _T2>::operator=): Call _M_assign.
(tuple::swap, tuple<_T1, _T2>::swap): Define exception specification
using __is_nothrow_swappable.
(tuple<_T1, _T2>::tuple(_U1&&, _U2&&)): Use __remove_cvref_t.
From-SVN: r263661
2018-08-20 15:53:56 +02:00
|
|
|
class tuple<_T1, _T2> : public _Tuple_impl<0, _T1, _T2>
|
2007-12-26 16:23:49 +01:00
|
|
|
{
|
|
|
|
typedef _Tuple_impl<0, _T1, _T2> _Inherited;
|
|
|
|
|
Refactor SFINAE constraints on std::tuple constructors
Replace the _TC class template with the better-named _TupleConstraints
one, which provides a different set of member functions. The new members
do not distinguish construction from lvalues and rvalues, but expects
the caller to do that by providing different template arguments. Within
the std::tuple primary template and std::tuple<T1, T2> partial
specialization the _TupleConstraints members are used via new alias
templates like _ImplicitCtor and _ExplicitCtor which makes the
constructor constraints less verbose and repetitive. For example, where
we previously had:
template<typename... _UElements, typename
enable_if<
_TMC<_UElements...>::template
_MoveConstructibleTuple<_UElements...>()
&& _TMC<_UElements...>::template
_ImplicitlyMoveConvertibleTuple<_UElements...>()
&& (sizeof...(_Elements) >= 1),
bool>::type=true>
constexpr tuple(_UElements&&... __elements)
We now have:
template<typename... _UElements,
bool _Valid = __valid_args<_UElements...>(),
_ImplicitCtor<_Valid, _UElements...> = true>
constexpr
tuple(_UElements&&... __elements)
There are two semantic changes as a result of the refactoring:
- The allocator-extended default constructor is now constrained.
- The rewritten constraints fix PR 90700.
* include/std/tuple (_TC): Replace with _TupleConstraints.
(_TupleConstraints): New helper for SFINAE constraints, with more
expressive member functions to reduce duplication when used.
(tuple::_TC2, tuple::_TMC, tuple::_TNTC): Remove.
(tuple::_TCC): Replace dummy type parameter with bool non-type
parameter that can be used to check the pack size.
(tuple::_ImplicitDefaultCtor, tuple::_ExplicitDefaultCtor)
(tuple::_ImplicitCtor, tuple::_ExplicitCtor): New alias templates for
checking constraints in constructors.
(tuple::__valid_args, tuple::_UseOtherCtor, tuple::__use_other_ctor):
New SFINAE helpers.
(tuple::tuple): Use new helpers to reduce repitition in constraints.
(tuple::tuple(allocator_arg_t, const Alloc&)): Constrain.
(tuple<T1, T2>::_TCC, tuple<T1, T2>::_ImplicitDefaultCtor)
(tuple<T1, T2>::_ExplicitDefaultCtor, tuple<T1, T2>::_ImplicitCtor)
(tuple<T1, T2>::_ExplicitCtor): New alias templates for checking
constraints in constructors.
(tuple::__is_alloc_arg()): New SFINAE helpers.
(tuple<T1, T2>::tuple): Use new helpers to reduce repitition in
constraints.
(tuple<T1, T2>::tuple(allocator_arg_t, const Alloc&)): Constrain.
* testsuite/20_util/tuple/cons/90700.cc: New test.
* testsuite/20_util/tuple/cons/allocators.cc: Add default constructor
to meet new constraint on allocator-extended default constructor.
From-SVN: r271998
2019-06-06 14:13:36 +02:00
|
|
|
// Constraint for non-explicit default constructor
|
|
|
|
template<bool _Dummy, typename _U1, typename _U2>
|
|
|
|
using _ImplicitDefaultCtor = __enable_if_t<
|
|
|
|
_TupleConstraints<_Dummy, _U1, _U2>::
|
|
|
|
__is_implicitly_default_constructible(),
|
|
|
|
bool>;
|
|
|
|
|
|
|
|
// Constraint for explicit default constructor
|
|
|
|
template<bool _Dummy, typename _U1, typename _U2>
|
|
|
|
using _ExplicitDefaultCtor = __enable_if_t<
|
|
|
|
_TupleConstraints<_Dummy, _U1, _U2>::
|
|
|
|
__is_explicitly_default_constructible(),
|
|
|
|
bool>;
|
|
|
|
|
|
|
|
template<bool _Dummy>
|
|
|
|
using _TCC = _TupleConstraints<_Dummy, _T1, _T2>;
|
|
|
|
|
|
|
|
// Constraint for non-explicit constructors
|
|
|
|
template<bool _Cond, typename _U1, typename _U2>
|
|
|
|
using _ImplicitCtor = __enable_if_t<
|
|
|
|
_TCC<_Cond>::template __is_implicitly_constructible<_U1, _U2>(),
|
|
|
|
bool>;
|
|
|
|
|
|
|
|
// Constraint for non-explicit constructors
|
|
|
|
template<bool _Cond, typename _U1, typename _U2>
|
|
|
|
using _ExplicitCtor = __enable_if_t<
|
|
|
|
_TCC<_Cond>::template __is_explicitly_constructible<_U1, _U2>(),
|
|
|
|
bool>;
|
|
|
|
|
PR libstdc++/86963 Implement LWG 2729 constraints on tuple assignment
PR libstdc++/86963
* include/std/tuple (__tuple_base): New class template with deleted
copy assignment operator.
(tuple, tuple<_T1, _T2>): Derive from __tuple_base<tuple> so that
implicit copy/move assignment operator will be deleted/suppressed.
(tuple::__assignable, tuple<_T1, _T2>::__assignable): New helper
functions for SFINAE constraints on assignment operators.
(tuple::__nothrow_assignable, tuple<_T1, _T2>::__nothrow_assignable):
New helper functions for exception specifications.
(tuple::operator=(const tuple&), tuple::operator=(tuple&&))
(tuple<_T1, _T2>::operator=(const tuple&))
(tuple<_T1, _T2>::operator=(tuple&&)): Change parameter types to
__nonesuch_no_braces when the operator should be defined implicitly.
Use __nothrow_assignable for exception specifications.
(tuple::operator=(const tuple<_UElements...>&))
(tuple::operator=(tuple<_UElements...>&&))
(tuple<_T1, _T2>::operator=(const tuple<_U1, _U2>&))
(tuple<_T1, _T2>::operator=(tuple<_U1, _U2>&&))
(tuple<_T1, _T2>::operator=(const pair<_U1, _U2>&))
(tuple<_T1, _T2>::operator=(pair<_U1, _U2>&&)): Constrain using
__assignable and use __nothrow_assignable for exception
specifications.
* python/libstdcxx/v6/printers.py (is_specialization_of): Accept
gdb.Type as first argument, instead of a string.
(StdTuplePrinter._iterator._is_nonempty_tuple): New method to check
tuple for expected structure.
(StdTuplePrinter._iterator.__init__): Use _is_nonempty_tuple.
* testsuite/20_util/tuple/dr2729.cc: New test.
* testsuite/20_util/tuple/element_access/get_neg.cc: Change dg-error
to dg-prune-output.
From-SVN: r263625
2018-08-17 19:52:49 +02:00
|
|
|
template<typename _U1, typename _U2>
|
|
|
|
static constexpr bool __assignable()
|
|
|
|
{
|
|
|
|
return __and_<is_assignable<_T1&, _U1>,
|
|
|
|
is_assignable<_T2&, _U2>>::value;
|
|
|
|
}
|
|
|
|
|
|
|
|
template<typename _U1, typename _U2>
|
|
|
|
static constexpr bool __nothrow_assignable()
|
|
|
|
{
|
|
|
|
return __and_<is_nothrow_assignable<_T1&, _U1>,
|
|
|
|
is_nothrow_assignable<_T2&, _U2>>::value;
|
|
|
|
}
|
|
|
|
|
2019-04-28 23:17:50 +02:00
|
|
|
template<typename _U1, typename _U2>
|
2019-05-31 16:58:05 +02:00
|
|
|
static constexpr bool __nothrow_constructible()
|
|
|
|
{
|
|
|
|
return __and_<is_nothrow_constructible<_T1, _U1>,
|
|
|
|
is_nothrow_constructible<_T2, _U2>>::value;
|
|
|
|
}
|
|
|
|
|
|
|
|
static constexpr bool __nothrow_default_constructible()
|
|
|
|
{
|
|
|
|
return __and_<is_nothrow_default_constructible<_T1>,
|
|
|
|
is_nothrow_default_constructible<_T2>>::value;
|
|
|
|
}
|
2019-04-28 23:17:50 +02:00
|
|
|
|
Refactor SFINAE constraints on std::tuple constructors
Replace the _TC class template with the better-named _TupleConstraints
one, which provides a different set of member functions. The new members
do not distinguish construction from lvalues and rvalues, but expects
the caller to do that by providing different template arguments. Within
the std::tuple primary template and std::tuple<T1, T2> partial
specialization the _TupleConstraints members are used via new alias
templates like _ImplicitCtor and _ExplicitCtor which makes the
constructor constraints less verbose and repetitive. For example, where
we previously had:
template<typename... _UElements, typename
enable_if<
_TMC<_UElements...>::template
_MoveConstructibleTuple<_UElements...>()
&& _TMC<_UElements...>::template
_ImplicitlyMoveConvertibleTuple<_UElements...>()
&& (sizeof...(_Elements) >= 1),
bool>::type=true>
constexpr tuple(_UElements&&... __elements)
We now have:
template<typename... _UElements,
bool _Valid = __valid_args<_UElements...>(),
_ImplicitCtor<_Valid, _UElements...> = true>
constexpr
tuple(_UElements&&... __elements)
There are two semantic changes as a result of the refactoring:
- The allocator-extended default constructor is now constrained.
- The rewritten constraints fix PR 90700.
* include/std/tuple (_TC): Replace with _TupleConstraints.
(_TupleConstraints): New helper for SFINAE constraints, with more
expressive member functions to reduce duplication when used.
(tuple::_TC2, tuple::_TMC, tuple::_TNTC): Remove.
(tuple::_TCC): Replace dummy type parameter with bool non-type
parameter that can be used to check the pack size.
(tuple::_ImplicitDefaultCtor, tuple::_ExplicitDefaultCtor)
(tuple::_ImplicitCtor, tuple::_ExplicitCtor): New alias templates for
checking constraints in constructors.
(tuple::__valid_args, tuple::_UseOtherCtor, tuple::__use_other_ctor):
New SFINAE helpers.
(tuple::tuple): Use new helpers to reduce repitition in constraints.
(tuple::tuple(allocator_arg_t, const Alloc&)): Constrain.
(tuple<T1, T2>::_TCC, tuple<T1, T2>::_ImplicitDefaultCtor)
(tuple<T1, T2>::_ExplicitDefaultCtor, tuple<T1, T2>::_ImplicitCtor)
(tuple<T1, T2>::_ExplicitCtor): New alias templates for checking
constraints in constructors.
(tuple::__is_alloc_arg()): New SFINAE helpers.
(tuple<T1, T2>::tuple): Use new helpers to reduce repitition in
constraints.
(tuple<T1, T2>::tuple(allocator_arg_t, const Alloc&)): Constrain.
* testsuite/20_util/tuple/cons/90700.cc: New test.
* testsuite/20_util/tuple/cons/allocators.cc: Add default constructor
to meet new constraint on allocator-extended default constructor.
From-SVN: r271998
2019-06-06 14:13:36 +02:00
|
|
|
template<typename _U1>
|
|
|
|
static constexpr bool __is_alloc_arg()
|
|
|
|
{ return is_same<__remove_cvref_t<_U1>, allocator_arg_t>::value; }
|
|
|
|
|
2007-12-26 16:23:49 +01:00
|
|
|
public:
|
Refactor SFINAE constraints on std::tuple constructors
Replace the _TC class template with the better-named _TupleConstraints
one, which provides a different set of member functions. The new members
do not distinguish construction from lvalues and rvalues, but expects
the caller to do that by providing different template arguments. Within
the std::tuple primary template and std::tuple<T1, T2> partial
specialization the _TupleConstraints members are used via new alias
templates like _ImplicitCtor and _ExplicitCtor which makes the
constructor constraints less verbose and repetitive. For example, where
we previously had:
template<typename... _UElements, typename
enable_if<
_TMC<_UElements...>::template
_MoveConstructibleTuple<_UElements...>()
&& _TMC<_UElements...>::template
_ImplicitlyMoveConvertibleTuple<_UElements...>()
&& (sizeof...(_Elements) >= 1),
bool>::type=true>
constexpr tuple(_UElements&&... __elements)
We now have:
template<typename... _UElements,
bool _Valid = __valid_args<_UElements...>(),
_ImplicitCtor<_Valid, _UElements...> = true>
constexpr
tuple(_UElements&&... __elements)
There are two semantic changes as a result of the refactoring:
- The allocator-extended default constructor is now constrained.
- The rewritten constraints fix PR 90700.
* include/std/tuple (_TC): Replace with _TupleConstraints.
(_TupleConstraints): New helper for SFINAE constraints, with more
expressive member functions to reduce duplication when used.
(tuple::_TC2, tuple::_TMC, tuple::_TNTC): Remove.
(tuple::_TCC): Replace dummy type parameter with bool non-type
parameter that can be used to check the pack size.
(tuple::_ImplicitDefaultCtor, tuple::_ExplicitDefaultCtor)
(tuple::_ImplicitCtor, tuple::_ExplicitCtor): New alias templates for
checking constraints in constructors.
(tuple::__valid_args, tuple::_UseOtherCtor, tuple::__use_other_ctor):
New SFINAE helpers.
(tuple::tuple): Use new helpers to reduce repitition in constraints.
(tuple::tuple(allocator_arg_t, const Alloc&)): Constrain.
(tuple<T1, T2>::_TCC, tuple<T1, T2>::_ImplicitDefaultCtor)
(tuple<T1, T2>::_ExplicitDefaultCtor, tuple<T1, T2>::_ImplicitCtor)
(tuple<T1, T2>::_ExplicitCtor): New alias templates for checking
constraints in constructors.
(tuple::__is_alloc_arg()): New SFINAE helpers.
(tuple<T1, T2>::tuple): Use new helpers to reduce repitition in
constraints.
(tuple<T1, T2>::tuple(allocator_arg_t, const Alloc&)): Constrain.
* testsuite/20_util/tuple/cons/90700.cc: New test.
* testsuite/20_util/tuple/cons/allocators.cc: Add default constructor
to meet new constraint on allocator-extended default constructor.
From-SVN: r271998
2019-06-06 14:13:36 +02:00
|
|
|
template<bool _Dummy = true,
|
|
|
|
_ImplicitDefaultCtor<_Dummy, _T1, _T2> = true>
|
|
|
|
constexpr
|
|
|
|
tuple()
|
2019-05-31 16:58:05 +02:00
|
|
|
noexcept(__nothrow_default_constructible())
|
PR libstdc++/86963 Implement LWG 2729 constraints on tuple assignment
PR libstdc++/86963
* include/std/tuple (__tuple_base): New class template with deleted
copy assignment operator.
(tuple, tuple<_T1, _T2>): Derive from __tuple_base<tuple> so that
implicit copy/move assignment operator will be deleted/suppressed.
(tuple::__assignable, tuple<_T1, _T2>::__assignable): New helper
functions for SFINAE constraints on assignment operators.
(tuple::__nothrow_assignable, tuple<_T1, _T2>::__nothrow_assignable):
New helper functions for exception specifications.
(tuple::operator=(const tuple&), tuple::operator=(tuple&&))
(tuple<_T1, _T2>::operator=(const tuple&))
(tuple<_T1, _T2>::operator=(tuple&&)): Change parameter types to
__nonesuch_no_braces when the operator should be defined implicitly.
Use __nothrow_assignable for exception specifications.
(tuple::operator=(const tuple<_UElements...>&))
(tuple::operator=(tuple<_UElements...>&&))
(tuple<_T1, _T2>::operator=(const tuple<_U1, _U2>&))
(tuple<_T1, _T2>::operator=(tuple<_U1, _U2>&&))
(tuple<_T1, _T2>::operator=(const pair<_U1, _U2>&))
(tuple<_T1, _T2>::operator=(pair<_U1, _U2>&&)): Constrain using
__assignable and use __nothrow_assignable for exception
specifications.
* python/libstdcxx/v6/printers.py (is_specialization_of): Accept
gdb.Type as first argument, instead of a string.
(StdTuplePrinter._iterator._is_nonempty_tuple): New method to check
tuple for expected structure.
(StdTuplePrinter._iterator.__init__): Use _is_nonempty_tuple.
* testsuite/20_util/tuple/dr2729.cc: New test.
* testsuite/20_util/tuple/element_access/get_neg.cc: Change dg-error
to dg-prune-output.
From-SVN: r263625
2018-08-17 19:52:49 +02:00
|
|
|
: _Inherited() { }
|
2007-12-26 16:23:49 +01:00
|
|
|
|
Refactor SFINAE constraints on std::tuple constructors
Replace the _TC class template with the better-named _TupleConstraints
one, which provides a different set of member functions. The new members
do not distinguish construction from lvalues and rvalues, but expects
the caller to do that by providing different template arguments. Within
the std::tuple primary template and std::tuple<T1, T2> partial
specialization the _TupleConstraints members are used via new alias
templates like _ImplicitCtor and _ExplicitCtor which makes the
constructor constraints less verbose and repetitive. For example, where
we previously had:
template<typename... _UElements, typename
enable_if<
_TMC<_UElements...>::template
_MoveConstructibleTuple<_UElements...>()
&& _TMC<_UElements...>::template
_ImplicitlyMoveConvertibleTuple<_UElements...>()
&& (sizeof...(_Elements) >= 1),
bool>::type=true>
constexpr tuple(_UElements&&... __elements)
We now have:
template<typename... _UElements,
bool _Valid = __valid_args<_UElements...>(),
_ImplicitCtor<_Valid, _UElements...> = true>
constexpr
tuple(_UElements&&... __elements)
There are two semantic changes as a result of the refactoring:
- The allocator-extended default constructor is now constrained.
- The rewritten constraints fix PR 90700.
* include/std/tuple (_TC): Replace with _TupleConstraints.
(_TupleConstraints): New helper for SFINAE constraints, with more
expressive member functions to reduce duplication when used.
(tuple::_TC2, tuple::_TMC, tuple::_TNTC): Remove.
(tuple::_TCC): Replace dummy type parameter with bool non-type
parameter that can be used to check the pack size.
(tuple::_ImplicitDefaultCtor, tuple::_ExplicitDefaultCtor)
(tuple::_ImplicitCtor, tuple::_ExplicitCtor): New alias templates for
checking constraints in constructors.
(tuple::__valid_args, tuple::_UseOtherCtor, tuple::__use_other_ctor):
New SFINAE helpers.
(tuple::tuple): Use new helpers to reduce repitition in constraints.
(tuple::tuple(allocator_arg_t, const Alloc&)): Constrain.
(tuple<T1, T2>::_TCC, tuple<T1, T2>::_ImplicitDefaultCtor)
(tuple<T1, T2>::_ExplicitDefaultCtor, tuple<T1, T2>::_ImplicitCtor)
(tuple<T1, T2>::_ExplicitCtor): New alias templates for checking
constraints in constructors.
(tuple::__is_alloc_arg()): New SFINAE helpers.
(tuple<T1, T2>::tuple): Use new helpers to reduce repitition in
constraints.
(tuple<T1, T2>::tuple(allocator_arg_t, const Alloc&)): Constrain.
* testsuite/20_util/tuple/cons/90700.cc: New test.
* testsuite/20_util/tuple/cons/allocators.cc: Add default constructor
to meet new constraint on allocator-extended default constructor.
From-SVN: r271998
2019-06-06 14:13:36 +02:00
|
|
|
template<bool _Dummy = true,
|
|
|
|
_ExplicitDefaultCtor<_Dummy, _T1, _T2> = false>
|
|
|
|
explicit constexpr
|
|
|
|
tuple()
|
2019-05-31 16:58:05 +02:00
|
|
|
noexcept(__nothrow_default_constructible())
|
PR libstdc++/86963 Implement LWG 2729 constraints on tuple assignment
PR libstdc++/86963
* include/std/tuple (__tuple_base): New class template with deleted
copy assignment operator.
(tuple, tuple<_T1, _T2>): Derive from __tuple_base<tuple> so that
implicit copy/move assignment operator will be deleted/suppressed.
(tuple::__assignable, tuple<_T1, _T2>::__assignable): New helper
functions for SFINAE constraints on assignment operators.
(tuple::__nothrow_assignable, tuple<_T1, _T2>::__nothrow_assignable):
New helper functions for exception specifications.
(tuple::operator=(const tuple&), tuple::operator=(tuple&&))
(tuple<_T1, _T2>::operator=(const tuple&))
(tuple<_T1, _T2>::operator=(tuple&&)): Change parameter types to
__nonesuch_no_braces when the operator should be defined implicitly.
Use __nothrow_assignable for exception specifications.
(tuple::operator=(const tuple<_UElements...>&))
(tuple::operator=(tuple<_UElements...>&&))
(tuple<_T1, _T2>::operator=(const tuple<_U1, _U2>&))
(tuple<_T1, _T2>::operator=(tuple<_U1, _U2>&&))
(tuple<_T1, _T2>::operator=(const pair<_U1, _U2>&))
(tuple<_T1, _T2>::operator=(pair<_U1, _U2>&&)): Constrain using
__assignable and use __nothrow_assignable for exception
specifications.
* python/libstdcxx/v6/printers.py (is_specialization_of): Accept
gdb.Type as first argument, instead of a string.
(StdTuplePrinter._iterator._is_nonempty_tuple): New method to check
tuple for expected structure.
(StdTuplePrinter._iterator.__init__): Use _is_nonempty_tuple.
* testsuite/20_util/tuple/dr2729.cc: New test.
* testsuite/20_util/tuple/element_access/get_neg.cc: Change dg-error
to dg-prune-output.
From-SVN: r263625
2018-08-17 19:52:49 +02:00
|
|
|
: _Inherited() { }
|
Make the default constructors of tuple and pair conditionally explicit.
2015-11-03 Ville Voutilainen <ville.voutilainen@gmail.com>
Make the default constructors of tuple and pair conditionally explicit.
* include/std/type_traits (is_unsigned, __is_array_unknown_bounds,
__is_default_constructible_atom, __is_default_constructible_safe,
__is_direct_constructible_new_safe, __is_direct_constructible_ref_cast,
__is_nt_default_constructible_impl, is_nothrow_default_constructible,
is_nothrow_constructible, is_nothrow_assignable,
is_trivially_constructible, is_trivially_copy_constructible,
is_trivially_move_constructible, is_trivially_assignable,
is_trivially_copy_assignable, is_trivially_move_assignable,
is_trivially_destructible): Simplify.
* include/std/type_traits (
__do_is_implicitly_default_constructible_impl,
__is_implicitly_default_constructible_impl,
__is_implicitly_default_constructible_safe,
__is_implicitly_default_constructible): New.
* include/bits/stl_pair.h (pair::pair()): Use it.
* include/std/tuple (tuple<_T1, _T2>::tuple): Use it.
* include/std/tuple (_ImplicitlyDefaultConstructibleTuple): New.
* include/std/tuple (tuple<_Types...>::tuple()): Use it.
* testsuite/20_util/declval/requirements/1_neg.cc: Adjust.
* testsuite/20_util/is_implicitly_default_constructible/requirements/explicit_instantiation.cc: New.
* testsuite/20_util/is_implicitly_default_constructible/requirements/typedefs.cc: Likewise.
* testsuite/20_util/is_implicitly_default_constructible/value.cc: Likewise.
* testsuite/20_util/make_signed/requirements/typedefs_neg.cc: Adjust.
* testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc: Likewise.
* testsuite/20_util/pair/cons/explicit_construct.cc: Likewise.
* testsuite/20_util/tuple/cons/explicit_construct.cc: Likewise.
From-SVN: r229699
2015-11-03 09:41:40 +01:00
|
|
|
|
Refactor SFINAE constraints on std::tuple constructors
Replace the _TC class template with the better-named _TupleConstraints
one, which provides a different set of member functions. The new members
do not distinguish construction from lvalues and rvalues, but expects
the caller to do that by providing different template arguments. Within
the std::tuple primary template and std::tuple<T1, T2> partial
specialization the _TupleConstraints members are used via new alias
templates like _ImplicitCtor and _ExplicitCtor which makes the
constructor constraints less verbose and repetitive. For example, where
we previously had:
template<typename... _UElements, typename
enable_if<
_TMC<_UElements...>::template
_MoveConstructibleTuple<_UElements...>()
&& _TMC<_UElements...>::template
_ImplicitlyMoveConvertibleTuple<_UElements...>()
&& (sizeof...(_Elements) >= 1),
bool>::type=true>
constexpr tuple(_UElements&&... __elements)
We now have:
template<typename... _UElements,
bool _Valid = __valid_args<_UElements...>(),
_ImplicitCtor<_Valid, _UElements...> = true>
constexpr
tuple(_UElements&&... __elements)
There are two semantic changes as a result of the refactoring:
- The allocator-extended default constructor is now constrained.
- The rewritten constraints fix PR 90700.
* include/std/tuple (_TC): Replace with _TupleConstraints.
(_TupleConstraints): New helper for SFINAE constraints, with more
expressive member functions to reduce duplication when used.
(tuple::_TC2, tuple::_TMC, tuple::_TNTC): Remove.
(tuple::_TCC): Replace dummy type parameter with bool non-type
parameter that can be used to check the pack size.
(tuple::_ImplicitDefaultCtor, tuple::_ExplicitDefaultCtor)
(tuple::_ImplicitCtor, tuple::_ExplicitCtor): New alias templates for
checking constraints in constructors.
(tuple::__valid_args, tuple::_UseOtherCtor, tuple::__use_other_ctor):
New SFINAE helpers.
(tuple::tuple): Use new helpers to reduce repitition in constraints.
(tuple::tuple(allocator_arg_t, const Alloc&)): Constrain.
(tuple<T1, T2>::_TCC, tuple<T1, T2>::_ImplicitDefaultCtor)
(tuple<T1, T2>::_ExplicitDefaultCtor, tuple<T1, T2>::_ImplicitCtor)
(tuple<T1, T2>::_ExplicitCtor): New alias templates for checking
constraints in constructors.
(tuple::__is_alloc_arg()): New SFINAE helpers.
(tuple<T1, T2>::tuple): Use new helpers to reduce repitition in
constraints.
(tuple<T1, T2>::tuple(allocator_arg_t, const Alloc&)): Constrain.
* testsuite/20_util/tuple/cons/90700.cc: New test.
* testsuite/20_util/tuple/cons/allocators.cc: Add default constructor
to meet new constraint on allocator-extended default constructor.
From-SVN: r271998
2019-06-06 14:13:36 +02:00
|
|
|
template<bool _Dummy = true,
|
|
|
|
_ImplicitCtor<_Dummy, const _T1&, const _T2&> = true>
|
|
|
|
constexpr
|
|
|
|
tuple(const _T1& __a1, const _T2& __a2)
|
|
|
|
noexcept(__nothrow_constructible<const _T1&, const _T2&>())
|
|
|
|
: _Inherited(__a1, __a2) { }
|
|
|
|
|
|
|
|
template<bool _Dummy = true,
|
|
|
|
_ExplicitCtor<_Dummy, const _T1&, const _T2&> = false>
|
|
|
|
explicit constexpr
|
|
|
|
tuple(const _T1& __a1, const _T2& __a2)
|
|
|
|
noexcept(__nothrow_constructible<const _T1&, const _T2&>())
|
|
|
|
: _Inherited(__a1, __a2) { }
|
|
|
|
|
|
|
|
template<typename _U1, typename _U2,
|
|
|
|
_ImplicitCtor<!__is_alloc_arg<_U1>(), _U1, _U2> = true>
|
|
|
|
constexpr
|
|
|
|
tuple(_U1&& __a1, _U2&& __a2)
|
|
|
|
noexcept(__nothrow_constructible<_U1, _U2>())
|
tuple (_Tuple_impl<>::_Tuple_impl(typename std::remove_reference<>::type&&, typename std::remove_reference<>::type&&...), [...]): Add.
2007-12-30 Paolo Carlini <pcarlini@suse.de>
* include/std/tuple (_Tuple_impl<>::_Tuple_impl(typename
std::remove_reference<>::type&&, typename
std::remove_reference<>::type&&...),
_Tuple_impl(const _Tuple_impl<>&), _Tuple_impl(_Tuple_impl&&),
_Tuple_impl(_Tuple_impl<>&&), operator=(_Tuple_impl&&),
operator=(const _Tuple_impl<>&), operator=(_Tuple_impl<>&&)): Add.
(tuple<>::tuple(const _Elements&...), tuple(_UElements&&...),
tuple(tuple&&), tuple(const tuple<>&), tuple(tuple<>&&),
operator=(tuple&&), operator=(const tuple<>&), operator=(tuple<>&&)):
Likewise.
(tuple<_T1, _T2>::tuple(const _T1&, const _T2&, tuple(_U1&&, _U2&&),
tuple(tuple&&), tuple(tuple<>&&), tuple(pair<>&&), operator=(tuple&&),
operator=(tuple<>&&), operator=(pair<>&&)): Likewise.
(tuple<>::tuple(typename __add_c_ref<_Elements>::type...),
tuple<_T1, _T2>::tuple(typename __add_c_ref<>::type,
typename __add_c_ref<>::type)): Remove.
* testsuite/tr1/6_containers/tuple/creation_functions/tie2.cc: New.
* testsuite/20_util/tuple/creation_functions/tie2.cc: Likewise.
* testsuite/20_util/tuple/moveable.cc: Likewise.
From-SVN: r131230
2007-12-30 23:44:42 +01:00
|
|
|
: _Inherited(std::forward<_U1>(__a1), std::forward<_U2>(__a2)) { }
|
2007-12-26 16:23:49 +01:00
|
|
|
|
Refactor SFINAE constraints on std::tuple constructors
Replace the _TC class template with the better-named _TupleConstraints
one, which provides a different set of member functions. The new members
do not distinguish construction from lvalues and rvalues, but expects
the caller to do that by providing different template arguments. Within
the std::tuple primary template and std::tuple<T1, T2> partial
specialization the _TupleConstraints members are used via new alias
templates like _ImplicitCtor and _ExplicitCtor which makes the
constructor constraints less verbose and repetitive. For example, where
we previously had:
template<typename... _UElements, typename
enable_if<
_TMC<_UElements...>::template
_MoveConstructibleTuple<_UElements...>()
&& _TMC<_UElements...>::template
_ImplicitlyMoveConvertibleTuple<_UElements...>()
&& (sizeof...(_Elements) >= 1),
bool>::type=true>
constexpr tuple(_UElements&&... __elements)
We now have:
template<typename... _UElements,
bool _Valid = __valid_args<_UElements...>(),
_ImplicitCtor<_Valid, _UElements...> = true>
constexpr
tuple(_UElements&&... __elements)
There are two semantic changes as a result of the refactoring:
- The allocator-extended default constructor is now constrained.
- The rewritten constraints fix PR 90700.
* include/std/tuple (_TC): Replace with _TupleConstraints.
(_TupleConstraints): New helper for SFINAE constraints, with more
expressive member functions to reduce duplication when used.
(tuple::_TC2, tuple::_TMC, tuple::_TNTC): Remove.
(tuple::_TCC): Replace dummy type parameter with bool non-type
parameter that can be used to check the pack size.
(tuple::_ImplicitDefaultCtor, tuple::_ExplicitDefaultCtor)
(tuple::_ImplicitCtor, tuple::_ExplicitCtor): New alias templates for
checking constraints in constructors.
(tuple::__valid_args, tuple::_UseOtherCtor, tuple::__use_other_ctor):
New SFINAE helpers.
(tuple::tuple): Use new helpers to reduce repitition in constraints.
(tuple::tuple(allocator_arg_t, const Alloc&)): Constrain.
(tuple<T1, T2>::_TCC, tuple<T1, T2>::_ImplicitDefaultCtor)
(tuple<T1, T2>::_ExplicitDefaultCtor, tuple<T1, T2>::_ImplicitCtor)
(tuple<T1, T2>::_ExplicitCtor): New alias templates for checking
constraints in constructors.
(tuple::__is_alloc_arg()): New SFINAE helpers.
(tuple<T1, T2>::tuple): Use new helpers to reduce repitition in
constraints.
(tuple<T1, T2>::tuple(allocator_arg_t, const Alloc&)): Constrain.
* testsuite/20_util/tuple/cons/90700.cc: New test.
* testsuite/20_util/tuple/cons/allocators.cc: Add default constructor
to meet new constraint on allocator-extended default constructor.
From-SVN: r271998
2019-06-06 14:13:36 +02:00
|
|
|
template<typename _U1, typename _U2,
|
|
|
|
_ExplicitCtor<!__is_alloc_arg<_U1>(), _U1, _U2> = false>
|
|
|
|
explicit constexpr
|
|
|
|
tuple(_U1&& __a1, _U2&& __a2)
|
|
|
|
noexcept(__nothrow_constructible<_U1, _U2>())
|
Implement N4387, "Improving pair and tuple", and LWG 2367.
2015-06-30 Ville Voutilainen <ville.voutilainen@gmail.com>
Implement N4387, "Improving pair and tuple", and LWG 2367.
* include/bits/stl_pair.h (_ConstructiblePair,
_ImplicitlyConvertiblePair, _MoveConstructiblePair,
_ImplicitlyMoveConvertiblePair): New.
(pair()): Constrain it.
(pair(const _T1&, const _T2&), pair(const pair<_U1, _U2>&),
pair(_U1&&, const _T2&), pair(const _T1&, _U2&&), pair(_U1&&, _U2&&),
pair(pair<_U1, _U2>&&)): Make conditionally explicit.
* include/std/tuple (_TC, tuple::_TC2, tuple::TCC, tuple::TMC): New.
(tuple()): Constrain it.
(tuple(const _UElements&...), tuple(_UElements&&...),
tuple(const tuple<_UElements...>&), tuple(tuple<_UElements...>&&),
tuple(allocator_arg_t, const _Alloc&, const _UElements&...),
tuple(allocator_arg_t, const _Alloc&, _UElements&&...),
tuple(allocator_arg_t, const _Alloc&, const tuple<_UElements...>&),
tuple(allocator_arg_t, const _Alloc&, tuple<_UElements...>&&),
tuple(const pair<_U1, _U2>&), tuple(pair<_U1, _U2>&&),
tuple(allocator_arg_t, const _Alloc&, const pair<_U1, _U2>&),
tuple(allocator_arg_t, const _Alloc&, pair<_U1, _U2>&&)): Make
conditionally explicit.
* include/experimental/functional (__boyer_moore_array_base): Name
array type explicitly instead of using an empty braced-init-list.
* testsuite/20_util/pair/cons/explicit_construct.cc: New.
* testsuite/20_util/pair/piecewise.cc: Use piecewise_construct.
* testsuite/20_util/pair/requirements/dr2367.cc: New.
* testsuite/20_util/tuple/cons/explicit_construct.cc: New.
* testsuite/20_util/tuple/requirements/dr2367.cc: New.
From-SVN: r225189
2015-06-30 15:26:49 +02:00
|
|
|
: _Inherited(std::forward<_U1>(__a1), std::forward<_U2>(__a2)) { }
|
|
|
|
|
2010-11-24 17:33:14 +01:00
|
|
|
constexpr tuple(const tuple&) = default;
|
2011-08-03 23:05:14 +02:00
|
|
|
|
2011-09-07 02:17:09 +02:00
|
|
|
constexpr tuple(tuple&&) = default;
|
tuple (_Tuple_impl<>::_Tuple_impl(typename std::remove_reference<>::type&&, typename std::remove_reference<>::type&&...), [...]): Add.
2007-12-30 Paolo Carlini <pcarlini@suse.de>
* include/std/tuple (_Tuple_impl<>::_Tuple_impl(typename
std::remove_reference<>::type&&, typename
std::remove_reference<>::type&&...),
_Tuple_impl(const _Tuple_impl<>&), _Tuple_impl(_Tuple_impl&&),
_Tuple_impl(_Tuple_impl<>&&), operator=(_Tuple_impl&&),
operator=(const _Tuple_impl<>&), operator=(_Tuple_impl<>&&)): Add.
(tuple<>::tuple(const _Elements&...), tuple(_UElements&&...),
tuple(tuple&&), tuple(const tuple<>&), tuple(tuple<>&&),
operator=(tuple&&), operator=(const tuple<>&), operator=(tuple<>&&)):
Likewise.
(tuple<_T1, _T2>::tuple(const _T1&, const _T2&, tuple(_U1&&, _U2&&),
tuple(tuple&&), tuple(tuple<>&&), tuple(pair<>&&), operator=(tuple&&),
operator=(tuple<>&&), operator=(pair<>&&)): Likewise.
(tuple<>::tuple(typename __add_c_ref<_Elements>::type...),
tuple<_T1, _T2>::tuple(typename __add_c_ref<>::type,
typename __add_c_ref<>::type)): Remove.
* testsuite/tr1/6_containers/tuple/creation_functions/tie2.cc: New.
* testsuite/20_util/tuple/creation_functions/tie2.cc: Likewise.
* testsuite/20_util/tuple/moveable.cc: Likewise.
From-SVN: r131230
2007-12-30 23:44:42 +01:00
|
|
|
|
Refactor SFINAE constraints on std::tuple constructors
Replace the _TC class template with the better-named _TupleConstraints
one, which provides a different set of member functions. The new members
do not distinguish construction from lvalues and rvalues, but expects
the caller to do that by providing different template arguments. Within
the std::tuple primary template and std::tuple<T1, T2> partial
specialization the _TupleConstraints members are used via new alias
templates like _ImplicitCtor and _ExplicitCtor which makes the
constructor constraints less verbose and repetitive. For example, where
we previously had:
template<typename... _UElements, typename
enable_if<
_TMC<_UElements...>::template
_MoveConstructibleTuple<_UElements...>()
&& _TMC<_UElements...>::template
_ImplicitlyMoveConvertibleTuple<_UElements...>()
&& (sizeof...(_Elements) >= 1),
bool>::type=true>
constexpr tuple(_UElements&&... __elements)
We now have:
template<typename... _UElements,
bool _Valid = __valid_args<_UElements...>(),
_ImplicitCtor<_Valid, _UElements...> = true>
constexpr
tuple(_UElements&&... __elements)
There are two semantic changes as a result of the refactoring:
- The allocator-extended default constructor is now constrained.
- The rewritten constraints fix PR 90700.
* include/std/tuple (_TC): Replace with _TupleConstraints.
(_TupleConstraints): New helper for SFINAE constraints, with more
expressive member functions to reduce duplication when used.
(tuple::_TC2, tuple::_TMC, tuple::_TNTC): Remove.
(tuple::_TCC): Replace dummy type parameter with bool non-type
parameter that can be used to check the pack size.
(tuple::_ImplicitDefaultCtor, tuple::_ExplicitDefaultCtor)
(tuple::_ImplicitCtor, tuple::_ExplicitCtor): New alias templates for
checking constraints in constructors.
(tuple::__valid_args, tuple::_UseOtherCtor, tuple::__use_other_ctor):
New SFINAE helpers.
(tuple::tuple): Use new helpers to reduce repitition in constraints.
(tuple::tuple(allocator_arg_t, const Alloc&)): Constrain.
(tuple<T1, T2>::_TCC, tuple<T1, T2>::_ImplicitDefaultCtor)
(tuple<T1, T2>::_ExplicitDefaultCtor, tuple<T1, T2>::_ImplicitCtor)
(tuple<T1, T2>::_ExplicitCtor): New alias templates for checking
constraints in constructors.
(tuple::__is_alloc_arg()): New SFINAE helpers.
(tuple<T1, T2>::tuple): Use new helpers to reduce repitition in
constraints.
(tuple<T1, T2>::tuple(allocator_arg_t, const Alloc&)): Constrain.
* testsuite/20_util/tuple/cons/90700.cc: New test.
* testsuite/20_util/tuple/cons/allocators.cc: Add default constructor
to meet new constraint on allocator-extended default constructor.
From-SVN: r271998
2019-06-06 14:13:36 +02:00
|
|
|
template<typename _U1, typename _U2,
|
|
|
|
_ImplicitCtor<true, const _U1&, const _U2&> = true>
|
|
|
|
constexpr
|
|
|
|
tuple(const tuple<_U1, _U2>& __in)
|
|
|
|
noexcept(__nothrow_constructible<const _U1&, const _U2&>())
|
2008-02-18 14:32:01 +01:00
|
|
|
: _Inherited(static_cast<const _Tuple_impl<0, _U1, _U2>&>(__in)) { }
|
tuple (_Tuple_impl<>::_Tuple_impl(typename std::remove_reference<>::type&&, typename std::remove_reference<>::type&&...), [...]): Add.
2007-12-30 Paolo Carlini <pcarlini@suse.de>
* include/std/tuple (_Tuple_impl<>::_Tuple_impl(typename
std::remove_reference<>::type&&, typename
std::remove_reference<>::type&&...),
_Tuple_impl(const _Tuple_impl<>&), _Tuple_impl(_Tuple_impl&&),
_Tuple_impl(_Tuple_impl<>&&), operator=(_Tuple_impl&&),
operator=(const _Tuple_impl<>&), operator=(_Tuple_impl<>&&)): Add.
(tuple<>::tuple(const _Elements&...), tuple(_UElements&&...),
tuple(tuple&&), tuple(const tuple<>&), tuple(tuple<>&&),
operator=(tuple&&), operator=(const tuple<>&), operator=(tuple<>&&)):
Likewise.
(tuple<_T1, _T2>::tuple(const _T1&, const _T2&, tuple(_U1&&, _U2&&),
tuple(tuple&&), tuple(tuple<>&&), tuple(pair<>&&), operator=(tuple&&),
operator=(tuple<>&&), operator=(pair<>&&)): Likewise.
(tuple<>::tuple(typename __add_c_ref<_Elements>::type...),
tuple<_T1, _T2>::tuple(typename __add_c_ref<>::type,
typename __add_c_ref<>::type)): Remove.
* testsuite/tr1/6_containers/tuple/creation_functions/tie2.cc: New.
* testsuite/20_util/tuple/creation_functions/tie2.cc: Likewise.
* testsuite/20_util/tuple/moveable.cc: Likewise.
From-SVN: r131230
2007-12-30 23:44:42 +01:00
|
|
|
|
Refactor SFINAE constraints on std::tuple constructors
Replace the _TC class template with the better-named _TupleConstraints
one, which provides a different set of member functions. The new members
do not distinguish construction from lvalues and rvalues, but expects
the caller to do that by providing different template arguments. Within
the std::tuple primary template and std::tuple<T1, T2> partial
specialization the _TupleConstraints members are used via new alias
templates like _ImplicitCtor and _ExplicitCtor which makes the
constructor constraints less verbose and repetitive. For example, where
we previously had:
template<typename... _UElements, typename
enable_if<
_TMC<_UElements...>::template
_MoveConstructibleTuple<_UElements...>()
&& _TMC<_UElements...>::template
_ImplicitlyMoveConvertibleTuple<_UElements...>()
&& (sizeof...(_Elements) >= 1),
bool>::type=true>
constexpr tuple(_UElements&&... __elements)
We now have:
template<typename... _UElements,
bool _Valid = __valid_args<_UElements...>(),
_ImplicitCtor<_Valid, _UElements...> = true>
constexpr
tuple(_UElements&&... __elements)
There are two semantic changes as a result of the refactoring:
- The allocator-extended default constructor is now constrained.
- The rewritten constraints fix PR 90700.
* include/std/tuple (_TC): Replace with _TupleConstraints.
(_TupleConstraints): New helper for SFINAE constraints, with more
expressive member functions to reduce duplication when used.
(tuple::_TC2, tuple::_TMC, tuple::_TNTC): Remove.
(tuple::_TCC): Replace dummy type parameter with bool non-type
parameter that can be used to check the pack size.
(tuple::_ImplicitDefaultCtor, tuple::_ExplicitDefaultCtor)
(tuple::_ImplicitCtor, tuple::_ExplicitCtor): New alias templates for
checking constraints in constructors.
(tuple::__valid_args, tuple::_UseOtherCtor, tuple::__use_other_ctor):
New SFINAE helpers.
(tuple::tuple): Use new helpers to reduce repitition in constraints.
(tuple::tuple(allocator_arg_t, const Alloc&)): Constrain.
(tuple<T1, T2>::_TCC, tuple<T1, T2>::_ImplicitDefaultCtor)
(tuple<T1, T2>::_ExplicitDefaultCtor, tuple<T1, T2>::_ImplicitCtor)
(tuple<T1, T2>::_ExplicitCtor): New alias templates for checking
constraints in constructors.
(tuple::__is_alloc_arg()): New SFINAE helpers.
(tuple<T1, T2>::tuple): Use new helpers to reduce repitition in
constraints.
(tuple<T1, T2>::tuple(allocator_arg_t, const Alloc&)): Constrain.
* testsuite/20_util/tuple/cons/90700.cc: New test.
* testsuite/20_util/tuple/cons/allocators.cc: Add default constructor
to meet new constraint on allocator-extended default constructor.
From-SVN: r271998
2019-06-06 14:13:36 +02:00
|
|
|
template<typename _U1, typename _U2,
|
|
|
|
_ExplicitCtor<true, const _U1&, const _U2&> = false>
|
|
|
|
explicit constexpr
|
|
|
|
tuple(const tuple<_U1, _U2>& __in)
|
|
|
|
noexcept(__nothrow_constructible<const _U1&, const _U2&>())
|
Implement N4387, "Improving pair and tuple", and LWG 2367.
2015-06-30 Ville Voutilainen <ville.voutilainen@gmail.com>
Implement N4387, "Improving pair and tuple", and LWG 2367.
* include/bits/stl_pair.h (_ConstructiblePair,
_ImplicitlyConvertiblePair, _MoveConstructiblePair,
_ImplicitlyMoveConvertiblePair): New.
(pair()): Constrain it.
(pair(const _T1&, const _T2&), pair(const pair<_U1, _U2>&),
pair(_U1&&, const _T2&), pair(const _T1&, _U2&&), pair(_U1&&, _U2&&),
pair(pair<_U1, _U2>&&)): Make conditionally explicit.
* include/std/tuple (_TC, tuple::_TC2, tuple::TCC, tuple::TMC): New.
(tuple()): Constrain it.
(tuple(const _UElements&...), tuple(_UElements&&...),
tuple(const tuple<_UElements...>&), tuple(tuple<_UElements...>&&),
tuple(allocator_arg_t, const _Alloc&, const _UElements&...),
tuple(allocator_arg_t, const _Alloc&, _UElements&&...),
tuple(allocator_arg_t, const _Alloc&, const tuple<_UElements...>&),
tuple(allocator_arg_t, const _Alloc&, tuple<_UElements...>&&),
tuple(const pair<_U1, _U2>&), tuple(pair<_U1, _U2>&&),
tuple(allocator_arg_t, const _Alloc&, const pair<_U1, _U2>&),
tuple(allocator_arg_t, const _Alloc&, pair<_U1, _U2>&&)): Make
conditionally explicit.
* include/experimental/functional (__boyer_moore_array_base): Name
array type explicitly instead of using an empty braced-init-list.
* testsuite/20_util/pair/cons/explicit_construct.cc: New.
* testsuite/20_util/pair/piecewise.cc: Use piecewise_construct.
* testsuite/20_util/pair/requirements/dr2367.cc: New.
* testsuite/20_util/tuple/cons/explicit_construct.cc: New.
* testsuite/20_util/tuple/requirements/dr2367.cc: New.
From-SVN: r225189
2015-06-30 15:26:49 +02:00
|
|
|
: _Inherited(static_cast<const _Tuple_impl<0, _U1, _U2>&>(__in)) { }
|
|
|
|
|
Refactor SFINAE constraints on std::tuple constructors
Replace the _TC class template with the better-named _TupleConstraints
one, which provides a different set of member functions. The new members
do not distinguish construction from lvalues and rvalues, but expects
the caller to do that by providing different template arguments. Within
the std::tuple primary template and std::tuple<T1, T2> partial
specialization the _TupleConstraints members are used via new alias
templates like _ImplicitCtor and _ExplicitCtor which makes the
constructor constraints less verbose and repetitive. For example, where
we previously had:
template<typename... _UElements, typename
enable_if<
_TMC<_UElements...>::template
_MoveConstructibleTuple<_UElements...>()
&& _TMC<_UElements...>::template
_ImplicitlyMoveConvertibleTuple<_UElements...>()
&& (sizeof...(_Elements) >= 1),
bool>::type=true>
constexpr tuple(_UElements&&... __elements)
We now have:
template<typename... _UElements,
bool _Valid = __valid_args<_UElements...>(),
_ImplicitCtor<_Valid, _UElements...> = true>
constexpr
tuple(_UElements&&... __elements)
There are two semantic changes as a result of the refactoring:
- The allocator-extended default constructor is now constrained.
- The rewritten constraints fix PR 90700.
* include/std/tuple (_TC): Replace with _TupleConstraints.
(_TupleConstraints): New helper for SFINAE constraints, with more
expressive member functions to reduce duplication when used.
(tuple::_TC2, tuple::_TMC, tuple::_TNTC): Remove.
(tuple::_TCC): Replace dummy type parameter with bool non-type
parameter that can be used to check the pack size.
(tuple::_ImplicitDefaultCtor, tuple::_ExplicitDefaultCtor)
(tuple::_ImplicitCtor, tuple::_ExplicitCtor): New alias templates for
checking constraints in constructors.
(tuple::__valid_args, tuple::_UseOtherCtor, tuple::__use_other_ctor):
New SFINAE helpers.
(tuple::tuple): Use new helpers to reduce repitition in constraints.
(tuple::tuple(allocator_arg_t, const Alloc&)): Constrain.
(tuple<T1, T2>::_TCC, tuple<T1, T2>::_ImplicitDefaultCtor)
(tuple<T1, T2>::_ExplicitDefaultCtor, tuple<T1, T2>::_ImplicitCtor)
(tuple<T1, T2>::_ExplicitCtor): New alias templates for checking
constraints in constructors.
(tuple::__is_alloc_arg()): New SFINAE helpers.
(tuple<T1, T2>::tuple): Use new helpers to reduce repitition in
constraints.
(tuple<T1, T2>::tuple(allocator_arg_t, const Alloc&)): Constrain.
* testsuite/20_util/tuple/cons/90700.cc: New test.
* testsuite/20_util/tuple/cons/allocators.cc: Add default constructor
to meet new constraint on allocator-extended default constructor.
From-SVN: r271998
2019-06-06 14:13:36 +02:00
|
|
|
template<typename _U1, typename _U2,
|
|
|
|
_ImplicitCtor<true, _U1, _U2> = true>
|
|
|
|
constexpr
|
|
|
|
tuple(tuple<_U1, _U2>&& __in)
|
|
|
|
noexcept(__nothrow_constructible<_U1, _U2>())
|
2009-08-01 04:26:32 +02:00
|
|
|
: _Inherited(static_cast<_Tuple_impl<0, _U1, _U2>&&>(__in)) { }
|
tuple (_Tuple_impl<>::_Tuple_impl(typename std::remove_reference<>::type&&, typename std::remove_reference<>::type&&...), [...]): Add.
2007-12-30 Paolo Carlini <pcarlini@suse.de>
* include/std/tuple (_Tuple_impl<>::_Tuple_impl(typename
std::remove_reference<>::type&&, typename
std::remove_reference<>::type&&...),
_Tuple_impl(const _Tuple_impl<>&), _Tuple_impl(_Tuple_impl&&),
_Tuple_impl(_Tuple_impl<>&&), operator=(_Tuple_impl&&),
operator=(const _Tuple_impl<>&), operator=(_Tuple_impl<>&&)): Add.
(tuple<>::tuple(const _Elements&...), tuple(_UElements&&...),
tuple(tuple&&), tuple(const tuple<>&), tuple(tuple<>&&),
operator=(tuple&&), operator=(const tuple<>&), operator=(tuple<>&&)):
Likewise.
(tuple<_T1, _T2>::tuple(const _T1&, const _T2&, tuple(_U1&&, _U2&&),
tuple(tuple&&), tuple(tuple<>&&), tuple(pair<>&&), operator=(tuple&&),
operator=(tuple<>&&), operator=(pair<>&&)): Likewise.
(tuple<>::tuple(typename __add_c_ref<_Elements>::type...),
tuple<_T1, _T2>::tuple(typename __add_c_ref<>::type,
typename __add_c_ref<>::type)): Remove.
* testsuite/tr1/6_containers/tuple/creation_functions/tie2.cc: New.
* testsuite/20_util/tuple/creation_functions/tie2.cc: Likewise.
* testsuite/20_util/tuple/moveable.cc: Likewise.
From-SVN: r131230
2007-12-30 23:44:42 +01:00
|
|
|
|
Refactor SFINAE constraints on std::tuple constructors
Replace the _TC class template with the better-named _TupleConstraints
one, which provides a different set of member functions. The new members
do not distinguish construction from lvalues and rvalues, but expects
the caller to do that by providing different template arguments. Within
the std::tuple primary template and std::tuple<T1, T2> partial
specialization the _TupleConstraints members are used via new alias
templates like _ImplicitCtor and _ExplicitCtor which makes the
constructor constraints less verbose and repetitive. For example, where
we previously had:
template<typename... _UElements, typename
enable_if<
_TMC<_UElements...>::template
_MoveConstructibleTuple<_UElements...>()
&& _TMC<_UElements...>::template
_ImplicitlyMoveConvertibleTuple<_UElements...>()
&& (sizeof...(_Elements) >= 1),
bool>::type=true>
constexpr tuple(_UElements&&... __elements)
We now have:
template<typename... _UElements,
bool _Valid = __valid_args<_UElements...>(),
_ImplicitCtor<_Valid, _UElements...> = true>
constexpr
tuple(_UElements&&... __elements)
There are two semantic changes as a result of the refactoring:
- The allocator-extended default constructor is now constrained.
- The rewritten constraints fix PR 90700.
* include/std/tuple (_TC): Replace with _TupleConstraints.
(_TupleConstraints): New helper for SFINAE constraints, with more
expressive member functions to reduce duplication when used.
(tuple::_TC2, tuple::_TMC, tuple::_TNTC): Remove.
(tuple::_TCC): Replace dummy type parameter with bool non-type
parameter that can be used to check the pack size.
(tuple::_ImplicitDefaultCtor, tuple::_ExplicitDefaultCtor)
(tuple::_ImplicitCtor, tuple::_ExplicitCtor): New alias templates for
checking constraints in constructors.
(tuple::__valid_args, tuple::_UseOtherCtor, tuple::__use_other_ctor):
New SFINAE helpers.
(tuple::tuple): Use new helpers to reduce repitition in constraints.
(tuple::tuple(allocator_arg_t, const Alloc&)): Constrain.
(tuple<T1, T2>::_TCC, tuple<T1, T2>::_ImplicitDefaultCtor)
(tuple<T1, T2>::_ExplicitDefaultCtor, tuple<T1, T2>::_ImplicitCtor)
(tuple<T1, T2>::_ExplicitCtor): New alias templates for checking
constraints in constructors.
(tuple::__is_alloc_arg()): New SFINAE helpers.
(tuple<T1, T2>::tuple): Use new helpers to reduce repitition in
constraints.
(tuple<T1, T2>::tuple(allocator_arg_t, const Alloc&)): Constrain.
* testsuite/20_util/tuple/cons/90700.cc: New test.
* testsuite/20_util/tuple/cons/allocators.cc: Add default constructor
to meet new constraint on allocator-extended default constructor.
From-SVN: r271998
2019-06-06 14:13:36 +02:00
|
|
|
template<typename _U1, typename _U2,
|
|
|
|
_ExplicitCtor<true, _U1, _U2> = false>
|
|
|
|
explicit constexpr
|
|
|
|
tuple(tuple<_U1, _U2>&& __in)
|
|
|
|
noexcept(__nothrow_constructible<_U1, _U2>())
|
Implement N4387, "Improving pair and tuple", and LWG 2367.
2015-06-30 Ville Voutilainen <ville.voutilainen@gmail.com>
Implement N4387, "Improving pair and tuple", and LWG 2367.
* include/bits/stl_pair.h (_ConstructiblePair,
_ImplicitlyConvertiblePair, _MoveConstructiblePair,
_ImplicitlyMoveConvertiblePair): New.
(pair()): Constrain it.
(pair(const _T1&, const _T2&), pair(const pair<_U1, _U2>&),
pair(_U1&&, const _T2&), pair(const _T1&, _U2&&), pair(_U1&&, _U2&&),
pair(pair<_U1, _U2>&&)): Make conditionally explicit.
* include/std/tuple (_TC, tuple::_TC2, tuple::TCC, tuple::TMC): New.
(tuple()): Constrain it.
(tuple(const _UElements&...), tuple(_UElements&&...),
tuple(const tuple<_UElements...>&), tuple(tuple<_UElements...>&&),
tuple(allocator_arg_t, const _Alloc&, const _UElements&...),
tuple(allocator_arg_t, const _Alloc&, _UElements&&...),
tuple(allocator_arg_t, const _Alloc&, const tuple<_UElements...>&),
tuple(allocator_arg_t, const _Alloc&, tuple<_UElements...>&&),
tuple(const pair<_U1, _U2>&), tuple(pair<_U1, _U2>&&),
tuple(allocator_arg_t, const _Alloc&, const pair<_U1, _U2>&),
tuple(allocator_arg_t, const _Alloc&, pair<_U1, _U2>&&)): Make
conditionally explicit.
* include/experimental/functional (__boyer_moore_array_base): Name
array type explicitly instead of using an empty braced-init-list.
* testsuite/20_util/pair/cons/explicit_construct.cc: New.
* testsuite/20_util/pair/piecewise.cc: Use piecewise_construct.
* testsuite/20_util/pair/requirements/dr2367.cc: New.
* testsuite/20_util/tuple/cons/explicit_construct.cc: New.
* testsuite/20_util/tuple/requirements/dr2367.cc: New.
From-SVN: r225189
2015-06-30 15:26:49 +02:00
|
|
|
: _Inherited(static_cast<_Tuple_impl<0, _U1, _U2>&&>(__in)) { }
|
|
|
|
|
Refactor SFINAE constraints on std::tuple constructors
Replace the _TC class template with the better-named _TupleConstraints
one, which provides a different set of member functions. The new members
do not distinguish construction from lvalues and rvalues, but expects
the caller to do that by providing different template arguments. Within
the std::tuple primary template and std::tuple<T1, T2> partial
specialization the _TupleConstraints members are used via new alias
templates like _ImplicitCtor and _ExplicitCtor which makes the
constructor constraints less verbose and repetitive. For example, where
we previously had:
template<typename... _UElements, typename
enable_if<
_TMC<_UElements...>::template
_MoveConstructibleTuple<_UElements...>()
&& _TMC<_UElements...>::template
_ImplicitlyMoveConvertibleTuple<_UElements...>()
&& (sizeof...(_Elements) >= 1),
bool>::type=true>
constexpr tuple(_UElements&&... __elements)
We now have:
template<typename... _UElements,
bool _Valid = __valid_args<_UElements...>(),
_ImplicitCtor<_Valid, _UElements...> = true>
constexpr
tuple(_UElements&&... __elements)
There are two semantic changes as a result of the refactoring:
- The allocator-extended default constructor is now constrained.
- The rewritten constraints fix PR 90700.
* include/std/tuple (_TC): Replace with _TupleConstraints.
(_TupleConstraints): New helper for SFINAE constraints, with more
expressive member functions to reduce duplication when used.
(tuple::_TC2, tuple::_TMC, tuple::_TNTC): Remove.
(tuple::_TCC): Replace dummy type parameter with bool non-type
parameter that can be used to check the pack size.
(tuple::_ImplicitDefaultCtor, tuple::_ExplicitDefaultCtor)
(tuple::_ImplicitCtor, tuple::_ExplicitCtor): New alias templates for
checking constraints in constructors.
(tuple::__valid_args, tuple::_UseOtherCtor, tuple::__use_other_ctor):
New SFINAE helpers.
(tuple::tuple): Use new helpers to reduce repitition in constraints.
(tuple::tuple(allocator_arg_t, const Alloc&)): Constrain.
(tuple<T1, T2>::_TCC, tuple<T1, T2>::_ImplicitDefaultCtor)
(tuple<T1, T2>::_ExplicitDefaultCtor, tuple<T1, T2>::_ImplicitCtor)
(tuple<T1, T2>::_ExplicitCtor): New alias templates for checking
constraints in constructors.
(tuple::__is_alloc_arg()): New SFINAE helpers.
(tuple<T1, T2>::tuple): Use new helpers to reduce repitition in
constraints.
(tuple<T1, T2>::tuple(allocator_arg_t, const Alloc&)): Constrain.
* testsuite/20_util/tuple/cons/90700.cc: New test.
* testsuite/20_util/tuple/cons/allocators.cc: Add default constructor
to meet new constraint on allocator-extended default constructor.
From-SVN: r271998
2019-06-06 14:13:36 +02:00
|
|
|
template<typename _U1, typename _U2,
|
|
|
|
_ImplicitCtor<true, const _U1&, const _U2&> = true>
|
|
|
|
constexpr
|
|
|
|
tuple(const pair<_U1, _U2>& __in)
|
|
|
|
noexcept(__nothrow_constructible<const _U1&, const _U2&>())
|
2008-02-18 14:32:01 +01:00
|
|
|
: _Inherited(__in.first, __in.second) { }
|
tuple (_Tuple_impl<>::_Tuple_impl(typename std::remove_reference<>::type&&, typename std::remove_reference<>::type&&...), [...]): Add.
2007-12-30 Paolo Carlini <pcarlini@suse.de>
* include/std/tuple (_Tuple_impl<>::_Tuple_impl(typename
std::remove_reference<>::type&&, typename
std::remove_reference<>::type&&...),
_Tuple_impl(const _Tuple_impl<>&), _Tuple_impl(_Tuple_impl&&),
_Tuple_impl(_Tuple_impl<>&&), operator=(_Tuple_impl&&),
operator=(const _Tuple_impl<>&), operator=(_Tuple_impl<>&&)): Add.
(tuple<>::tuple(const _Elements&...), tuple(_UElements&&...),
tuple(tuple&&), tuple(const tuple<>&), tuple(tuple<>&&),
operator=(tuple&&), operator=(const tuple<>&), operator=(tuple<>&&)):
Likewise.
(tuple<_T1, _T2>::tuple(const _T1&, const _T2&, tuple(_U1&&, _U2&&),
tuple(tuple&&), tuple(tuple<>&&), tuple(pair<>&&), operator=(tuple&&),
operator=(tuple<>&&), operator=(pair<>&&)): Likewise.
(tuple<>::tuple(typename __add_c_ref<_Elements>::type...),
tuple<_T1, _T2>::tuple(typename __add_c_ref<>::type,
typename __add_c_ref<>::type)): Remove.
* testsuite/tr1/6_containers/tuple/creation_functions/tie2.cc: New.
* testsuite/20_util/tuple/creation_functions/tie2.cc: Likewise.
* testsuite/20_util/tuple/moveable.cc: Likewise.
From-SVN: r131230
2007-12-30 23:44:42 +01:00
|
|
|
|
Refactor SFINAE constraints on std::tuple constructors
Replace the _TC class template with the better-named _TupleConstraints
one, which provides a different set of member functions. The new members
do not distinguish construction from lvalues and rvalues, but expects
the caller to do that by providing different template arguments. Within
the std::tuple primary template and std::tuple<T1, T2> partial
specialization the _TupleConstraints members are used via new alias
templates like _ImplicitCtor and _ExplicitCtor which makes the
constructor constraints less verbose and repetitive. For example, where
we previously had:
template<typename... _UElements, typename
enable_if<
_TMC<_UElements...>::template
_MoveConstructibleTuple<_UElements...>()
&& _TMC<_UElements...>::template
_ImplicitlyMoveConvertibleTuple<_UElements...>()
&& (sizeof...(_Elements) >= 1),
bool>::type=true>
constexpr tuple(_UElements&&... __elements)
We now have:
template<typename... _UElements,
bool _Valid = __valid_args<_UElements...>(),
_ImplicitCtor<_Valid, _UElements...> = true>
constexpr
tuple(_UElements&&... __elements)
There are two semantic changes as a result of the refactoring:
- The allocator-extended default constructor is now constrained.
- The rewritten constraints fix PR 90700.
* include/std/tuple (_TC): Replace with _TupleConstraints.
(_TupleConstraints): New helper for SFINAE constraints, with more
expressive member functions to reduce duplication when used.
(tuple::_TC2, tuple::_TMC, tuple::_TNTC): Remove.
(tuple::_TCC): Replace dummy type parameter with bool non-type
parameter that can be used to check the pack size.
(tuple::_ImplicitDefaultCtor, tuple::_ExplicitDefaultCtor)
(tuple::_ImplicitCtor, tuple::_ExplicitCtor): New alias templates for
checking constraints in constructors.
(tuple::__valid_args, tuple::_UseOtherCtor, tuple::__use_other_ctor):
New SFINAE helpers.
(tuple::tuple): Use new helpers to reduce repitition in constraints.
(tuple::tuple(allocator_arg_t, const Alloc&)): Constrain.
(tuple<T1, T2>::_TCC, tuple<T1, T2>::_ImplicitDefaultCtor)
(tuple<T1, T2>::_ExplicitDefaultCtor, tuple<T1, T2>::_ImplicitCtor)
(tuple<T1, T2>::_ExplicitCtor): New alias templates for checking
constraints in constructors.
(tuple::__is_alloc_arg()): New SFINAE helpers.
(tuple<T1, T2>::tuple): Use new helpers to reduce repitition in
constraints.
(tuple<T1, T2>::tuple(allocator_arg_t, const Alloc&)): Constrain.
* testsuite/20_util/tuple/cons/90700.cc: New test.
* testsuite/20_util/tuple/cons/allocators.cc: Add default constructor
to meet new constraint on allocator-extended default constructor.
From-SVN: r271998
2019-06-06 14:13:36 +02:00
|
|
|
template<typename _U1, typename _U2,
|
|
|
|
_ExplicitCtor<true, const _U1&, const _U2&> = false>
|
|
|
|
explicit constexpr
|
|
|
|
tuple(const pair<_U1, _U2>& __in)
|
|
|
|
noexcept(__nothrow_constructible<const _U1&, const _U2&>())
|
Implement N4387, "Improving pair and tuple", and LWG 2367.
2015-06-30 Ville Voutilainen <ville.voutilainen@gmail.com>
Implement N4387, "Improving pair and tuple", and LWG 2367.
* include/bits/stl_pair.h (_ConstructiblePair,
_ImplicitlyConvertiblePair, _MoveConstructiblePair,
_ImplicitlyMoveConvertiblePair): New.
(pair()): Constrain it.
(pair(const _T1&, const _T2&), pair(const pair<_U1, _U2>&),
pair(_U1&&, const _T2&), pair(const _T1&, _U2&&), pair(_U1&&, _U2&&),
pair(pair<_U1, _U2>&&)): Make conditionally explicit.
* include/std/tuple (_TC, tuple::_TC2, tuple::TCC, tuple::TMC): New.
(tuple()): Constrain it.
(tuple(const _UElements&...), tuple(_UElements&&...),
tuple(const tuple<_UElements...>&), tuple(tuple<_UElements...>&&),
tuple(allocator_arg_t, const _Alloc&, const _UElements&...),
tuple(allocator_arg_t, const _Alloc&, _UElements&&...),
tuple(allocator_arg_t, const _Alloc&, const tuple<_UElements...>&),
tuple(allocator_arg_t, const _Alloc&, tuple<_UElements...>&&),
tuple(const pair<_U1, _U2>&), tuple(pair<_U1, _U2>&&),
tuple(allocator_arg_t, const _Alloc&, const pair<_U1, _U2>&),
tuple(allocator_arg_t, const _Alloc&, pair<_U1, _U2>&&)): Make
conditionally explicit.
* include/experimental/functional (__boyer_moore_array_base): Name
array type explicitly instead of using an empty braced-init-list.
* testsuite/20_util/pair/cons/explicit_construct.cc: New.
* testsuite/20_util/pair/piecewise.cc: Use piecewise_construct.
* testsuite/20_util/pair/requirements/dr2367.cc: New.
* testsuite/20_util/tuple/cons/explicit_construct.cc: New.
* testsuite/20_util/tuple/requirements/dr2367.cc: New.
From-SVN: r225189
2015-06-30 15:26:49 +02:00
|
|
|
: _Inherited(__in.first, __in.second) { }
|
|
|
|
|
Refactor SFINAE constraints on std::tuple constructors
Replace the _TC class template with the better-named _TupleConstraints
one, which provides a different set of member functions. The new members
do not distinguish construction from lvalues and rvalues, but expects
the caller to do that by providing different template arguments. Within
the std::tuple primary template and std::tuple<T1, T2> partial
specialization the _TupleConstraints members are used via new alias
templates like _ImplicitCtor and _ExplicitCtor which makes the
constructor constraints less verbose and repetitive. For example, where
we previously had:
template<typename... _UElements, typename
enable_if<
_TMC<_UElements...>::template
_MoveConstructibleTuple<_UElements...>()
&& _TMC<_UElements...>::template
_ImplicitlyMoveConvertibleTuple<_UElements...>()
&& (sizeof...(_Elements) >= 1),
bool>::type=true>
constexpr tuple(_UElements&&... __elements)
We now have:
template<typename... _UElements,
bool _Valid = __valid_args<_UElements...>(),
_ImplicitCtor<_Valid, _UElements...> = true>
constexpr
tuple(_UElements&&... __elements)
There are two semantic changes as a result of the refactoring:
- The allocator-extended default constructor is now constrained.
- The rewritten constraints fix PR 90700.
* include/std/tuple (_TC): Replace with _TupleConstraints.
(_TupleConstraints): New helper for SFINAE constraints, with more
expressive member functions to reduce duplication when used.
(tuple::_TC2, tuple::_TMC, tuple::_TNTC): Remove.
(tuple::_TCC): Replace dummy type parameter with bool non-type
parameter that can be used to check the pack size.
(tuple::_ImplicitDefaultCtor, tuple::_ExplicitDefaultCtor)
(tuple::_ImplicitCtor, tuple::_ExplicitCtor): New alias templates for
checking constraints in constructors.
(tuple::__valid_args, tuple::_UseOtherCtor, tuple::__use_other_ctor):
New SFINAE helpers.
(tuple::tuple): Use new helpers to reduce repitition in constraints.
(tuple::tuple(allocator_arg_t, const Alloc&)): Constrain.
(tuple<T1, T2>::_TCC, tuple<T1, T2>::_ImplicitDefaultCtor)
(tuple<T1, T2>::_ExplicitDefaultCtor, tuple<T1, T2>::_ImplicitCtor)
(tuple<T1, T2>::_ExplicitCtor): New alias templates for checking
constraints in constructors.
(tuple::__is_alloc_arg()): New SFINAE helpers.
(tuple<T1, T2>::tuple): Use new helpers to reduce repitition in
constraints.
(tuple<T1, T2>::tuple(allocator_arg_t, const Alloc&)): Constrain.
* testsuite/20_util/tuple/cons/90700.cc: New test.
* testsuite/20_util/tuple/cons/allocators.cc: Add default constructor
to meet new constraint on allocator-extended default constructor.
From-SVN: r271998
2019-06-06 14:13:36 +02:00
|
|
|
template<typename _U1, typename _U2,
|
|
|
|
_ImplicitCtor<true, _U1, _U2> = true>
|
|
|
|
constexpr
|
|
|
|
tuple(pair<_U1, _U2>&& __in)
|
|
|
|
noexcept(__nothrow_constructible<_U1, _U2>())
|
2010-06-10 12:24:46 +02:00
|
|
|
: _Inherited(std::forward<_U1>(__in.first),
|
|
|
|
std::forward<_U2>(__in.second)) { }
|
2007-12-26 16:23:49 +01:00
|
|
|
|
Refactor SFINAE constraints on std::tuple constructors
Replace the _TC class template with the better-named _TupleConstraints
one, which provides a different set of member functions. The new members
do not distinguish construction from lvalues and rvalues, but expects
the caller to do that by providing different template arguments. Within
the std::tuple primary template and std::tuple<T1, T2> partial
specialization the _TupleConstraints members are used via new alias
templates like _ImplicitCtor and _ExplicitCtor which makes the
constructor constraints less verbose and repetitive. For example, where
we previously had:
template<typename... _UElements, typename
enable_if<
_TMC<_UElements...>::template
_MoveConstructibleTuple<_UElements...>()
&& _TMC<_UElements...>::template
_ImplicitlyMoveConvertibleTuple<_UElements...>()
&& (sizeof...(_Elements) >= 1),
bool>::type=true>
constexpr tuple(_UElements&&... __elements)
We now have:
template<typename... _UElements,
bool _Valid = __valid_args<_UElements...>(),
_ImplicitCtor<_Valid, _UElements...> = true>
constexpr
tuple(_UElements&&... __elements)
There are two semantic changes as a result of the refactoring:
- The allocator-extended default constructor is now constrained.
- The rewritten constraints fix PR 90700.
* include/std/tuple (_TC): Replace with _TupleConstraints.
(_TupleConstraints): New helper for SFINAE constraints, with more
expressive member functions to reduce duplication when used.
(tuple::_TC2, tuple::_TMC, tuple::_TNTC): Remove.
(tuple::_TCC): Replace dummy type parameter with bool non-type
parameter that can be used to check the pack size.
(tuple::_ImplicitDefaultCtor, tuple::_ExplicitDefaultCtor)
(tuple::_ImplicitCtor, tuple::_ExplicitCtor): New alias templates for
checking constraints in constructors.
(tuple::__valid_args, tuple::_UseOtherCtor, tuple::__use_other_ctor):
New SFINAE helpers.
(tuple::tuple): Use new helpers to reduce repitition in constraints.
(tuple::tuple(allocator_arg_t, const Alloc&)): Constrain.
(tuple<T1, T2>::_TCC, tuple<T1, T2>::_ImplicitDefaultCtor)
(tuple<T1, T2>::_ExplicitDefaultCtor, tuple<T1, T2>::_ImplicitCtor)
(tuple<T1, T2>::_ExplicitCtor): New alias templates for checking
constraints in constructors.
(tuple::__is_alloc_arg()): New SFINAE helpers.
(tuple<T1, T2>::tuple): Use new helpers to reduce repitition in
constraints.
(tuple<T1, T2>::tuple(allocator_arg_t, const Alloc&)): Constrain.
* testsuite/20_util/tuple/cons/90700.cc: New test.
* testsuite/20_util/tuple/cons/allocators.cc: Add default constructor
to meet new constraint on allocator-extended default constructor.
From-SVN: r271998
2019-06-06 14:13:36 +02:00
|
|
|
template<typename _U1, typename _U2,
|
|
|
|
_ExplicitCtor<true, _U1, _U2> = false>
|
|
|
|
explicit constexpr
|
|
|
|
tuple(pair<_U1, _U2>&& __in)
|
|
|
|
noexcept(__nothrow_constructible<_U1, _U2>())
|
Implement N4387, "Improving pair and tuple", and LWG 2367.
2015-06-30 Ville Voutilainen <ville.voutilainen@gmail.com>
Implement N4387, "Improving pair and tuple", and LWG 2367.
* include/bits/stl_pair.h (_ConstructiblePair,
_ImplicitlyConvertiblePair, _MoveConstructiblePair,
_ImplicitlyMoveConvertiblePair): New.
(pair()): Constrain it.
(pair(const _T1&, const _T2&), pair(const pair<_U1, _U2>&),
pair(_U1&&, const _T2&), pair(const _T1&, _U2&&), pair(_U1&&, _U2&&),
pair(pair<_U1, _U2>&&)): Make conditionally explicit.
* include/std/tuple (_TC, tuple::_TC2, tuple::TCC, tuple::TMC): New.
(tuple()): Constrain it.
(tuple(const _UElements&...), tuple(_UElements&&...),
tuple(const tuple<_UElements...>&), tuple(tuple<_UElements...>&&),
tuple(allocator_arg_t, const _Alloc&, const _UElements&...),
tuple(allocator_arg_t, const _Alloc&, _UElements&&...),
tuple(allocator_arg_t, const _Alloc&, const tuple<_UElements...>&),
tuple(allocator_arg_t, const _Alloc&, tuple<_UElements...>&&),
tuple(const pair<_U1, _U2>&), tuple(pair<_U1, _U2>&&),
tuple(allocator_arg_t, const _Alloc&, const pair<_U1, _U2>&),
tuple(allocator_arg_t, const _Alloc&, pair<_U1, _U2>&&)): Make
conditionally explicit.
* include/experimental/functional (__boyer_moore_array_base): Name
array type explicitly instead of using an empty braced-init-list.
* testsuite/20_util/pair/cons/explicit_construct.cc: New.
* testsuite/20_util/pair/piecewise.cc: Use piecewise_construct.
* testsuite/20_util/pair/requirements/dr2367.cc: New.
* testsuite/20_util/tuple/cons/explicit_construct.cc: New.
* testsuite/20_util/tuple/requirements/dr2367.cc: New.
From-SVN: r225189
2015-06-30 15:26:49 +02:00
|
|
|
: _Inherited(std::forward<_U1>(__in.first),
|
|
|
|
std::forward<_U2>(__in.second)) { }
|
|
|
|
|
2011-08-03 23:05:14 +02:00
|
|
|
// Allocator-extended constructors.
|
2011-05-30 18:31:17 +02:00
|
|
|
|
Refactor SFINAE constraints on std::tuple constructors
Replace the _TC class template with the better-named _TupleConstraints
one, which provides a different set of member functions. The new members
do not distinguish construction from lvalues and rvalues, but expects
the caller to do that by providing different template arguments. Within
the std::tuple primary template and std::tuple<T1, T2> partial
specialization the _TupleConstraints members are used via new alias
templates like _ImplicitCtor and _ExplicitCtor which makes the
constructor constraints less verbose and repetitive. For example, where
we previously had:
template<typename... _UElements, typename
enable_if<
_TMC<_UElements...>::template
_MoveConstructibleTuple<_UElements...>()
&& _TMC<_UElements...>::template
_ImplicitlyMoveConvertibleTuple<_UElements...>()
&& (sizeof...(_Elements) >= 1),
bool>::type=true>
constexpr tuple(_UElements&&... __elements)
We now have:
template<typename... _UElements,
bool _Valid = __valid_args<_UElements...>(),
_ImplicitCtor<_Valid, _UElements...> = true>
constexpr
tuple(_UElements&&... __elements)
There are two semantic changes as a result of the refactoring:
- The allocator-extended default constructor is now constrained.
- The rewritten constraints fix PR 90700.
* include/std/tuple (_TC): Replace with _TupleConstraints.
(_TupleConstraints): New helper for SFINAE constraints, with more
expressive member functions to reduce duplication when used.
(tuple::_TC2, tuple::_TMC, tuple::_TNTC): Remove.
(tuple::_TCC): Replace dummy type parameter with bool non-type
parameter that can be used to check the pack size.
(tuple::_ImplicitDefaultCtor, tuple::_ExplicitDefaultCtor)
(tuple::_ImplicitCtor, tuple::_ExplicitCtor): New alias templates for
checking constraints in constructors.
(tuple::__valid_args, tuple::_UseOtherCtor, tuple::__use_other_ctor):
New SFINAE helpers.
(tuple::tuple): Use new helpers to reduce repitition in constraints.
(tuple::tuple(allocator_arg_t, const Alloc&)): Constrain.
(tuple<T1, T2>::_TCC, tuple<T1, T2>::_ImplicitDefaultCtor)
(tuple<T1, T2>::_ExplicitDefaultCtor, tuple<T1, T2>::_ImplicitCtor)
(tuple<T1, T2>::_ExplicitCtor): New alias templates for checking
constraints in constructors.
(tuple::__is_alloc_arg()): New SFINAE helpers.
(tuple<T1, T2>::tuple): Use new helpers to reduce repitition in
constraints.
(tuple<T1, T2>::tuple(allocator_arg_t, const Alloc&)): Constrain.
* testsuite/20_util/tuple/cons/90700.cc: New test.
* testsuite/20_util/tuple/cons/allocators.cc: Add default constructor
to meet new constraint on allocator-extended default constructor.
From-SVN: r271998
2019-06-06 14:13:36 +02:00
|
|
|
template<typename _Alloc,
|
|
|
|
_ImplicitDefaultCtor<is_object<_Alloc>::value, _T1, _T2> = true>
|
2011-05-30 18:31:17 +02:00
|
|
|
tuple(allocator_arg_t __tag, const _Alloc& __a)
|
|
|
|
: _Inherited(__tag, __a) { }
|
|
|
|
|
Refactor SFINAE constraints on std::tuple constructors
Replace the _TC class template with the better-named _TupleConstraints
one, which provides a different set of member functions. The new members
do not distinguish construction from lvalues and rvalues, but expects
the caller to do that by providing different template arguments. Within
the std::tuple primary template and std::tuple<T1, T2> partial
specialization the _TupleConstraints members are used via new alias
templates like _ImplicitCtor and _ExplicitCtor which makes the
constructor constraints less verbose and repetitive. For example, where
we previously had:
template<typename... _UElements, typename
enable_if<
_TMC<_UElements...>::template
_MoveConstructibleTuple<_UElements...>()
&& _TMC<_UElements...>::template
_ImplicitlyMoveConvertibleTuple<_UElements...>()
&& (sizeof...(_Elements) >= 1),
bool>::type=true>
constexpr tuple(_UElements&&... __elements)
We now have:
template<typename... _UElements,
bool _Valid = __valid_args<_UElements...>(),
_ImplicitCtor<_Valid, _UElements...> = true>
constexpr
tuple(_UElements&&... __elements)
There are two semantic changes as a result of the refactoring:
- The allocator-extended default constructor is now constrained.
- The rewritten constraints fix PR 90700.
* include/std/tuple (_TC): Replace with _TupleConstraints.
(_TupleConstraints): New helper for SFINAE constraints, with more
expressive member functions to reduce duplication when used.
(tuple::_TC2, tuple::_TMC, tuple::_TNTC): Remove.
(tuple::_TCC): Replace dummy type parameter with bool non-type
parameter that can be used to check the pack size.
(tuple::_ImplicitDefaultCtor, tuple::_ExplicitDefaultCtor)
(tuple::_ImplicitCtor, tuple::_ExplicitCtor): New alias templates for
checking constraints in constructors.
(tuple::__valid_args, tuple::_UseOtherCtor, tuple::__use_other_ctor):
New SFINAE helpers.
(tuple::tuple): Use new helpers to reduce repitition in constraints.
(tuple::tuple(allocator_arg_t, const Alloc&)): Constrain.
(tuple<T1, T2>::_TCC, tuple<T1, T2>::_ImplicitDefaultCtor)
(tuple<T1, T2>::_ExplicitDefaultCtor, tuple<T1, T2>::_ImplicitCtor)
(tuple<T1, T2>::_ExplicitCtor): New alias templates for checking
constraints in constructors.
(tuple::__is_alloc_arg()): New SFINAE helpers.
(tuple<T1, T2>::tuple): Use new helpers to reduce repitition in
constraints.
(tuple<T1, T2>::tuple(allocator_arg_t, const Alloc&)): Constrain.
* testsuite/20_util/tuple/cons/90700.cc: New test.
* testsuite/20_util/tuple/cons/allocators.cc: Add default constructor
to meet new constraint on allocator-extended default constructor.
From-SVN: r271998
2019-06-06 14:13:36 +02:00
|
|
|
template<typename _Alloc, bool _Dummy = true,
|
|
|
|
_ImplicitCtor<_Dummy, const _T1&, const _T2&> = true>
|
2011-05-30 18:31:17 +02:00
|
|
|
tuple(allocator_arg_t __tag, const _Alloc& __a,
|
|
|
|
const _T1& __a1, const _T2& __a2)
|
|
|
|
: _Inherited(__tag, __a, __a1, __a2) { }
|
|
|
|
|
Refactor SFINAE constraints on std::tuple constructors
Replace the _TC class template with the better-named _TupleConstraints
one, which provides a different set of member functions. The new members
do not distinguish construction from lvalues and rvalues, but expects
the caller to do that by providing different template arguments. Within
the std::tuple primary template and std::tuple<T1, T2> partial
specialization the _TupleConstraints members are used via new alias
templates like _ImplicitCtor and _ExplicitCtor which makes the
constructor constraints less verbose and repetitive. For example, where
we previously had:
template<typename... _UElements, typename
enable_if<
_TMC<_UElements...>::template
_MoveConstructibleTuple<_UElements...>()
&& _TMC<_UElements...>::template
_ImplicitlyMoveConvertibleTuple<_UElements...>()
&& (sizeof...(_Elements) >= 1),
bool>::type=true>
constexpr tuple(_UElements&&... __elements)
We now have:
template<typename... _UElements,
bool _Valid = __valid_args<_UElements...>(),
_ImplicitCtor<_Valid, _UElements...> = true>
constexpr
tuple(_UElements&&... __elements)
There are two semantic changes as a result of the refactoring:
- The allocator-extended default constructor is now constrained.
- The rewritten constraints fix PR 90700.
* include/std/tuple (_TC): Replace with _TupleConstraints.
(_TupleConstraints): New helper for SFINAE constraints, with more
expressive member functions to reduce duplication when used.
(tuple::_TC2, tuple::_TMC, tuple::_TNTC): Remove.
(tuple::_TCC): Replace dummy type parameter with bool non-type
parameter that can be used to check the pack size.
(tuple::_ImplicitDefaultCtor, tuple::_ExplicitDefaultCtor)
(tuple::_ImplicitCtor, tuple::_ExplicitCtor): New alias templates for
checking constraints in constructors.
(tuple::__valid_args, tuple::_UseOtherCtor, tuple::__use_other_ctor):
New SFINAE helpers.
(tuple::tuple): Use new helpers to reduce repitition in constraints.
(tuple::tuple(allocator_arg_t, const Alloc&)): Constrain.
(tuple<T1, T2>::_TCC, tuple<T1, T2>::_ImplicitDefaultCtor)
(tuple<T1, T2>::_ExplicitDefaultCtor, tuple<T1, T2>::_ImplicitCtor)
(tuple<T1, T2>::_ExplicitCtor): New alias templates for checking
constraints in constructors.
(tuple::__is_alloc_arg()): New SFINAE helpers.
(tuple<T1, T2>::tuple): Use new helpers to reduce repitition in
constraints.
(tuple<T1, T2>::tuple(allocator_arg_t, const Alloc&)): Constrain.
* testsuite/20_util/tuple/cons/90700.cc: New test.
* testsuite/20_util/tuple/cons/allocators.cc: Add default constructor
to meet new constraint on allocator-extended default constructor.
From-SVN: r271998
2019-06-06 14:13:36 +02:00
|
|
|
template<typename _Alloc, bool _Dummy = true,
|
|
|
|
_ExplicitCtor<_Dummy, const _T1&, const _T2&> = false>
|
|
|
|
explicit
|
|
|
|
tuple(allocator_arg_t __tag, const _Alloc& __a,
|
Implement N4387, "Improving pair and tuple", and LWG 2367.
2015-06-30 Ville Voutilainen <ville.voutilainen@gmail.com>
Implement N4387, "Improving pair and tuple", and LWG 2367.
* include/bits/stl_pair.h (_ConstructiblePair,
_ImplicitlyConvertiblePair, _MoveConstructiblePair,
_ImplicitlyMoveConvertiblePair): New.
(pair()): Constrain it.
(pair(const _T1&, const _T2&), pair(const pair<_U1, _U2>&),
pair(_U1&&, const _T2&), pair(const _T1&, _U2&&), pair(_U1&&, _U2&&),
pair(pair<_U1, _U2>&&)): Make conditionally explicit.
* include/std/tuple (_TC, tuple::_TC2, tuple::TCC, tuple::TMC): New.
(tuple()): Constrain it.
(tuple(const _UElements&...), tuple(_UElements&&...),
tuple(const tuple<_UElements...>&), tuple(tuple<_UElements...>&&),
tuple(allocator_arg_t, const _Alloc&, const _UElements&...),
tuple(allocator_arg_t, const _Alloc&, _UElements&&...),
tuple(allocator_arg_t, const _Alloc&, const tuple<_UElements...>&),
tuple(allocator_arg_t, const _Alloc&, tuple<_UElements...>&&),
tuple(const pair<_U1, _U2>&), tuple(pair<_U1, _U2>&&),
tuple(allocator_arg_t, const _Alloc&, const pair<_U1, _U2>&),
tuple(allocator_arg_t, const _Alloc&, pair<_U1, _U2>&&)): Make
conditionally explicit.
* include/experimental/functional (__boyer_moore_array_base): Name
array type explicitly instead of using an empty braced-init-list.
* testsuite/20_util/pair/cons/explicit_construct.cc: New.
* testsuite/20_util/pair/piecewise.cc: Use piecewise_construct.
* testsuite/20_util/pair/requirements/dr2367.cc: New.
* testsuite/20_util/tuple/cons/explicit_construct.cc: New.
* testsuite/20_util/tuple/requirements/dr2367.cc: New.
From-SVN: r225189
2015-06-30 15:26:49 +02:00
|
|
|
const _T1& __a1, const _T2& __a2)
|
|
|
|
: _Inherited(__tag, __a, __a1, __a2) { }
|
|
|
|
|
Refactor SFINAE constraints on std::tuple constructors
Replace the _TC class template with the better-named _TupleConstraints
one, which provides a different set of member functions. The new members
do not distinguish construction from lvalues and rvalues, but expects
the caller to do that by providing different template arguments. Within
the std::tuple primary template and std::tuple<T1, T2> partial
specialization the _TupleConstraints members are used via new alias
templates like _ImplicitCtor and _ExplicitCtor which makes the
constructor constraints less verbose and repetitive. For example, where
we previously had:
template<typename... _UElements, typename
enable_if<
_TMC<_UElements...>::template
_MoveConstructibleTuple<_UElements...>()
&& _TMC<_UElements...>::template
_ImplicitlyMoveConvertibleTuple<_UElements...>()
&& (sizeof...(_Elements) >= 1),
bool>::type=true>
constexpr tuple(_UElements&&... __elements)
We now have:
template<typename... _UElements,
bool _Valid = __valid_args<_UElements...>(),
_ImplicitCtor<_Valid, _UElements...> = true>
constexpr
tuple(_UElements&&... __elements)
There are two semantic changes as a result of the refactoring:
- The allocator-extended default constructor is now constrained.
- The rewritten constraints fix PR 90700.
* include/std/tuple (_TC): Replace with _TupleConstraints.
(_TupleConstraints): New helper for SFINAE constraints, with more
expressive member functions to reduce duplication when used.
(tuple::_TC2, tuple::_TMC, tuple::_TNTC): Remove.
(tuple::_TCC): Replace dummy type parameter with bool non-type
parameter that can be used to check the pack size.
(tuple::_ImplicitDefaultCtor, tuple::_ExplicitDefaultCtor)
(tuple::_ImplicitCtor, tuple::_ExplicitCtor): New alias templates for
checking constraints in constructors.
(tuple::__valid_args, tuple::_UseOtherCtor, tuple::__use_other_ctor):
New SFINAE helpers.
(tuple::tuple): Use new helpers to reduce repitition in constraints.
(tuple::tuple(allocator_arg_t, const Alloc&)): Constrain.
(tuple<T1, T2>::_TCC, tuple<T1, T2>::_ImplicitDefaultCtor)
(tuple<T1, T2>::_ExplicitDefaultCtor, tuple<T1, T2>::_ImplicitCtor)
(tuple<T1, T2>::_ExplicitCtor): New alias templates for checking
constraints in constructors.
(tuple::__is_alloc_arg()): New SFINAE helpers.
(tuple<T1, T2>::tuple): Use new helpers to reduce repitition in
constraints.
(tuple<T1, T2>::tuple(allocator_arg_t, const Alloc&)): Constrain.
* testsuite/20_util/tuple/cons/90700.cc: New test.
* testsuite/20_util/tuple/cons/allocators.cc: Add default constructor
to meet new constraint on allocator-extended default constructor.
From-SVN: r271998
2019-06-06 14:13:36 +02:00
|
|
|
template<typename _Alloc, typename _U1, typename _U2,
|
|
|
|
_ImplicitCtor<true, _U1, _U2> = true>
|
2011-05-30 18:31:17 +02:00
|
|
|
tuple(allocator_arg_t __tag, const _Alloc& __a, _U1&& __a1, _U2&& __a2)
|
|
|
|
: _Inherited(__tag, __a, std::forward<_U1>(__a1),
|
|
|
|
std::forward<_U2>(__a2)) { }
|
|
|
|
|
Refactor SFINAE constraints on std::tuple constructors
Replace the _TC class template with the better-named _TupleConstraints
one, which provides a different set of member functions. The new members
do not distinguish construction from lvalues and rvalues, but expects
the caller to do that by providing different template arguments. Within
the std::tuple primary template and std::tuple<T1, T2> partial
specialization the _TupleConstraints members are used via new alias
templates like _ImplicitCtor and _ExplicitCtor which makes the
constructor constraints less verbose and repetitive. For example, where
we previously had:
template<typename... _UElements, typename
enable_if<
_TMC<_UElements...>::template
_MoveConstructibleTuple<_UElements...>()
&& _TMC<_UElements...>::template
_ImplicitlyMoveConvertibleTuple<_UElements...>()
&& (sizeof...(_Elements) >= 1),
bool>::type=true>
constexpr tuple(_UElements&&... __elements)
We now have:
template<typename... _UElements,
bool _Valid = __valid_args<_UElements...>(),
_ImplicitCtor<_Valid, _UElements...> = true>
constexpr
tuple(_UElements&&... __elements)
There are two semantic changes as a result of the refactoring:
- The allocator-extended default constructor is now constrained.
- The rewritten constraints fix PR 90700.
* include/std/tuple (_TC): Replace with _TupleConstraints.
(_TupleConstraints): New helper for SFINAE constraints, with more
expressive member functions to reduce duplication when used.
(tuple::_TC2, tuple::_TMC, tuple::_TNTC): Remove.
(tuple::_TCC): Replace dummy type parameter with bool non-type
parameter that can be used to check the pack size.
(tuple::_ImplicitDefaultCtor, tuple::_ExplicitDefaultCtor)
(tuple::_ImplicitCtor, tuple::_ExplicitCtor): New alias templates for
checking constraints in constructors.
(tuple::__valid_args, tuple::_UseOtherCtor, tuple::__use_other_ctor):
New SFINAE helpers.
(tuple::tuple): Use new helpers to reduce repitition in constraints.
(tuple::tuple(allocator_arg_t, const Alloc&)): Constrain.
(tuple<T1, T2>::_TCC, tuple<T1, T2>::_ImplicitDefaultCtor)
(tuple<T1, T2>::_ExplicitDefaultCtor, tuple<T1, T2>::_ImplicitCtor)
(tuple<T1, T2>::_ExplicitCtor): New alias templates for checking
constraints in constructors.
(tuple::__is_alloc_arg()): New SFINAE helpers.
(tuple<T1, T2>::tuple): Use new helpers to reduce repitition in
constraints.
(tuple<T1, T2>::tuple(allocator_arg_t, const Alloc&)): Constrain.
* testsuite/20_util/tuple/cons/90700.cc: New test.
* testsuite/20_util/tuple/cons/allocators.cc: Add default constructor
to meet new constraint on allocator-extended default constructor.
From-SVN: r271998
2019-06-06 14:13:36 +02:00
|
|
|
template<typename _Alloc, typename _U1, typename _U2,
|
|
|
|
_ExplicitCtor<true, _U1, _U2> = false>
|
|
|
|
explicit
|
|
|
|
tuple(allocator_arg_t __tag, const _Alloc& __a,
|
|
|
|
_U1&& __a1, _U2&& __a2)
|
Implement N4387, "Improving pair and tuple", and LWG 2367.
2015-06-30 Ville Voutilainen <ville.voutilainen@gmail.com>
Implement N4387, "Improving pair and tuple", and LWG 2367.
* include/bits/stl_pair.h (_ConstructiblePair,
_ImplicitlyConvertiblePair, _MoveConstructiblePair,
_ImplicitlyMoveConvertiblePair): New.
(pair()): Constrain it.
(pair(const _T1&, const _T2&), pair(const pair<_U1, _U2>&),
pair(_U1&&, const _T2&), pair(const _T1&, _U2&&), pair(_U1&&, _U2&&),
pair(pair<_U1, _U2>&&)): Make conditionally explicit.
* include/std/tuple (_TC, tuple::_TC2, tuple::TCC, tuple::TMC): New.
(tuple()): Constrain it.
(tuple(const _UElements&...), tuple(_UElements&&...),
tuple(const tuple<_UElements...>&), tuple(tuple<_UElements...>&&),
tuple(allocator_arg_t, const _Alloc&, const _UElements&...),
tuple(allocator_arg_t, const _Alloc&, _UElements&&...),
tuple(allocator_arg_t, const _Alloc&, const tuple<_UElements...>&),
tuple(allocator_arg_t, const _Alloc&, tuple<_UElements...>&&),
tuple(const pair<_U1, _U2>&), tuple(pair<_U1, _U2>&&),
tuple(allocator_arg_t, const _Alloc&, const pair<_U1, _U2>&),
tuple(allocator_arg_t, const _Alloc&, pair<_U1, _U2>&&)): Make
conditionally explicit.
* include/experimental/functional (__boyer_moore_array_base): Name
array type explicitly instead of using an empty braced-init-list.
* testsuite/20_util/pair/cons/explicit_construct.cc: New.
* testsuite/20_util/pair/piecewise.cc: Use piecewise_construct.
* testsuite/20_util/pair/requirements/dr2367.cc: New.
* testsuite/20_util/tuple/cons/explicit_construct.cc: New.
* testsuite/20_util/tuple/requirements/dr2367.cc: New.
From-SVN: r225189
2015-06-30 15:26:49 +02:00
|
|
|
: _Inherited(__tag, __a, std::forward<_U1>(__a1),
|
|
|
|
std::forward<_U2>(__a2)) { }
|
|
|
|
|
2011-05-30 18:31:17 +02:00
|
|
|
template<typename _Alloc>
|
|
|
|
tuple(allocator_arg_t __tag, const _Alloc& __a, const tuple& __in)
|
|
|
|
: _Inherited(__tag, __a, static_cast<const _Inherited&>(__in)) { }
|
|
|
|
|
|
|
|
template<typename _Alloc>
|
|
|
|
tuple(allocator_arg_t __tag, const _Alloc& __a, tuple&& __in)
|
|
|
|
: _Inherited(__tag, __a, static_cast<_Inherited&&>(__in)) { }
|
|
|
|
|
Refactor SFINAE constraints on std::tuple constructors
Replace the _TC class template with the better-named _TupleConstraints
one, which provides a different set of member functions. The new members
do not distinguish construction from lvalues and rvalues, but expects
the caller to do that by providing different template arguments. Within
the std::tuple primary template and std::tuple<T1, T2> partial
specialization the _TupleConstraints members are used via new alias
templates like _ImplicitCtor and _ExplicitCtor which makes the
constructor constraints less verbose and repetitive. For example, where
we previously had:
template<typename... _UElements, typename
enable_if<
_TMC<_UElements...>::template
_MoveConstructibleTuple<_UElements...>()
&& _TMC<_UElements...>::template
_ImplicitlyMoveConvertibleTuple<_UElements...>()
&& (sizeof...(_Elements) >= 1),
bool>::type=true>
constexpr tuple(_UElements&&... __elements)
We now have:
template<typename... _UElements,
bool _Valid = __valid_args<_UElements...>(),
_ImplicitCtor<_Valid, _UElements...> = true>
constexpr
tuple(_UElements&&... __elements)
There are two semantic changes as a result of the refactoring:
- The allocator-extended default constructor is now constrained.
- The rewritten constraints fix PR 90700.
* include/std/tuple (_TC): Replace with _TupleConstraints.
(_TupleConstraints): New helper for SFINAE constraints, with more
expressive member functions to reduce duplication when used.
(tuple::_TC2, tuple::_TMC, tuple::_TNTC): Remove.
(tuple::_TCC): Replace dummy type parameter with bool non-type
parameter that can be used to check the pack size.
(tuple::_ImplicitDefaultCtor, tuple::_ExplicitDefaultCtor)
(tuple::_ImplicitCtor, tuple::_ExplicitCtor): New alias templates for
checking constraints in constructors.
(tuple::__valid_args, tuple::_UseOtherCtor, tuple::__use_other_ctor):
New SFINAE helpers.
(tuple::tuple): Use new helpers to reduce repitition in constraints.
(tuple::tuple(allocator_arg_t, const Alloc&)): Constrain.
(tuple<T1, T2>::_TCC, tuple<T1, T2>::_ImplicitDefaultCtor)
(tuple<T1, T2>::_ExplicitDefaultCtor, tuple<T1, T2>::_ImplicitCtor)
(tuple<T1, T2>::_ExplicitCtor): New alias templates for checking
constraints in constructors.
(tuple::__is_alloc_arg()): New SFINAE helpers.
(tuple<T1, T2>::tuple): Use new helpers to reduce repitition in
constraints.
(tuple<T1, T2>::tuple(allocator_arg_t, const Alloc&)): Constrain.
* testsuite/20_util/tuple/cons/90700.cc: New test.
* testsuite/20_util/tuple/cons/allocators.cc: Add default constructor
to meet new constraint on allocator-extended default constructor.
From-SVN: r271998
2019-06-06 14:13:36 +02:00
|
|
|
template<typename _Alloc, typename _U1, typename _U2,
|
|
|
|
_ImplicitCtor<true, const _U1&, const _U2&> = true>
|
2011-05-30 18:31:17 +02:00
|
|
|
tuple(allocator_arg_t __tag, const _Alloc& __a,
|
|
|
|
const tuple<_U1, _U2>& __in)
|
|
|
|
: _Inherited(__tag, __a,
|
|
|
|
static_cast<const _Tuple_impl<0, _U1, _U2>&>(__in))
|
|
|
|
{ }
|
|
|
|
|
Refactor SFINAE constraints on std::tuple constructors
Replace the _TC class template with the better-named _TupleConstraints
one, which provides a different set of member functions. The new members
do not distinguish construction from lvalues and rvalues, but expects
the caller to do that by providing different template arguments. Within
the std::tuple primary template and std::tuple<T1, T2> partial
specialization the _TupleConstraints members are used via new alias
templates like _ImplicitCtor and _ExplicitCtor which makes the
constructor constraints less verbose and repetitive. For example, where
we previously had:
template<typename... _UElements, typename
enable_if<
_TMC<_UElements...>::template
_MoveConstructibleTuple<_UElements...>()
&& _TMC<_UElements...>::template
_ImplicitlyMoveConvertibleTuple<_UElements...>()
&& (sizeof...(_Elements) >= 1),
bool>::type=true>
constexpr tuple(_UElements&&... __elements)
We now have:
template<typename... _UElements,
bool _Valid = __valid_args<_UElements...>(),
_ImplicitCtor<_Valid, _UElements...> = true>
constexpr
tuple(_UElements&&... __elements)
There are two semantic changes as a result of the refactoring:
- The allocator-extended default constructor is now constrained.
- The rewritten constraints fix PR 90700.
* include/std/tuple (_TC): Replace with _TupleConstraints.
(_TupleConstraints): New helper for SFINAE constraints, with more
expressive member functions to reduce duplication when used.
(tuple::_TC2, tuple::_TMC, tuple::_TNTC): Remove.
(tuple::_TCC): Replace dummy type parameter with bool non-type
parameter that can be used to check the pack size.
(tuple::_ImplicitDefaultCtor, tuple::_ExplicitDefaultCtor)
(tuple::_ImplicitCtor, tuple::_ExplicitCtor): New alias templates for
checking constraints in constructors.
(tuple::__valid_args, tuple::_UseOtherCtor, tuple::__use_other_ctor):
New SFINAE helpers.
(tuple::tuple): Use new helpers to reduce repitition in constraints.
(tuple::tuple(allocator_arg_t, const Alloc&)): Constrain.
(tuple<T1, T2>::_TCC, tuple<T1, T2>::_ImplicitDefaultCtor)
(tuple<T1, T2>::_ExplicitDefaultCtor, tuple<T1, T2>::_ImplicitCtor)
(tuple<T1, T2>::_ExplicitCtor): New alias templates for checking
constraints in constructors.
(tuple::__is_alloc_arg()): New SFINAE helpers.
(tuple<T1, T2>::tuple): Use new helpers to reduce repitition in
constraints.
(tuple<T1, T2>::tuple(allocator_arg_t, const Alloc&)): Constrain.
* testsuite/20_util/tuple/cons/90700.cc: New test.
* testsuite/20_util/tuple/cons/allocators.cc: Add default constructor
to meet new constraint on allocator-extended default constructor.
From-SVN: r271998
2019-06-06 14:13:36 +02:00
|
|
|
template<typename _Alloc, typename _U1, typename _U2,
|
|
|
|
_ExplicitCtor<true, const _U1&, const _U2&> = false>
|
|
|
|
explicit
|
|
|
|
tuple(allocator_arg_t __tag, const _Alloc& __a,
|
Implement N4387, "Improving pair and tuple", and LWG 2367.
2015-06-30 Ville Voutilainen <ville.voutilainen@gmail.com>
Implement N4387, "Improving pair and tuple", and LWG 2367.
* include/bits/stl_pair.h (_ConstructiblePair,
_ImplicitlyConvertiblePair, _MoveConstructiblePair,
_ImplicitlyMoveConvertiblePair): New.
(pair()): Constrain it.
(pair(const _T1&, const _T2&), pair(const pair<_U1, _U2>&),
pair(_U1&&, const _T2&), pair(const _T1&, _U2&&), pair(_U1&&, _U2&&),
pair(pair<_U1, _U2>&&)): Make conditionally explicit.
* include/std/tuple (_TC, tuple::_TC2, tuple::TCC, tuple::TMC): New.
(tuple()): Constrain it.
(tuple(const _UElements&...), tuple(_UElements&&...),
tuple(const tuple<_UElements...>&), tuple(tuple<_UElements...>&&),
tuple(allocator_arg_t, const _Alloc&, const _UElements&...),
tuple(allocator_arg_t, const _Alloc&, _UElements&&...),
tuple(allocator_arg_t, const _Alloc&, const tuple<_UElements...>&),
tuple(allocator_arg_t, const _Alloc&, tuple<_UElements...>&&),
tuple(const pair<_U1, _U2>&), tuple(pair<_U1, _U2>&&),
tuple(allocator_arg_t, const _Alloc&, const pair<_U1, _U2>&),
tuple(allocator_arg_t, const _Alloc&, pair<_U1, _U2>&&)): Make
conditionally explicit.
* include/experimental/functional (__boyer_moore_array_base): Name
array type explicitly instead of using an empty braced-init-list.
* testsuite/20_util/pair/cons/explicit_construct.cc: New.
* testsuite/20_util/pair/piecewise.cc: Use piecewise_construct.
* testsuite/20_util/pair/requirements/dr2367.cc: New.
* testsuite/20_util/tuple/cons/explicit_construct.cc: New.
* testsuite/20_util/tuple/requirements/dr2367.cc: New.
From-SVN: r225189
2015-06-30 15:26:49 +02:00
|
|
|
const tuple<_U1, _U2>& __in)
|
|
|
|
: _Inherited(__tag, __a,
|
|
|
|
static_cast<const _Tuple_impl<0, _U1, _U2>&>(__in))
|
|
|
|
{ }
|
|
|
|
|
Refactor SFINAE constraints on std::tuple constructors
Replace the _TC class template with the better-named _TupleConstraints
one, which provides a different set of member functions. The new members
do not distinguish construction from lvalues and rvalues, but expects
the caller to do that by providing different template arguments. Within
the std::tuple primary template and std::tuple<T1, T2> partial
specialization the _TupleConstraints members are used via new alias
templates like _ImplicitCtor and _ExplicitCtor which makes the
constructor constraints less verbose and repetitive. For example, where
we previously had:
template<typename... _UElements, typename
enable_if<
_TMC<_UElements...>::template
_MoveConstructibleTuple<_UElements...>()
&& _TMC<_UElements...>::template
_ImplicitlyMoveConvertibleTuple<_UElements...>()
&& (sizeof...(_Elements) >= 1),
bool>::type=true>
constexpr tuple(_UElements&&... __elements)
We now have:
template<typename... _UElements,
bool _Valid = __valid_args<_UElements...>(),
_ImplicitCtor<_Valid, _UElements...> = true>
constexpr
tuple(_UElements&&... __elements)
There are two semantic changes as a result of the refactoring:
- The allocator-extended default constructor is now constrained.
- The rewritten constraints fix PR 90700.
* include/std/tuple (_TC): Replace with _TupleConstraints.
(_TupleConstraints): New helper for SFINAE constraints, with more
expressive member functions to reduce duplication when used.
(tuple::_TC2, tuple::_TMC, tuple::_TNTC): Remove.
(tuple::_TCC): Replace dummy type parameter with bool non-type
parameter that can be used to check the pack size.
(tuple::_ImplicitDefaultCtor, tuple::_ExplicitDefaultCtor)
(tuple::_ImplicitCtor, tuple::_ExplicitCtor): New alias templates for
checking constraints in constructors.
(tuple::__valid_args, tuple::_UseOtherCtor, tuple::__use_other_ctor):
New SFINAE helpers.
(tuple::tuple): Use new helpers to reduce repitition in constraints.
(tuple::tuple(allocator_arg_t, const Alloc&)): Constrain.
(tuple<T1, T2>::_TCC, tuple<T1, T2>::_ImplicitDefaultCtor)
(tuple<T1, T2>::_ExplicitDefaultCtor, tuple<T1, T2>::_ImplicitCtor)
(tuple<T1, T2>::_ExplicitCtor): New alias templates for checking
constraints in constructors.
(tuple::__is_alloc_arg()): New SFINAE helpers.
(tuple<T1, T2>::tuple): Use new helpers to reduce repitition in
constraints.
(tuple<T1, T2>::tuple(allocator_arg_t, const Alloc&)): Constrain.
* testsuite/20_util/tuple/cons/90700.cc: New test.
* testsuite/20_util/tuple/cons/allocators.cc: Add default constructor
to meet new constraint on allocator-extended default constructor.
From-SVN: r271998
2019-06-06 14:13:36 +02:00
|
|
|
template<typename _Alloc, typename _U1, typename _U2,
|
|
|
|
_ImplicitCtor<true, _U1, _U2> = true>
|
2011-05-30 18:31:17 +02:00
|
|
|
tuple(allocator_arg_t __tag, const _Alloc& __a, tuple<_U1, _U2>&& __in)
|
|
|
|
: _Inherited(__tag, __a, static_cast<_Tuple_impl<0, _U1, _U2>&&>(__in))
|
|
|
|
{ }
|
|
|
|
|
Refactor SFINAE constraints on std::tuple constructors
Replace the _TC class template with the better-named _TupleConstraints
one, which provides a different set of member functions. The new members
do not distinguish construction from lvalues and rvalues, but expects
the caller to do that by providing different template arguments. Within
the std::tuple primary template and std::tuple<T1, T2> partial
specialization the _TupleConstraints members are used via new alias
templates like _ImplicitCtor and _ExplicitCtor which makes the
constructor constraints less verbose and repetitive. For example, where
we previously had:
template<typename... _UElements, typename
enable_if<
_TMC<_UElements...>::template
_MoveConstructibleTuple<_UElements...>()
&& _TMC<_UElements...>::template
_ImplicitlyMoveConvertibleTuple<_UElements...>()
&& (sizeof...(_Elements) >= 1),
bool>::type=true>
constexpr tuple(_UElements&&... __elements)
We now have:
template<typename... _UElements,
bool _Valid = __valid_args<_UElements...>(),
_ImplicitCtor<_Valid, _UElements...> = true>
constexpr
tuple(_UElements&&... __elements)
There are two semantic changes as a result of the refactoring:
- The allocator-extended default constructor is now constrained.
- The rewritten constraints fix PR 90700.
* include/std/tuple (_TC): Replace with _TupleConstraints.
(_TupleConstraints): New helper for SFINAE constraints, with more
expressive member functions to reduce duplication when used.
(tuple::_TC2, tuple::_TMC, tuple::_TNTC): Remove.
(tuple::_TCC): Replace dummy type parameter with bool non-type
parameter that can be used to check the pack size.
(tuple::_ImplicitDefaultCtor, tuple::_ExplicitDefaultCtor)
(tuple::_ImplicitCtor, tuple::_ExplicitCtor): New alias templates for
checking constraints in constructors.
(tuple::__valid_args, tuple::_UseOtherCtor, tuple::__use_other_ctor):
New SFINAE helpers.
(tuple::tuple): Use new helpers to reduce repitition in constraints.
(tuple::tuple(allocator_arg_t, const Alloc&)): Constrain.
(tuple<T1, T2>::_TCC, tuple<T1, T2>::_ImplicitDefaultCtor)
(tuple<T1, T2>::_ExplicitDefaultCtor, tuple<T1, T2>::_ImplicitCtor)
(tuple<T1, T2>::_ExplicitCtor): New alias templates for checking
constraints in constructors.
(tuple::__is_alloc_arg()): New SFINAE helpers.
(tuple<T1, T2>::tuple): Use new helpers to reduce repitition in
constraints.
(tuple<T1, T2>::tuple(allocator_arg_t, const Alloc&)): Constrain.
* testsuite/20_util/tuple/cons/90700.cc: New test.
* testsuite/20_util/tuple/cons/allocators.cc: Add default constructor
to meet new constraint on allocator-extended default constructor.
From-SVN: r271998
2019-06-06 14:13:36 +02:00
|
|
|
template<typename _Alloc, typename _U1, typename _U2,
|
|
|
|
_ExplicitCtor<true, _U1, _U2> = false>
|
|
|
|
explicit
|
|
|
|
tuple(allocator_arg_t __tag, const _Alloc& __a, tuple<_U1, _U2>&& __in)
|
Implement N4387, "Improving pair and tuple", and LWG 2367.
2015-06-30 Ville Voutilainen <ville.voutilainen@gmail.com>
Implement N4387, "Improving pair and tuple", and LWG 2367.
* include/bits/stl_pair.h (_ConstructiblePair,
_ImplicitlyConvertiblePair, _MoveConstructiblePair,
_ImplicitlyMoveConvertiblePair): New.
(pair()): Constrain it.
(pair(const _T1&, const _T2&), pair(const pair<_U1, _U2>&),
pair(_U1&&, const _T2&), pair(const _T1&, _U2&&), pair(_U1&&, _U2&&),
pair(pair<_U1, _U2>&&)): Make conditionally explicit.
* include/std/tuple (_TC, tuple::_TC2, tuple::TCC, tuple::TMC): New.
(tuple()): Constrain it.
(tuple(const _UElements&...), tuple(_UElements&&...),
tuple(const tuple<_UElements...>&), tuple(tuple<_UElements...>&&),
tuple(allocator_arg_t, const _Alloc&, const _UElements&...),
tuple(allocator_arg_t, const _Alloc&, _UElements&&...),
tuple(allocator_arg_t, const _Alloc&, const tuple<_UElements...>&),
tuple(allocator_arg_t, const _Alloc&, tuple<_UElements...>&&),
tuple(const pair<_U1, _U2>&), tuple(pair<_U1, _U2>&&),
tuple(allocator_arg_t, const _Alloc&, const pair<_U1, _U2>&),
tuple(allocator_arg_t, const _Alloc&, pair<_U1, _U2>&&)): Make
conditionally explicit.
* include/experimental/functional (__boyer_moore_array_base): Name
array type explicitly instead of using an empty braced-init-list.
* testsuite/20_util/pair/cons/explicit_construct.cc: New.
* testsuite/20_util/pair/piecewise.cc: Use piecewise_construct.
* testsuite/20_util/pair/requirements/dr2367.cc: New.
* testsuite/20_util/tuple/cons/explicit_construct.cc: New.
* testsuite/20_util/tuple/requirements/dr2367.cc: New.
From-SVN: r225189
2015-06-30 15:26:49 +02:00
|
|
|
: _Inherited(__tag, __a, static_cast<_Tuple_impl<0, _U1, _U2>&&>(__in))
|
|
|
|
{ }
|
|
|
|
|
Refactor SFINAE constraints on std::tuple constructors
Replace the _TC class template with the better-named _TupleConstraints
one, which provides a different set of member functions. The new members
do not distinguish construction from lvalues and rvalues, but expects
the caller to do that by providing different template arguments. Within
the std::tuple primary template and std::tuple<T1, T2> partial
specialization the _TupleConstraints members are used via new alias
templates like _ImplicitCtor and _ExplicitCtor which makes the
constructor constraints less verbose and repetitive. For example, where
we previously had:
template<typename... _UElements, typename
enable_if<
_TMC<_UElements...>::template
_MoveConstructibleTuple<_UElements...>()
&& _TMC<_UElements...>::template
_ImplicitlyMoveConvertibleTuple<_UElements...>()
&& (sizeof...(_Elements) >= 1),
bool>::type=true>
constexpr tuple(_UElements&&... __elements)
We now have:
template<typename... _UElements,
bool _Valid = __valid_args<_UElements...>(),
_ImplicitCtor<_Valid, _UElements...> = true>
constexpr
tuple(_UElements&&... __elements)
There are two semantic changes as a result of the refactoring:
- The allocator-extended default constructor is now constrained.
- The rewritten constraints fix PR 90700.
* include/std/tuple (_TC): Replace with _TupleConstraints.
(_TupleConstraints): New helper for SFINAE constraints, with more
expressive member functions to reduce duplication when used.
(tuple::_TC2, tuple::_TMC, tuple::_TNTC): Remove.
(tuple::_TCC): Replace dummy type parameter with bool non-type
parameter that can be used to check the pack size.
(tuple::_ImplicitDefaultCtor, tuple::_ExplicitDefaultCtor)
(tuple::_ImplicitCtor, tuple::_ExplicitCtor): New alias templates for
checking constraints in constructors.
(tuple::__valid_args, tuple::_UseOtherCtor, tuple::__use_other_ctor):
New SFINAE helpers.
(tuple::tuple): Use new helpers to reduce repitition in constraints.
(tuple::tuple(allocator_arg_t, const Alloc&)): Constrain.
(tuple<T1, T2>::_TCC, tuple<T1, T2>::_ImplicitDefaultCtor)
(tuple<T1, T2>::_ExplicitDefaultCtor, tuple<T1, T2>::_ImplicitCtor)
(tuple<T1, T2>::_ExplicitCtor): New alias templates for checking
constraints in constructors.
(tuple::__is_alloc_arg()): New SFINAE helpers.
(tuple<T1, T2>::tuple): Use new helpers to reduce repitition in
constraints.
(tuple<T1, T2>::tuple(allocator_arg_t, const Alloc&)): Constrain.
* testsuite/20_util/tuple/cons/90700.cc: New test.
* testsuite/20_util/tuple/cons/allocators.cc: Add default constructor
to meet new constraint on allocator-extended default constructor.
From-SVN: r271998
2019-06-06 14:13:36 +02:00
|
|
|
template<typename _Alloc, typename _U1, typename _U2,
|
|
|
|
_ImplicitCtor<true, const _U1&, const _U2&> = true>
|
|
|
|
tuple(allocator_arg_t __tag, const _Alloc& __a,
|
2011-05-30 18:31:17 +02:00
|
|
|
const pair<_U1, _U2>& __in)
|
|
|
|
: _Inherited(__tag, __a, __in.first, __in.second) { }
|
|
|
|
|
Refactor SFINAE constraints on std::tuple constructors
Replace the _TC class template with the better-named _TupleConstraints
one, which provides a different set of member functions. The new members
do not distinguish construction from lvalues and rvalues, but expects
the caller to do that by providing different template arguments. Within
the std::tuple primary template and std::tuple<T1, T2> partial
specialization the _TupleConstraints members are used via new alias
templates like _ImplicitCtor and _ExplicitCtor which makes the
constructor constraints less verbose and repetitive. For example, where
we previously had:
template<typename... _UElements, typename
enable_if<
_TMC<_UElements...>::template
_MoveConstructibleTuple<_UElements...>()
&& _TMC<_UElements...>::template
_ImplicitlyMoveConvertibleTuple<_UElements...>()
&& (sizeof...(_Elements) >= 1),
bool>::type=true>
constexpr tuple(_UElements&&... __elements)
We now have:
template<typename... _UElements,
bool _Valid = __valid_args<_UElements...>(),
_ImplicitCtor<_Valid, _UElements...> = true>
constexpr
tuple(_UElements&&... __elements)
There are two semantic changes as a result of the refactoring:
- The allocator-extended default constructor is now constrained.
- The rewritten constraints fix PR 90700.
* include/std/tuple (_TC): Replace with _TupleConstraints.
(_TupleConstraints): New helper for SFINAE constraints, with more
expressive member functions to reduce duplication when used.
(tuple::_TC2, tuple::_TMC, tuple::_TNTC): Remove.
(tuple::_TCC): Replace dummy type parameter with bool non-type
parameter that can be used to check the pack size.
(tuple::_ImplicitDefaultCtor, tuple::_ExplicitDefaultCtor)
(tuple::_ImplicitCtor, tuple::_ExplicitCtor): New alias templates for
checking constraints in constructors.
(tuple::__valid_args, tuple::_UseOtherCtor, tuple::__use_other_ctor):
New SFINAE helpers.
(tuple::tuple): Use new helpers to reduce repitition in constraints.
(tuple::tuple(allocator_arg_t, const Alloc&)): Constrain.
(tuple<T1, T2>::_TCC, tuple<T1, T2>::_ImplicitDefaultCtor)
(tuple<T1, T2>::_ExplicitDefaultCtor, tuple<T1, T2>::_ImplicitCtor)
(tuple<T1, T2>::_ExplicitCtor): New alias templates for checking
constraints in constructors.
(tuple::__is_alloc_arg()): New SFINAE helpers.
(tuple<T1, T2>::tuple): Use new helpers to reduce repitition in
constraints.
(tuple<T1, T2>::tuple(allocator_arg_t, const Alloc&)): Constrain.
* testsuite/20_util/tuple/cons/90700.cc: New test.
* testsuite/20_util/tuple/cons/allocators.cc: Add default constructor
to meet new constraint on allocator-extended default constructor.
From-SVN: r271998
2019-06-06 14:13:36 +02:00
|
|
|
template<typename _Alloc, typename _U1, typename _U2,
|
|
|
|
_ExplicitCtor<true, const _U1&, const _U2&> = false>
|
|
|
|
explicit
|
|
|
|
tuple(allocator_arg_t __tag, const _Alloc& __a,
|
Implement N4387, "Improving pair and tuple", and LWG 2367.
2015-06-30 Ville Voutilainen <ville.voutilainen@gmail.com>
Implement N4387, "Improving pair and tuple", and LWG 2367.
* include/bits/stl_pair.h (_ConstructiblePair,
_ImplicitlyConvertiblePair, _MoveConstructiblePair,
_ImplicitlyMoveConvertiblePair): New.
(pair()): Constrain it.
(pair(const _T1&, const _T2&), pair(const pair<_U1, _U2>&),
pair(_U1&&, const _T2&), pair(const _T1&, _U2&&), pair(_U1&&, _U2&&),
pair(pair<_U1, _U2>&&)): Make conditionally explicit.
* include/std/tuple (_TC, tuple::_TC2, tuple::TCC, tuple::TMC): New.
(tuple()): Constrain it.
(tuple(const _UElements&...), tuple(_UElements&&...),
tuple(const tuple<_UElements...>&), tuple(tuple<_UElements...>&&),
tuple(allocator_arg_t, const _Alloc&, const _UElements&...),
tuple(allocator_arg_t, const _Alloc&, _UElements&&...),
tuple(allocator_arg_t, const _Alloc&, const tuple<_UElements...>&),
tuple(allocator_arg_t, const _Alloc&, tuple<_UElements...>&&),
tuple(const pair<_U1, _U2>&), tuple(pair<_U1, _U2>&&),
tuple(allocator_arg_t, const _Alloc&, const pair<_U1, _U2>&),
tuple(allocator_arg_t, const _Alloc&, pair<_U1, _U2>&&)): Make
conditionally explicit.
* include/experimental/functional (__boyer_moore_array_base): Name
array type explicitly instead of using an empty braced-init-list.
* testsuite/20_util/pair/cons/explicit_construct.cc: New.
* testsuite/20_util/pair/piecewise.cc: Use piecewise_construct.
* testsuite/20_util/pair/requirements/dr2367.cc: New.
* testsuite/20_util/tuple/cons/explicit_construct.cc: New.
* testsuite/20_util/tuple/requirements/dr2367.cc: New.
From-SVN: r225189
2015-06-30 15:26:49 +02:00
|
|
|
const pair<_U1, _U2>& __in)
|
|
|
|
: _Inherited(__tag, __a, __in.first, __in.second) { }
|
|
|
|
|
Refactor SFINAE constraints on std::tuple constructors
Replace the _TC class template with the better-named _TupleConstraints
one, which provides a different set of member functions. The new members
do not distinguish construction from lvalues and rvalues, but expects
the caller to do that by providing different template arguments. Within
the std::tuple primary template and std::tuple<T1, T2> partial
specialization the _TupleConstraints members are used via new alias
templates like _ImplicitCtor and _ExplicitCtor which makes the
constructor constraints less verbose and repetitive. For example, where
we previously had:
template<typename... _UElements, typename
enable_if<
_TMC<_UElements...>::template
_MoveConstructibleTuple<_UElements...>()
&& _TMC<_UElements...>::template
_ImplicitlyMoveConvertibleTuple<_UElements...>()
&& (sizeof...(_Elements) >= 1),
bool>::type=true>
constexpr tuple(_UElements&&... __elements)
We now have:
template<typename... _UElements,
bool _Valid = __valid_args<_UElements...>(),
_ImplicitCtor<_Valid, _UElements...> = true>
constexpr
tuple(_UElements&&... __elements)
There are two semantic changes as a result of the refactoring:
- The allocator-extended default constructor is now constrained.
- The rewritten constraints fix PR 90700.
* include/std/tuple (_TC): Replace with _TupleConstraints.
(_TupleConstraints): New helper for SFINAE constraints, with more
expressive member functions to reduce duplication when used.
(tuple::_TC2, tuple::_TMC, tuple::_TNTC): Remove.
(tuple::_TCC): Replace dummy type parameter with bool non-type
parameter that can be used to check the pack size.
(tuple::_ImplicitDefaultCtor, tuple::_ExplicitDefaultCtor)
(tuple::_ImplicitCtor, tuple::_ExplicitCtor): New alias templates for
checking constraints in constructors.
(tuple::__valid_args, tuple::_UseOtherCtor, tuple::__use_other_ctor):
New SFINAE helpers.
(tuple::tuple): Use new helpers to reduce repitition in constraints.
(tuple::tuple(allocator_arg_t, const Alloc&)): Constrain.
(tuple<T1, T2>::_TCC, tuple<T1, T2>::_ImplicitDefaultCtor)
(tuple<T1, T2>::_ExplicitDefaultCtor, tuple<T1, T2>::_ImplicitCtor)
(tuple<T1, T2>::_ExplicitCtor): New alias templates for checking
constraints in constructors.
(tuple::__is_alloc_arg()): New SFINAE helpers.
(tuple<T1, T2>::tuple): Use new helpers to reduce repitition in
constraints.
(tuple<T1, T2>::tuple(allocator_arg_t, const Alloc&)): Constrain.
* testsuite/20_util/tuple/cons/90700.cc: New test.
* testsuite/20_util/tuple/cons/allocators.cc: Add default constructor
to meet new constraint on allocator-extended default constructor.
From-SVN: r271998
2019-06-06 14:13:36 +02:00
|
|
|
template<typename _Alloc, typename _U1, typename _U2,
|
|
|
|
_ImplicitCtor<true, _U1, _U2> = true>
|
|
|
|
tuple(allocator_arg_t __tag, const _Alloc& __a, pair<_U1, _U2>&& __in)
|
2011-05-30 18:31:17 +02:00
|
|
|
: _Inherited(__tag, __a, std::forward<_U1>(__in.first),
|
|
|
|
std::forward<_U2>(__in.second)) { }
|
|
|
|
|
Refactor SFINAE constraints on std::tuple constructors
Replace the _TC class template with the better-named _TupleConstraints
one, which provides a different set of member functions. The new members
do not distinguish construction from lvalues and rvalues, but expects
the caller to do that by providing different template arguments. Within
the std::tuple primary template and std::tuple<T1, T2> partial
specialization the _TupleConstraints members are used via new alias
templates like _ImplicitCtor and _ExplicitCtor which makes the
constructor constraints less verbose and repetitive. For example, where
we previously had:
template<typename... _UElements, typename
enable_if<
_TMC<_UElements...>::template
_MoveConstructibleTuple<_UElements...>()
&& _TMC<_UElements...>::template
_ImplicitlyMoveConvertibleTuple<_UElements...>()
&& (sizeof...(_Elements) >= 1),
bool>::type=true>
constexpr tuple(_UElements&&... __elements)
We now have:
template<typename... _UElements,
bool _Valid = __valid_args<_UElements...>(),
_ImplicitCtor<_Valid, _UElements...> = true>
constexpr
tuple(_UElements&&... __elements)
There are two semantic changes as a result of the refactoring:
- The allocator-extended default constructor is now constrained.
- The rewritten constraints fix PR 90700.
* include/std/tuple (_TC): Replace with _TupleConstraints.
(_TupleConstraints): New helper for SFINAE constraints, with more
expressive member functions to reduce duplication when used.
(tuple::_TC2, tuple::_TMC, tuple::_TNTC): Remove.
(tuple::_TCC): Replace dummy type parameter with bool non-type
parameter that can be used to check the pack size.
(tuple::_ImplicitDefaultCtor, tuple::_ExplicitDefaultCtor)
(tuple::_ImplicitCtor, tuple::_ExplicitCtor): New alias templates for
checking constraints in constructors.
(tuple::__valid_args, tuple::_UseOtherCtor, tuple::__use_other_ctor):
New SFINAE helpers.
(tuple::tuple): Use new helpers to reduce repitition in constraints.
(tuple::tuple(allocator_arg_t, const Alloc&)): Constrain.
(tuple<T1, T2>::_TCC, tuple<T1, T2>::_ImplicitDefaultCtor)
(tuple<T1, T2>::_ExplicitDefaultCtor, tuple<T1, T2>::_ImplicitCtor)
(tuple<T1, T2>::_ExplicitCtor): New alias templates for checking
constraints in constructors.
(tuple::__is_alloc_arg()): New SFINAE helpers.
(tuple<T1, T2>::tuple): Use new helpers to reduce repitition in
constraints.
(tuple<T1, T2>::tuple(allocator_arg_t, const Alloc&)): Constrain.
* testsuite/20_util/tuple/cons/90700.cc: New test.
* testsuite/20_util/tuple/cons/allocators.cc: Add default constructor
to meet new constraint on allocator-extended default constructor.
From-SVN: r271998
2019-06-06 14:13:36 +02:00
|
|
|
template<typename _Alloc, typename _U1, typename _U2,
|
|
|
|
_ExplicitCtor<true, _U1, _U2> = false>
|
|
|
|
explicit
|
|
|
|
tuple(allocator_arg_t __tag, const _Alloc& __a, pair<_U1, _U2>&& __in)
|
Implement N4387, "Improving pair and tuple", and LWG 2367.
2015-06-30 Ville Voutilainen <ville.voutilainen@gmail.com>
Implement N4387, "Improving pair and tuple", and LWG 2367.
* include/bits/stl_pair.h (_ConstructiblePair,
_ImplicitlyConvertiblePair, _MoveConstructiblePair,
_ImplicitlyMoveConvertiblePair): New.
(pair()): Constrain it.
(pair(const _T1&, const _T2&), pair(const pair<_U1, _U2>&),
pair(_U1&&, const _T2&), pair(const _T1&, _U2&&), pair(_U1&&, _U2&&),
pair(pair<_U1, _U2>&&)): Make conditionally explicit.
* include/std/tuple (_TC, tuple::_TC2, tuple::TCC, tuple::TMC): New.
(tuple()): Constrain it.
(tuple(const _UElements&...), tuple(_UElements&&...),
tuple(const tuple<_UElements...>&), tuple(tuple<_UElements...>&&),
tuple(allocator_arg_t, const _Alloc&, const _UElements&...),
tuple(allocator_arg_t, const _Alloc&, _UElements&&...),
tuple(allocator_arg_t, const _Alloc&, const tuple<_UElements...>&),
tuple(allocator_arg_t, const _Alloc&, tuple<_UElements...>&&),
tuple(const pair<_U1, _U2>&), tuple(pair<_U1, _U2>&&),
tuple(allocator_arg_t, const _Alloc&, const pair<_U1, _U2>&),
tuple(allocator_arg_t, const _Alloc&, pair<_U1, _U2>&&)): Make
conditionally explicit.
* include/experimental/functional (__boyer_moore_array_base): Name
array type explicitly instead of using an empty braced-init-list.
* testsuite/20_util/pair/cons/explicit_construct.cc: New.
* testsuite/20_util/pair/piecewise.cc: Use piecewise_construct.
* testsuite/20_util/pair/requirements/dr2367.cc: New.
* testsuite/20_util/tuple/cons/explicit_construct.cc: New.
* testsuite/20_util/tuple/requirements/dr2367.cc: New.
From-SVN: r225189
2015-06-30 15:26:49 +02:00
|
|
|
: _Inherited(__tag, __a, std::forward<_U1>(__in.first),
|
|
|
|
std::forward<_U2>(__in.second)) { }
|
|
|
|
|
2007-12-26 16:23:49 +01:00
|
|
|
tuple&
|
PR libstdc++/86963 Implement LWG 2729 constraints on tuple assignment
PR libstdc++/86963
* include/std/tuple (__tuple_base): New class template with deleted
copy assignment operator.
(tuple, tuple<_T1, _T2>): Derive from __tuple_base<tuple> so that
implicit copy/move assignment operator will be deleted/suppressed.
(tuple::__assignable, tuple<_T1, _T2>::__assignable): New helper
functions for SFINAE constraints on assignment operators.
(tuple::__nothrow_assignable, tuple<_T1, _T2>::__nothrow_assignable):
New helper functions for exception specifications.
(tuple::operator=(const tuple&), tuple::operator=(tuple&&))
(tuple<_T1, _T2>::operator=(const tuple&))
(tuple<_T1, _T2>::operator=(tuple&&)): Change parameter types to
__nonesuch_no_braces when the operator should be defined implicitly.
Use __nothrow_assignable for exception specifications.
(tuple::operator=(const tuple<_UElements...>&))
(tuple::operator=(tuple<_UElements...>&&))
(tuple<_T1, _T2>::operator=(const tuple<_U1, _U2>&))
(tuple<_T1, _T2>::operator=(tuple<_U1, _U2>&&))
(tuple<_T1, _T2>::operator=(const pair<_U1, _U2>&))
(tuple<_T1, _T2>::operator=(pair<_U1, _U2>&&)): Constrain using
__assignable and use __nothrow_assignable for exception
specifications.
* python/libstdcxx/v6/printers.py (is_specialization_of): Accept
gdb.Type as first argument, instead of a string.
(StdTuplePrinter._iterator._is_nonempty_tuple): New method to check
tuple for expected structure.
(StdTuplePrinter._iterator.__init__): Use _is_nonempty_tuple.
* testsuite/20_util/tuple/dr2729.cc: New test.
* testsuite/20_util/tuple/element_access/get_neg.cc: Change dg-error
to dg-prune-output.
From-SVN: r263625
2018-08-17 19:52:49 +02:00
|
|
|
operator=(typename conditional<__assignable<const _T1&, const _T2&>(),
|
|
|
|
const tuple&,
|
2019-05-14 17:48:27 +02:00
|
|
|
const __nonesuch&>::type __in)
|
PR libstdc++/86963 Implement LWG 2729 constraints on tuple assignment
PR libstdc++/86963
* include/std/tuple (__tuple_base): New class template with deleted
copy assignment operator.
(tuple, tuple<_T1, _T2>): Derive from __tuple_base<tuple> so that
implicit copy/move assignment operator will be deleted/suppressed.
(tuple::__assignable, tuple<_T1, _T2>::__assignable): New helper
functions for SFINAE constraints on assignment operators.
(tuple::__nothrow_assignable, tuple<_T1, _T2>::__nothrow_assignable):
New helper functions for exception specifications.
(tuple::operator=(const tuple&), tuple::operator=(tuple&&))
(tuple<_T1, _T2>::operator=(const tuple&))
(tuple<_T1, _T2>::operator=(tuple&&)): Change parameter types to
__nonesuch_no_braces when the operator should be defined implicitly.
Use __nothrow_assignable for exception specifications.
(tuple::operator=(const tuple<_UElements...>&))
(tuple::operator=(tuple<_UElements...>&&))
(tuple<_T1, _T2>::operator=(const tuple<_U1, _U2>&))
(tuple<_T1, _T2>::operator=(tuple<_U1, _U2>&&))
(tuple<_T1, _T2>::operator=(const pair<_U1, _U2>&))
(tuple<_T1, _T2>::operator=(pair<_U1, _U2>&&)): Constrain using
__assignable and use __nothrow_assignable for exception
specifications.
* python/libstdcxx/v6/printers.py (is_specialization_of): Accept
gdb.Type as first argument, instead of a string.
(StdTuplePrinter._iterator._is_nonempty_tuple): New method to check
tuple for expected structure.
(StdTuplePrinter._iterator.__init__): Use _is_nonempty_tuple.
* testsuite/20_util/tuple/dr2729.cc: New test.
* testsuite/20_util/tuple/element_access/get_neg.cc: Change dg-error
to dg-prune-output.
From-SVN: r263625
2018-08-17 19:52:49 +02:00
|
|
|
noexcept(__nothrow_assignable<const _T1&, const _T2&>())
|
2007-12-26 16:23:49 +01:00
|
|
|
{
|
PR libstdc++/86963 Remove use of __tuple_base in std::tuple
The _Tuple_impl base class can be used to disable copy/move assignment,
without requiring an extra base class.
Exception specifications on std::tuple assignment and swap functions can
be defined directly using is_nothrow_swappable, instead of querying the
base classes.
PR libstdc++/86963
* include/std/tuple (_Tuple_impl::operator=): Define as deleted.
(_Tuple_impl::_M_assign): New functions to perform assignment instead
of assignment operators.
(_Tuple_impl::_M_swap): Remove exception specification.
(_Tuple_impl<_Idx, _Head>): Likewise.
(_TC::_NonNestedTuple, _TC::_NotSameTuple): Use __remove_cvref_t.
(__tuple_base): Remove.
(tuple, tuple<_T1, _T2>): Remove inheritance from __tuple_base.
(tuple::operator=, tuple<_T1, _T2>::operator=): Call _M_assign.
(tuple::swap, tuple<_T1, _T2>::swap): Define exception specification
using __is_nothrow_swappable.
(tuple<_T1, _T2>::tuple(_U1&&, _U2&&)): Use __remove_cvref_t.
From-SVN: r263661
2018-08-20 15:53:56 +02:00
|
|
|
this->_M_assign(__in);
|
2007-12-26 16:23:49 +01:00
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
tuple (_Tuple_impl<>::_Tuple_impl(typename std::remove_reference<>::type&&, typename std::remove_reference<>::type&&...), [...]): Add.
2007-12-30 Paolo Carlini <pcarlini@suse.de>
* include/std/tuple (_Tuple_impl<>::_Tuple_impl(typename
std::remove_reference<>::type&&, typename
std::remove_reference<>::type&&...),
_Tuple_impl(const _Tuple_impl<>&), _Tuple_impl(_Tuple_impl&&),
_Tuple_impl(_Tuple_impl<>&&), operator=(_Tuple_impl&&),
operator=(const _Tuple_impl<>&), operator=(_Tuple_impl<>&&)): Add.
(tuple<>::tuple(const _Elements&...), tuple(_UElements&&...),
tuple(tuple&&), tuple(const tuple<>&), tuple(tuple<>&&),
operator=(tuple&&), operator=(const tuple<>&), operator=(tuple<>&&)):
Likewise.
(tuple<_T1, _T2>::tuple(const _T1&, const _T2&, tuple(_U1&&, _U2&&),
tuple(tuple&&), tuple(tuple<>&&), tuple(pair<>&&), operator=(tuple&&),
operator=(tuple<>&&), operator=(pair<>&&)): Likewise.
(tuple<>::tuple(typename __add_c_ref<_Elements>::type...),
tuple<_T1, _T2>::tuple(typename __add_c_ref<>::type,
typename __add_c_ref<>::type)): Remove.
* testsuite/tr1/6_containers/tuple/creation_functions/tie2.cc: New.
* testsuite/20_util/tuple/creation_functions/tie2.cc: Likewise.
* testsuite/20_util/tuple/moveable.cc: Likewise.
From-SVN: r131230
2007-12-30 23:44:42 +01:00
|
|
|
tuple&
|
PR libstdc++/86963 Implement LWG 2729 constraints on tuple assignment
PR libstdc++/86963
* include/std/tuple (__tuple_base): New class template with deleted
copy assignment operator.
(tuple, tuple<_T1, _T2>): Derive from __tuple_base<tuple> so that
implicit copy/move assignment operator will be deleted/suppressed.
(tuple::__assignable, tuple<_T1, _T2>::__assignable): New helper
functions for SFINAE constraints on assignment operators.
(tuple::__nothrow_assignable, tuple<_T1, _T2>::__nothrow_assignable):
New helper functions for exception specifications.
(tuple::operator=(const tuple&), tuple::operator=(tuple&&))
(tuple<_T1, _T2>::operator=(const tuple&))
(tuple<_T1, _T2>::operator=(tuple&&)): Change parameter types to
__nonesuch_no_braces when the operator should be defined implicitly.
Use __nothrow_assignable for exception specifications.
(tuple::operator=(const tuple<_UElements...>&))
(tuple::operator=(tuple<_UElements...>&&))
(tuple<_T1, _T2>::operator=(const tuple<_U1, _U2>&))
(tuple<_T1, _T2>::operator=(tuple<_U1, _U2>&&))
(tuple<_T1, _T2>::operator=(const pair<_U1, _U2>&))
(tuple<_T1, _T2>::operator=(pair<_U1, _U2>&&)): Constrain using
__assignable and use __nothrow_assignable for exception
specifications.
* python/libstdcxx/v6/printers.py (is_specialization_of): Accept
gdb.Type as first argument, instead of a string.
(StdTuplePrinter._iterator._is_nonempty_tuple): New method to check
tuple for expected structure.
(StdTuplePrinter._iterator.__init__): Use _is_nonempty_tuple.
* testsuite/20_util/tuple/dr2729.cc: New test.
* testsuite/20_util/tuple/element_access/get_neg.cc: Change dg-error
to dg-prune-output.
From-SVN: r263625
2018-08-17 19:52:49 +02:00
|
|
|
operator=(typename conditional<__assignable<_T1, _T2>(),
|
|
|
|
tuple&&,
|
2019-05-14 17:48:27 +02:00
|
|
|
__nonesuch&&>::type __in)
|
PR libstdc++/86963 Implement LWG 2729 constraints on tuple assignment
PR libstdc++/86963
* include/std/tuple (__tuple_base): New class template with deleted
copy assignment operator.
(tuple, tuple<_T1, _T2>): Derive from __tuple_base<tuple> so that
implicit copy/move assignment operator will be deleted/suppressed.
(tuple::__assignable, tuple<_T1, _T2>::__assignable): New helper
functions for SFINAE constraints on assignment operators.
(tuple::__nothrow_assignable, tuple<_T1, _T2>::__nothrow_assignable):
New helper functions for exception specifications.
(tuple::operator=(const tuple&), tuple::operator=(tuple&&))
(tuple<_T1, _T2>::operator=(const tuple&))
(tuple<_T1, _T2>::operator=(tuple&&)): Change parameter types to
__nonesuch_no_braces when the operator should be defined implicitly.
Use __nothrow_assignable for exception specifications.
(tuple::operator=(const tuple<_UElements...>&))
(tuple::operator=(tuple<_UElements...>&&))
(tuple<_T1, _T2>::operator=(const tuple<_U1, _U2>&))
(tuple<_T1, _T2>::operator=(tuple<_U1, _U2>&&))
(tuple<_T1, _T2>::operator=(const pair<_U1, _U2>&))
(tuple<_T1, _T2>::operator=(pair<_U1, _U2>&&)): Constrain using
__assignable and use __nothrow_assignable for exception
specifications.
* python/libstdcxx/v6/printers.py (is_specialization_of): Accept
gdb.Type as first argument, instead of a string.
(StdTuplePrinter._iterator._is_nonempty_tuple): New method to check
tuple for expected structure.
(StdTuplePrinter._iterator.__init__): Use _is_nonempty_tuple.
* testsuite/20_util/tuple/dr2729.cc: New test.
* testsuite/20_util/tuple/element_access/get_neg.cc: Change dg-error
to dg-prune-output.
From-SVN: r263625
2018-08-17 19:52:49 +02:00
|
|
|
noexcept(__nothrow_assignable<_T1, _T2>())
|
tuple (_Tuple_impl<>::_Tuple_impl(typename std::remove_reference<>::type&&, typename std::remove_reference<>::type&&...), [...]): Add.
2007-12-30 Paolo Carlini <pcarlini@suse.de>
* include/std/tuple (_Tuple_impl<>::_Tuple_impl(typename
std::remove_reference<>::type&&, typename
std::remove_reference<>::type&&...),
_Tuple_impl(const _Tuple_impl<>&), _Tuple_impl(_Tuple_impl&&),
_Tuple_impl(_Tuple_impl<>&&), operator=(_Tuple_impl&&),
operator=(const _Tuple_impl<>&), operator=(_Tuple_impl<>&&)): Add.
(tuple<>::tuple(const _Elements&...), tuple(_UElements&&...),
tuple(tuple&&), tuple(const tuple<>&), tuple(tuple<>&&),
operator=(tuple&&), operator=(const tuple<>&), operator=(tuple<>&&)):
Likewise.
(tuple<_T1, _T2>::tuple(const _T1&, const _T2&, tuple(_U1&&, _U2&&),
tuple(tuple&&), tuple(tuple<>&&), tuple(pair<>&&), operator=(tuple&&),
operator=(tuple<>&&), operator=(pair<>&&)): Likewise.
(tuple<>::tuple(typename __add_c_ref<_Elements>::type...),
tuple<_T1, _T2>::tuple(typename __add_c_ref<>::type,
typename __add_c_ref<>::type)): Remove.
* testsuite/tr1/6_containers/tuple/creation_functions/tie2.cc: New.
* testsuite/20_util/tuple/creation_functions/tie2.cc: Likewise.
* testsuite/20_util/tuple/moveable.cc: Likewise.
From-SVN: r131230
2007-12-30 23:44:42 +01:00
|
|
|
{
|
PR libstdc++/86963 Remove use of __tuple_base in std::tuple
The _Tuple_impl base class can be used to disable copy/move assignment,
without requiring an extra base class.
Exception specifications on std::tuple assignment and swap functions can
be defined directly using is_nothrow_swappable, instead of querying the
base classes.
PR libstdc++/86963
* include/std/tuple (_Tuple_impl::operator=): Define as deleted.
(_Tuple_impl::_M_assign): New functions to perform assignment instead
of assignment operators.
(_Tuple_impl::_M_swap): Remove exception specification.
(_Tuple_impl<_Idx, _Head>): Likewise.
(_TC::_NonNestedTuple, _TC::_NotSameTuple): Use __remove_cvref_t.
(__tuple_base): Remove.
(tuple, tuple<_T1, _T2>): Remove inheritance from __tuple_base.
(tuple::operator=, tuple<_T1, _T2>::operator=): Call _M_assign.
(tuple::swap, tuple<_T1, _T2>::swap): Define exception specification
using __is_nothrow_swappable.
(tuple<_T1, _T2>::tuple(_U1&&, _U2&&)): Use __remove_cvref_t.
From-SVN: r263661
2018-08-20 15:53:56 +02:00
|
|
|
this->_M_assign(std::move(__in));
|
tuple (_Tuple_impl<>::_Tuple_impl(typename std::remove_reference<>::type&&, typename std::remove_reference<>::type&&...), [...]): Add.
2007-12-30 Paolo Carlini <pcarlini@suse.de>
* include/std/tuple (_Tuple_impl<>::_Tuple_impl(typename
std::remove_reference<>::type&&, typename
std::remove_reference<>::type&&...),
_Tuple_impl(const _Tuple_impl<>&), _Tuple_impl(_Tuple_impl&&),
_Tuple_impl(_Tuple_impl<>&&), operator=(_Tuple_impl&&),
operator=(const _Tuple_impl<>&), operator=(_Tuple_impl<>&&)): Add.
(tuple<>::tuple(const _Elements&...), tuple(_UElements&&...),
tuple(tuple&&), tuple(const tuple<>&), tuple(tuple<>&&),
operator=(tuple&&), operator=(const tuple<>&), operator=(tuple<>&&)):
Likewise.
(tuple<_T1, _T2>::tuple(const _T1&, const _T2&, tuple(_U1&&, _U2&&),
tuple(tuple&&), tuple(tuple<>&&), tuple(pair<>&&), operator=(tuple&&),
operator=(tuple<>&&), operator=(pair<>&&)): Likewise.
(tuple<>::tuple(typename __add_c_ref<_Elements>::type...),
tuple<_T1, _T2>::tuple(typename __add_c_ref<>::type,
typename __add_c_ref<>::type)): Remove.
* testsuite/tr1/6_containers/tuple/creation_functions/tie2.cc: New.
* testsuite/20_util/tuple/creation_functions/tie2.cc: Likewise.
* testsuite/20_util/tuple/moveable.cc: Likewise.
From-SVN: r131230
2007-12-30 23:44:42 +01:00
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
|
|
|
template<typename _U1, typename _U2>
|
PR libstdc++/86963 Implement LWG 2729 constraints on tuple assignment
PR libstdc++/86963
* include/std/tuple (__tuple_base): New class template with deleted
copy assignment operator.
(tuple, tuple<_T1, _T2>): Derive from __tuple_base<tuple> so that
implicit copy/move assignment operator will be deleted/suppressed.
(tuple::__assignable, tuple<_T1, _T2>::__assignable): New helper
functions for SFINAE constraints on assignment operators.
(tuple::__nothrow_assignable, tuple<_T1, _T2>::__nothrow_assignable):
New helper functions for exception specifications.
(tuple::operator=(const tuple&), tuple::operator=(tuple&&))
(tuple<_T1, _T2>::operator=(const tuple&))
(tuple<_T1, _T2>::operator=(tuple&&)): Change parameter types to
__nonesuch_no_braces when the operator should be defined implicitly.
Use __nothrow_assignable for exception specifications.
(tuple::operator=(const tuple<_UElements...>&))
(tuple::operator=(tuple<_UElements...>&&))
(tuple<_T1, _T2>::operator=(const tuple<_U1, _U2>&))
(tuple<_T1, _T2>::operator=(tuple<_U1, _U2>&&))
(tuple<_T1, _T2>::operator=(const pair<_U1, _U2>&))
(tuple<_T1, _T2>::operator=(pair<_U1, _U2>&&)): Constrain using
__assignable and use __nothrow_assignable for exception
specifications.
* python/libstdcxx/v6/printers.py (is_specialization_of): Accept
gdb.Type as first argument, instead of a string.
(StdTuplePrinter._iterator._is_nonempty_tuple): New method to check
tuple for expected structure.
(StdTuplePrinter._iterator.__init__): Use _is_nonempty_tuple.
* testsuite/20_util/tuple/dr2729.cc: New test.
* testsuite/20_util/tuple/element_access/get_neg.cc: Change dg-error
to dg-prune-output.
From-SVN: r263625
2018-08-17 19:52:49 +02:00
|
|
|
__enable_if_t<__assignable<const _U1&, const _U2&>(), tuple&>
|
|
|
|
operator=(const tuple<_U1, _U2>& __in)
|
|
|
|
noexcept(__nothrow_assignable<const _U1&, const _U2&>())
|
|
|
|
{
|
PR libstdc++/86963 Remove use of __tuple_base in std::tuple
The _Tuple_impl base class can be used to disable copy/move assignment,
without requiring an extra base class.
Exception specifications on std::tuple assignment and swap functions can
be defined directly using is_nothrow_swappable, instead of querying the
base classes.
PR libstdc++/86963
* include/std/tuple (_Tuple_impl::operator=): Define as deleted.
(_Tuple_impl::_M_assign): New functions to perform assignment instead
of assignment operators.
(_Tuple_impl::_M_swap): Remove exception specification.
(_Tuple_impl<_Idx, _Head>): Likewise.
(_TC::_NonNestedTuple, _TC::_NotSameTuple): Use __remove_cvref_t.
(__tuple_base): Remove.
(tuple, tuple<_T1, _T2>): Remove inheritance from __tuple_base.
(tuple::operator=, tuple<_T1, _T2>::operator=): Call _M_assign.
(tuple::swap, tuple<_T1, _T2>::swap): Define exception specification
using __is_nothrow_swappable.
(tuple<_T1, _T2>::tuple(_U1&&, _U2&&)): Use __remove_cvref_t.
From-SVN: r263661
2018-08-20 15:53:56 +02:00
|
|
|
this->_M_assign(__in);
|
tuple (_Tuple_impl<>::_Tuple_impl(typename std::remove_reference<>::type&&, typename std::remove_reference<>::type&&...), [...]): Add.
2007-12-30 Paolo Carlini <pcarlini@suse.de>
* include/std/tuple (_Tuple_impl<>::_Tuple_impl(typename
std::remove_reference<>::type&&, typename
std::remove_reference<>::type&&...),
_Tuple_impl(const _Tuple_impl<>&), _Tuple_impl(_Tuple_impl&&),
_Tuple_impl(_Tuple_impl<>&&), operator=(_Tuple_impl&&),
operator=(const _Tuple_impl<>&), operator=(_Tuple_impl<>&&)): Add.
(tuple<>::tuple(const _Elements&...), tuple(_UElements&&...),
tuple(tuple&&), tuple(const tuple<>&), tuple(tuple<>&&),
operator=(tuple&&), operator=(const tuple<>&), operator=(tuple<>&&)):
Likewise.
(tuple<_T1, _T2>::tuple(const _T1&, const _T2&, tuple(_U1&&, _U2&&),
tuple(tuple&&), tuple(tuple<>&&), tuple(pair<>&&), operator=(tuple&&),
operator=(tuple<>&&), operator=(pair<>&&)): Likewise.
(tuple<>::tuple(typename __add_c_ref<_Elements>::type...),
tuple<_T1, _T2>::tuple(typename __add_c_ref<>::type,
typename __add_c_ref<>::type)): Remove.
* testsuite/tr1/6_containers/tuple/creation_functions/tie2.cc: New.
* testsuite/20_util/tuple/creation_functions/tie2.cc: Likewise.
* testsuite/20_util/tuple/moveable.cc: Likewise.
From-SVN: r131230
2007-12-30 23:44:42 +01:00
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
|
|
|
template<typename _U1, typename _U2>
|
PR libstdc++/86963 Implement LWG 2729 constraints on tuple assignment
PR libstdc++/86963
* include/std/tuple (__tuple_base): New class template with deleted
copy assignment operator.
(tuple, tuple<_T1, _T2>): Derive from __tuple_base<tuple> so that
implicit copy/move assignment operator will be deleted/suppressed.
(tuple::__assignable, tuple<_T1, _T2>::__assignable): New helper
functions for SFINAE constraints on assignment operators.
(tuple::__nothrow_assignable, tuple<_T1, _T2>::__nothrow_assignable):
New helper functions for exception specifications.
(tuple::operator=(const tuple&), tuple::operator=(tuple&&))
(tuple<_T1, _T2>::operator=(const tuple&))
(tuple<_T1, _T2>::operator=(tuple&&)): Change parameter types to
__nonesuch_no_braces when the operator should be defined implicitly.
Use __nothrow_assignable for exception specifications.
(tuple::operator=(const tuple<_UElements...>&))
(tuple::operator=(tuple<_UElements...>&&))
(tuple<_T1, _T2>::operator=(const tuple<_U1, _U2>&))
(tuple<_T1, _T2>::operator=(tuple<_U1, _U2>&&))
(tuple<_T1, _T2>::operator=(const pair<_U1, _U2>&))
(tuple<_T1, _T2>::operator=(pair<_U1, _U2>&&)): Constrain using
__assignable and use __nothrow_assignable for exception
specifications.
* python/libstdcxx/v6/printers.py (is_specialization_of): Accept
gdb.Type as first argument, instead of a string.
(StdTuplePrinter._iterator._is_nonempty_tuple): New method to check
tuple for expected structure.
(StdTuplePrinter._iterator.__init__): Use _is_nonempty_tuple.
* testsuite/20_util/tuple/dr2729.cc: New test.
* testsuite/20_util/tuple/element_access/get_neg.cc: Change dg-error
to dg-prune-output.
From-SVN: r263625
2018-08-17 19:52:49 +02:00
|
|
|
__enable_if_t<__assignable<_U1, _U2>(), tuple&>
|
|
|
|
operator=(tuple<_U1, _U2>&& __in)
|
|
|
|
noexcept(__nothrow_assignable<_U1, _U2>())
|
|
|
|
{
|
PR libstdc++/86963 Remove use of __tuple_base in std::tuple
The _Tuple_impl base class can be used to disable copy/move assignment,
without requiring an extra base class.
Exception specifications on std::tuple assignment and swap functions can
be defined directly using is_nothrow_swappable, instead of querying the
base classes.
PR libstdc++/86963
* include/std/tuple (_Tuple_impl::operator=): Define as deleted.
(_Tuple_impl::_M_assign): New functions to perform assignment instead
of assignment operators.
(_Tuple_impl::_M_swap): Remove exception specification.
(_Tuple_impl<_Idx, _Head>): Likewise.
(_TC::_NonNestedTuple, _TC::_NotSameTuple): Use __remove_cvref_t.
(__tuple_base): Remove.
(tuple, tuple<_T1, _T2>): Remove inheritance from __tuple_base.
(tuple::operator=, tuple<_T1, _T2>::operator=): Call _M_assign.
(tuple::swap, tuple<_T1, _T2>::swap): Define exception specification
using __is_nothrow_swappable.
(tuple<_T1, _T2>::tuple(_U1&&, _U2&&)): Use __remove_cvref_t.
From-SVN: r263661
2018-08-20 15:53:56 +02:00
|
|
|
this->_M_assign(std::move(__in));
|
tuple (_Tuple_impl<>::_Tuple_impl(typename std::remove_reference<>::type&&, typename std::remove_reference<>::type&&...), [...]): Add.
2007-12-30 Paolo Carlini <pcarlini@suse.de>
* include/std/tuple (_Tuple_impl<>::_Tuple_impl(typename
std::remove_reference<>::type&&, typename
std::remove_reference<>::type&&...),
_Tuple_impl(const _Tuple_impl<>&), _Tuple_impl(_Tuple_impl&&),
_Tuple_impl(_Tuple_impl<>&&), operator=(_Tuple_impl&&),
operator=(const _Tuple_impl<>&), operator=(_Tuple_impl<>&&)): Add.
(tuple<>::tuple(const _Elements&...), tuple(_UElements&&...),
tuple(tuple&&), tuple(const tuple<>&), tuple(tuple<>&&),
operator=(tuple&&), operator=(const tuple<>&), operator=(tuple<>&&)):
Likewise.
(tuple<_T1, _T2>::tuple(const _T1&, const _T2&, tuple(_U1&&, _U2&&),
tuple(tuple&&), tuple(tuple<>&&), tuple(pair<>&&), operator=(tuple&&),
operator=(tuple<>&&), operator=(pair<>&&)): Likewise.
(tuple<>::tuple(typename __add_c_ref<_Elements>::type...),
tuple<_T1, _T2>::tuple(typename __add_c_ref<>::type,
typename __add_c_ref<>::type)): Remove.
* testsuite/tr1/6_containers/tuple/creation_functions/tie2.cc: New.
* testsuite/20_util/tuple/creation_functions/tie2.cc: Likewise.
* testsuite/20_util/tuple/moveable.cc: Likewise.
From-SVN: r131230
2007-12-30 23:44:42 +01:00
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
2007-12-26 16:23:49 +01:00
|
|
|
template<typename _U1, typename _U2>
|
PR libstdc++/86963 Implement LWG 2729 constraints on tuple assignment
PR libstdc++/86963
* include/std/tuple (__tuple_base): New class template with deleted
copy assignment operator.
(tuple, tuple<_T1, _T2>): Derive from __tuple_base<tuple> so that
implicit copy/move assignment operator will be deleted/suppressed.
(tuple::__assignable, tuple<_T1, _T2>::__assignable): New helper
functions for SFINAE constraints on assignment operators.
(tuple::__nothrow_assignable, tuple<_T1, _T2>::__nothrow_assignable):
New helper functions for exception specifications.
(tuple::operator=(const tuple&), tuple::operator=(tuple&&))
(tuple<_T1, _T2>::operator=(const tuple&))
(tuple<_T1, _T2>::operator=(tuple&&)): Change parameter types to
__nonesuch_no_braces when the operator should be defined implicitly.
Use __nothrow_assignable for exception specifications.
(tuple::operator=(const tuple<_UElements...>&))
(tuple::operator=(tuple<_UElements...>&&))
(tuple<_T1, _T2>::operator=(const tuple<_U1, _U2>&))
(tuple<_T1, _T2>::operator=(tuple<_U1, _U2>&&))
(tuple<_T1, _T2>::operator=(const pair<_U1, _U2>&))
(tuple<_T1, _T2>::operator=(pair<_U1, _U2>&&)): Constrain using
__assignable and use __nothrow_assignable for exception
specifications.
* python/libstdcxx/v6/printers.py (is_specialization_of): Accept
gdb.Type as first argument, instead of a string.
(StdTuplePrinter._iterator._is_nonempty_tuple): New method to check
tuple for expected structure.
(StdTuplePrinter._iterator.__init__): Use _is_nonempty_tuple.
* testsuite/20_util/tuple/dr2729.cc: New test.
* testsuite/20_util/tuple/element_access/get_neg.cc: Change dg-error
to dg-prune-output.
From-SVN: r263625
2018-08-17 19:52:49 +02:00
|
|
|
__enable_if_t<__assignable<const _U1&, const _U2&>(), tuple&>
|
|
|
|
operator=(const pair<_U1, _U2>& __in)
|
|
|
|
noexcept(__nothrow_assignable<const _U1&, const _U2&>())
|
|
|
|
{
|
2011-09-13 02:06:25 +02:00
|
|
|
this->_M_head(*this) = __in.first;
|
|
|
|
this->_M_tail(*this)._M_head(*this) = __in.second;
|
2007-12-26 16:23:49 +01:00
|
|
|
return *this;
|
|
|
|
}
|
tuple (_Tuple_impl<>::_Tuple_impl(typename std::remove_reference<>::type&&, typename std::remove_reference<>::type&&...), [...]): Add.
2007-12-30 Paolo Carlini <pcarlini@suse.de>
* include/std/tuple (_Tuple_impl<>::_Tuple_impl(typename
std::remove_reference<>::type&&, typename
std::remove_reference<>::type&&...),
_Tuple_impl(const _Tuple_impl<>&), _Tuple_impl(_Tuple_impl&&),
_Tuple_impl(_Tuple_impl<>&&), operator=(_Tuple_impl&&),
operator=(const _Tuple_impl<>&), operator=(_Tuple_impl<>&&)): Add.
(tuple<>::tuple(const _Elements&...), tuple(_UElements&&...),
tuple(tuple&&), tuple(const tuple<>&), tuple(tuple<>&&),
operator=(tuple&&), operator=(const tuple<>&), operator=(tuple<>&&)):
Likewise.
(tuple<_T1, _T2>::tuple(const _T1&, const _T2&, tuple(_U1&&, _U2&&),
tuple(tuple&&), tuple(tuple<>&&), tuple(pair<>&&), operator=(tuple&&),
operator=(tuple<>&&), operator=(pair<>&&)): Likewise.
(tuple<>::tuple(typename __add_c_ref<_Elements>::type...),
tuple<_T1, _T2>::tuple(typename __add_c_ref<>::type,
typename __add_c_ref<>::type)): Remove.
* testsuite/tr1/6_containers/tuple/creation_functions/tie2.cc: New.
* testsuite/20_util/tuple/creation_functions/tie2.cc: Likewise.
* testsuite/20_util/tuple/moveable.cc: Likewise.
From-SVN: r131230
2007-12-30 23:44:42 +01:00
|
|
|
|
|
|
|
template<typename _U1, typename _U2>
|
PR libstdc++/86963 Implement LWG 2729 constraints on tuple assignment
PR libstdc++/86963
* include/std/tuple (__tuple_base): New class template with deleted
copy assignment operator.
(tuple, tuple<_T1, _T2>): Derive from __tuple_base<tuple> so that
implicit copy/move assignment operator will be deleted/suppressed.
(tuple::__assignable, tuple<_T1, _T2>::__assignable): New helper
functions for SFINAE constraints on assignment operators.
(tuple::__nothrow_assignable, tuple<_T1, _T2>::__nothrow_assignable):
New helper functions for exception specifications.
(tuple::operator=(const tuple&), tuple::operator=(tuple&&))
(tuple<_T1, _T2>::operator=(const tuple&))
(tuple<_T1, _T2>::operator=(tuple&&)): Change parameter types to
__nonesuch_no_braces when the operator should be defined implicitly.
Use __nothrow_assignable for exception specifications.
(tuple::operator=(const tuple<_UElements...>&))
(tuple::operator=(tuple<_UElements...>&&))
(tuple<_T1, _T2>::operator=(const tuple<_U1, _U2>&))
(tuple<_T1, _T2>::operator=(tuple<_U1, _U2>&&))
(tuple<_T1, _T2>::operator=(const pair<_U1, _U2>&))
(tuple<_T1, _T2>::operator=(pair<_U1, _U2>&&)): Constrain using
__assignable and use __nothrow_assignable for exception
specifications.
* python/libstdcxx/v6/printers.py (is_specialization_of): Accept
gdb.Type as first argument, instead of a string.
(StdTuplePrinter._iterator._is_nonempty_tuple): New method to check
tuple for expected structure.
(StdTuplePrinter._iterator.__init__): Use _is_nonempty_tuple.
* testsuite/20_util/tuple/dr2729.cc: New test.
* testsuite/20_util/tuple/element_access/get_neg.cc: Change dg-error
to dg-prune-output.
From-SVN: r263625
2018-08-17 19:52:49 +02:00
|
|
|
__enable_if_t<__assignable<_U1, _U2>(), tuple&>
|
|
|
|
operator=(pair<_U1, _U2>&& __in)
|
|
|
|
noexcept(__nothrow_assignable<_U1, _U2>())
|
|
|
|
{
|
2011-09-13 02:06:25 +02:00
|
|
|
this->_M_head(*this) = std::forward<_U1>(__in.first);
|
|
|
|
this->_M_tail(*this)._M_head(*this) = std::forward<_U2>(__in.second);
|
tuple (_Tuple_impl<>::_Tuple_impl(typename std::remove_reference<>::type&&, typename std::remove_reference<>::type&&...), [...]): Add.
2007-12-30 Paolo Carlini <pcarlini@suse.de>
* include/std/tuple (_Tuple_impl<>::_Tuple_impl(typename
std::remove_reference<>::type&&, typename
std::remove_reference<>::type&&...),
_Tuple_impl(const _Tuple_impl<>&), _Tuple_impl(_Tuple_impl&&),
_Tuple_impl(_Tuple_impl<>&&), operator=(_Tuple_impl&&),
operator=(const _Tuple_impl<>&), operator=(_Tuple_impl<>&&)): Add.
(tuple<>::tuple(const _Elements&...), tuple(_UElements&&...),
tuple(tuple&&), tuple(const tuple<>&), tuple(tuple<>&&),
operator=(tuple&&), operator=(const tuple<>&), operator=(tuple<>&&)):
Likewise.
(tuple<_T1, _T2>::tuple(const _T1&, const _T2&, tuple(_U1&&, _U2&&),
tuple(tuple&&), tuple(tuple<>&&), tuple(pair<>&&), operator=(tuple&&),
operator=(tuple<>&&), operator=(pair<>&&)): Likewise.
(tuple<>::tuple(typename __add_c_ref<_Elements>::type...),
tuple<_T1, _T2>::tuple(typename __add_c_ref<>::type,
typename __add_c_ref<>::type)): Remove.
* testsuite/tr1/6_containers/tuple/creation_functions/tie2.cc: New.
* testsuite/20_util/tuple/creation_functions/tie2.cc: Likewise.
* testsuite/20_util/tuple/moveable.cc: Likewise.
From-SVN: r131230
2007-12-30 23:44:42 +01:00
|
|
|
return *this;
|
|
|
|
}
|
2008-10-02 00:04:02 +02:00
|
|
|
|
|
|
|
void
|
2009-05-19 00:15:56 +02:00
|
|
|
swap(tuple& __in)
|
PR libstdc++/86963 Remove use of __tuple_base in std::tuple
The _Tuple_impl base class can be used to disable copy/move assignment,
without requiring an extra base class.
Exception specifications on std::tuple assignment and swap functions can
be defined directly using is_nothrow_swappable, instead of querying the
base classes.
PR libstdc++/86963
* include/std/tuple (_Tuple_impl::operator=): Define as deleted.
(_Tuple_impl::_M_assign): New functions to perform assignment instead
of assignment operators.
(_Tuple_impl::_M_swap): Remove exception specification.
(_Tuple_impl<_Idx, _Head>): Likewise.
(_TC::_NonNestedTuple, _TC::_NotSameTuple): Use __remove_cvref_t.
(__tuple_base): Remove.
(tuple, tuple<_T1, _T2>): Remove inheritance from __tuple_base.
(tuple::operator=, tuple<_T1, _T2>::operator=): Call _M_assign.
(tuple::swap, tuple<_T1, _T2>::swap): Define exception specification
using __is_nothrow_swappable.
(tuple<_T1, _T2>::tuple(_U1&&, _U2&&)): Use __remove_cvref_t.
From-SVN: r263661
2018-08-20 15:53:56 +02:00
|
|
|
noexcept(__and_<__is_nothrow_swappable<_T1>,
|
|
|
|
__is_nothrow_swappable<_T2>>::value)
|
2011-05-18 02:12:58 +02:00
|
|
|
{ _Inherited::_M_swap(__in); }
|
2007-12-26 16:23:49 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
|
2016-07-31 19:08:52 +02:00
|
|
|
/// class tuple_size
|
|
|
|
template<typename... _Elements>
|
|
|
|
struct tuple_size<tuple<_Elements...>>
|
|
|
|
: public integral_constant<std::size_t, sizeof...(_Elements)> { };
|
|
|
|
|
|
|
|
#if __cplusplus > 201402L
|
|
|
|
template <typename _Tp>
|
Implement P0607R0 "Inline Variables for Standard Library" for C++17
2017-03-23 Daniel Kruegler <daniel.kruegler@gmail.com>
* include/bits/c++config (_GLIBCXX17_INLINE): Define.
* include/bits/regex_constants.h (All std::regex_constants constants):
Add _GLIBCXX17_INLINE as per P0607R0.
* include/bits/std_mutex.h (defer_lock, try_to_lock, adopt_lock):
Likewise.
* include/bits/stl_pair.h (piecewise_construct): Likewise.
* include/bits/uses_allocator.h (allocator_arg, uses_allocator_v)
(__is_uses_allocator_constructible_v)
(__is_nothrow_uses_allocator_constructible_v): Likewise.
* include/std/chrono (treat_as_floating_point_v): Likewise.
* include/std/functional (is_bind_expression_v, is_placeholder_v):
Likewise.
* include/std/optional (nullopt): Likewise.
* include/std/ratio (ratio_equal_v, ratio_not_equal_v, ratio_less_v)
ratio_less_equal_v, ratio_greater_v, ratio_greater_equal_v): Likewise.
* include/std/system_error (is_error_code_enum_v)
(is_error_condition_enum_v): Likewise.
* include/std/tuple (tuple_size_v, ignore): Likewise.
(ignore): Declare ignore constexpr as per LWG 2773, declare assignment
constexpr as per LWG 2933.
* include/std/type_traits (All variable templates): Add
_GLIBCXX17_INLINE as per P0607R0.
* include/std/variant (variant_size_v, variant_npos, __index_of_v)
(__tuple_count_v, __exactly_once): Likewise.
* testsuite/18_support/headers/new/synopsis.cc
(hardware_destructive_interference_size)
(hardware_constructive_interference_size): Likewise for commented-out
variables.
* testsuite/20_util/tuple/creation_functions/constexpr.cc: Add new
test function for constexpr std::ignore (LWG 2773).
* testsuite/20_util/tuple/creation_functions/constexpr_cpp14.cc: New
test for LWG 2933.
From-SVN: r246423
2017-03-23 20:40:07 +01:00
|
|
|
inline constexpr size_t tuple_size_v = tuple_size<_Tp>::value;
|
2016-07-31 19:08:52 +02:00
|
|
|
#endif
|
|
|
|
|
2007-12-26 16:23:49 +01:00
|
|
|
/**
|
|
|
|
* Recursive case for tuple_element: strip off the first element in
|
|
|
|
* the tuple and retrieve the (i-1)th element of the remaining tuple.
|
|
|
|
*/
|
2008-05-24 01:08:41 +02:00
|
|
|
template<std::size_t __i, typename _Head, typename... _Tail>
|
2007-12-26 16:23:49 +01:00
|
|
|
struct tuple_element<__i, tuple<_Head, _Tail...> >
|
|
|
|
: tuple_element<__i - 1, tuple<_Tail...> > { };
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Basis case for tuple_element: The first element is the one we're seeking.
|
|
|
|
*/
|
|
|
|
template<typename _Head, typename... _Tail>
|
|
|
|
struct tuple_element<0, tuple<_Head, _Tail...> >
|
|
|
|
{
|
|
|
|
typedef _Head type;
|
|
|
|
};
|
|
|
|
|
2016-07-31 19:08:52 +02:00
|
|
|
/**
|
|
|
|
* Error case for tuple_element: invalid index.
|
|
|
|
*/
|
|
|
|
template<size_t __i>
|
|
|
|
struct tuple_element<__i, tuple<>>
|
|
|
|
{
|
|
|
|
static_assert(__i < tuple_size<tuple<>>::value,
|
|
|
|
"tuple index is in range");
|
|
|
|
};
|
Implement C++17 variable templates for type traits.
* include/std/chrono (treat_as_floating_point_v): New.
* include/std/ratio (ratio_equal_v, ratio_not_equal_v)
(ratio_less_v, ratio_less_equal_v, ratio_greater_v)
(ratio_greater_equal_v): Likewise.
* include/std/system_error (is_error_code_enum_v)
(is_error_condition_enum_v): Likewise.
* include/std/tuple (tuple_size_v): Likewise.
* type_traits (conjunction_v, disjunction_v, negation_v)
(is_void_v, is_null_pointer_v, is_integral_v, is_floating_point_v)
(is_array_v, is_pointer_v, is_lvalue_reference_v)
(is_rvalue_reference_v, is_member_object_pointer_v)
(is_member_function_pointer_v, is_enum_v, is_union_v)
(is_class_v, is_function_v, is_reference_v, is_arithmetic_v)
(is_fundamental_v, is_object_v, is_scalar_v, is_compound_v)
(is_member_pointer_v, is_const_v, is_volatile_v, is_trivial_v)
(is_trivially_copyable_v, is_standard_layout_v)
(is_pod_v, is_literal_type_v, is_empty_v, is_polymorphic_v)
(is_abstract_v, is_final_v, is_signed_v, is_unsigned_v)
(is_constructible_v, is_default_constructible_v)
(is_copy_constructible_v, is_move_constructible_v)
(is_assignable_v, is_copy_assignable_v, is_move_assignable_v)
(is_destructible_v, is_trivially_constructible_v)
(is_trivially_default_constructible_v)
(is_trivially_copy_constructible_v, is_trivially_move_constructible_v)
(is_trivially_assignable_v, is_trivially_copy_assignable_v)
(is_trivially_move_assignable_v, is_trivially_destructible_v)
(is_nothrow_constructible_v, is_nothrow_default_constructible_v)
(is_nothrow_copy_constructible_v, is_nothrow_move_constructible_v)
(is_nothrow_assignable_v, is_nothrow_copy_assignable_v)
(is_nothrow_move_assignable_v, is_nothrow_destructible_v)
(has_virtual_destructor_v, alignment_of_v, rank_v, extent_v)
(is_same_v, is_base_of_v, is_convertible_v): Likewise.
* testsuite/19_diagnostics/error_code/is_error_code_v.cc: Likewise.
* testsuite/20_util/duration/requirements/treat_as_floating_point_v.cc:
Likewise.
* testsuite/20_util/ratio/requirements/ratio_equal_v.cc: Likewise.
* testsuite/20_util/tuple/tuple_size_v.cc: Likewise.
* testsuite/20_util/variable_templates_for_traits.cc: Likewise.
From-SVN: r238892
2016-07-29 21:01:39 +02:00
|
|
|
|
2008-05-24 01:08:41 +02:00
|
|
|
template<std::size_t __i, typename _Head, typename... _Tail>
|
2014-05-15 00:16:35 +02:00
|
|
|
constexpr _Head&
|
2011-05-19 19:20:22 +02:00
|
|
|
__get_helper(_Tuple_impl<__i, _Head, _Tail...>& __t) noexcept
|
2011-09-13 02:06:25 +02:00
|
|
|
{ return _Tuple_impl<__i, _Head, _Tail...>::_M_head(__t); }
|
2007-12-26 16:23:49 +01:00
|
|
|
|
2008-05-24 01:08:41 +02:00
|
|
|
template<std::size_t __i, typename _Head, typename... _Tail>
|
2014-05-15 00:16:35 +02:00
|
|
|
constexpr const _Head&
|
2011-05-19 19:20:22 +02:00
|
|
|
__get_helper(const _Tuple_impl<__i, _Head, _Tail...>& __t) noexcept
|
2011-09-13 02:06:25 +02:00
|
|
|
{ return _Tuple_impl<__i, _Head, _Tail...>::_M_head(__t); }
|
2007-12-26 16:23:49 +01:00
|
|
|
|
2014-05-15 00:16:35 +02:00
|
|
|
/// Return a reference to the ith element of a tuple.
|
2008-05-24 01:08:41 +02:00
|
|
|
template<std::size_t __i, typename... _Elements>
|
2014-05-15 00:16:35 +02:00
|
|
|
constexpr __tuple_element_t<__i, tuple<_Elements...>>&
|
2011-05-18 02:12:58 +02:00
|
|
|
get(tuple<_Elements...>& __t) noexcept
|
2014-04-14 17:32:58 +02:00
|
|
|
{ return std::__get_helper<__i>(__t); }
|
2007-12-26 16:23:49 +01:00
|
|
|
|
2014-05-15 00:16:35 +02:00
|
|
|
/// Return a const reference to the ith element of a const tuple.
|
2008-05-24 01:08:41 +02:00
|
|
|
template<std::size_t __i, typename... _Elements>
|
2014-05-15 00:16:35 +02:00
|
|
|
constexpr const __tuple_element_t<__i, tuple<_Elements...>>&
|
2011-05-18 02:12:58 +02:00
|
|
|
get(const tuple<_Elements...>& __t) noexcept
|
2014-04-14 17:32:58 +02:00
|
|
|
{ return std::__get_helper<__i>(__t); }
|
2007-12-26 16:23:49 +01:00
|
|
|
|
2014-05-15 00:16:35 +02:00
|
|
|
/// Return an rvalue reference to the ith element of a tuple rvalue.
|
2011-05-18 02:12:58 +02:00
|
|
|
template<std::size_t __i, typename... _Elements>
|
2014-05-15 00:16:35 +02:00
|
|
|
constexpr __tuple_element_t<__i, tuple<_Elements...>>&&
|
2011-05-18 02:12:58 +02:00
|
|
|
get(tuple<_Elements...>&& __t) noexcept
|
2014-05-15 00:16:35 +02:00
|
|
|
{
|
|
|
|
typedef __tuple_element_t<__i, tuple<_Elements...>> __element_type;
|
|
|
|
return std::forward<__element_type&&>(std::get<__i>(__t));
|
|
|
|
}
|
2011-05-18 02:12:58 +02:00
|
|
|
|
2017-10-30 15:31:04 +01:00
|
|
|
/// Return a const rvalue reference to the ith element of a const tuple rvalue.
|
|
|
|
template<std::size_t __i, typename... _Elements>
|
|
|
|
constexpr const __tuple_element_t<__i, tuple<_Elements...>>&&
|
|
|
|
get(const tuple<_Elements...>&& __t) noexcept
|
|
|
|
{
|
|
|
|
typedef __tuple_element_t<__i, tuple<_Elements...>> __element_type;
|
|
|
|
return std::forward<const __element_type&&>(std::get<__i>(__t));
|
|
|
|
}
|
|
|
|
|
2018-06-14 16:01:29 +02:00
|
|
|
#if __cplusplus >= 201402L
|
2014-10-01 13:49:23 +02:00
|
|
|
|
|
|
|
#define __cpp_lib_tuples_by_type 201304
|
|
|
|
|
2013-05-19 15:31:36 +02:00
|
|
|
template<typename _Head, size_t __i, typename... _Tail>
|
2014-05-15 00:16:35 +02:00
|
|
|
constexpr _Head&
|
2013-05-19 15:31:36 +02:00
|
|
|
__get_helper2(_Tuple_impl<__i, _Head, _Tail...>& __t) noexcept
|
|
|
|
{ return _Tuple_impl<__i, _Head, _Tail...>::_M_head(__t); }
|
|
|
|
|
|
|
|
template<typename _Head, size_t __i, typename... _Tail>
|
2014-05-15 00:16:35 +02:00
|
|
|
constexpr const _Head&
|
2013-05-19 15:31:36 +02:00
|
|
|
__get_helper2(const _Tuple_impl<__i, _Head, _Tail...>& __t) noexcept
|
|
|
|
{ return _Tuple_impl<__i, _Head, _Tail...>::_M_head(__t); }
|
|
|
|
|
2014-05-15 00:16:35 +02:00
|
|
|
/// Return a reference to the unique element of type _Tp of a tuple.
|
2013-05-19 15:31:36 +02:00
|
|
|
template <typename _Tp, typename... _Types>
|
|
|
|
constexpr _Tp&
|
|
|
|
get(tuple<_Types...>& __t) noexcept
|
2014-04-14 17:32:58 +02:00
|
|
|
{ return std::__get_helper2<_Tp>(__t); }
|
2013-05-19 15:31:36 +02:00
|
|
|
|
2014-05-15 00:16:35 +02:00
|
|
|
/// Return a reference to the unique element of type _Tp of a tuple rvalue.
|
2013-05-19 15:31:36 +02:00
|
|
|
template <typename _Tp, typename... _Types>
|
|
|
|
constexpr _Tp&&
|
|
|
|
get(tuple<_Types...>&& __t) noexcept
|
2014-05-15 00:16:35 +02:00
|
|
|
{ return std::forward<_Tp&&>(std::__get_helper2<_Tp>(__t)); }
|
2013-05-19 15:31:36 +02:00
|
|
|
|
2014-05-15 00:16:35 +02:00
|
|
|
/// Return a const reference to the unique element of type _Tp of a tuple.
|
2013-05-19 15:31:36 +02:00
|
|
|
template <typename _Tp, typename... _Types>
|
|
|
|
constexpr const _Tp&
|
|
|
|
get(const tuple<_Types...>& __t) noexcept
|
2014-04-14 17:32:58 +02:00
|
|
|
{ return std::__get_helper2<_Tp>(__t); }
|
2017-10-30 15:31:04 +01:00
|
|
|
|
|
|
|
/// Return a const reference to the unique element of type _Tp of
|
|
|
|
/// a const tuple rvalue.
|
|
|
|
template <typename _Tp, typename... _Types>
|
|
|
|
constexpr const _Tp&&
|
|
|
|
get(const tuple<_Types...>&& __t) noexcept
|
|
|
|
{ return std::forward<const _Tp&&>(std::__get_helper2<_Tp>(__t)); }
|
2013-05-19 15:31:36 +02:00
|
|
|
#endif
|
|
|
|
|
2014-05-15 00:16:35 +02:00
|
|
|
// This class performs the comparison operations on tuples
|
|
|
|
template<typename _Tp, typename _Up, size_t __i, size_t __size>
|
|
|
|
struct __tuple_compare
|
2007-12-26 16:23:49 +01:00
|
|
|
{
|
2014-05-15 00:16:35 +02:00
|
|
|
static constexpr bool
|
2011-09-07 02:17:09 +02:00
|
|
|
__eq(const _Tp& __t, const _Up& __u)
|
2007-12-26 16:23:49 +01:00
|
|
|
{
|
2014-05-13 13:18:01 +02:00
|
|
|
return bool(std::get<__i>(__t) == std::get<__i>(__u))
|
2014-05-15 00:16:35 +02:00
|
|
|
&& __tuple_compare<_Tp, _Up, __i + 1, __size>::__eq(__t, __u);
|
2007-12-26 16:23:49 +01:00
|
|
|
}
|
2016-06-16 15:47:35 +02:00
|
|
|
|
2014-05-15 00:16:35 +02:00
|
|
|
static constexpr bool
|
2011-09-07 02:17:09 +02:00
|
|
|
__less(const _Tp& __t, const _Up& __u)
|
2007-12-26 16:23:49 +01:00
|
|
|
{
|
2014-05-13 13:18:01 +02:00
|
|
|
return bool(std::get<__i>(__t) < std::get<__i>(__u))
|
2014-05-15 00:16:35 +02:00
|
|
|
|| (!bool(std::get<__i>(__u) < std::get<__i>(__t))
|
|
|
|
&& __tuple_compare<_Tp, _Up, __i + 1, __size>::__less(__t, __u));
|
2007-12-26 16:23:49 +01:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2014-05-15 00:16:35 +02:00
|
|
|
template<typename _Tp, typename _Up, size_t __size>
|
|
|
|
struct __tuple_compare<_Tp, _Up, __size, __size>
|
2007-12-26 16:23:49 +01:00
|
|
|
{
|
2014-05-15 00:16:35 +02:00
|
|
|
static constexpr bool
|
2011-09-07 02:17:09 +02:00
|
|
|
__eq(const _Tp&, const _Up&) { return true; }
|
2016-06-16 15:47:35 +02:00
|
|
|
|
2014-05-15 00:16:35 +02:00
|
|
|
static constexpr bool
|
2011-09-07 02:17:09 +02:00
|
|
|
__less(const _Tp&, const _Up&) { return false; }
|
2007-12-26 16:23:49 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
template<typename... _TElements, typename... _UElements>
|
2012-10-18 10:36:06 +02:00
|
|
|
constexpr bool
|
2007-12-26 16:23:49 +01:00
|
|
|
operator==(const tuple<_TElements...>& __t,
|
|
|
|
const tuple<_UElements...>& __u)
|
|
|
|
{
|
2014-05-15 00:16:35 +02:00
|
|
|
static_assert(sizeof...(_TElements) == sizeof...(_UElements),
|
|
|
|
"tuple objects can only be compared if they have equal sizes.");
|
|
|
|
using __compare = __tuple_compare<tuple<_TElements...>,
|
|
|
|
tuple<_UElements...>,
|
|
|
|
0, sizeof...(_TElements)>;
|
|
|
|
return __compare::__eq(__t, __u);
|
2007-12-26 16:23:49 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
template<typename... _TElements, typename... _UElements>
|
2012-10-18 10:36:06 +02:00
|
|
|
constexpr bool
|
2007-12-26 16:23:49 +01:00
|
|
|
operator<(const tuple<_TElements...>& __t,
|
|
|
|
const tuple<_UElements...>& __u)
|
|
|
|
{
|
2014-05-15 00:16:35 +02:00
|
|
|
static_assert(sizeof...(_TElements) == sizeof...(_UElements),
|
|
|
|
"tuple objects can only be compared if they have equal sizes.");
|
|
|
|
using __compare = __tuple_compare<tuple<_TElements...>,
|
|
|
|
tuple<_UElements...>,
|
|
|
|
0, sizeof...(_TElements)>;
|
|
|
|
return __compare::__less(__t, __u);
|
2007-12-26 16:23:49 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
template<typename... _TElements, typename... _UElements>
|
2013-06-01 23:39:50 +02:00
|
|
|
constexpr bool
|
2007-12-26 16:23:49 +01:00
|
|
|
operator!=(const tuple<_TElements...>& __t,
|
|
|
|
const tuple<_UElements...>& __u)
|
|
|
|
{ return !(__t == __u); }
|
|
|
|
|
|
|
|
template<typename... _TElements, typename... _UElements>
|
2013-06-01 23:39:50 +02:00
|
|
|
constexpr bool
|
2007-12-26 16:23:49 +01:00
|
|
|
operator>(const tuple<_TElements...>& __t,
|
|
|
|
const tuple<_UElements...>& __u)
|
|
|
|
{ return __u < __t; }
|
|
|
|
|
|
|
|
template<typename... _TElements, typename... _UElements>
|
2013-06-01 23:39:50 +02:00
|
|
|
constexpr bool
|
2007-12-26 16:23:49 +01:00
|
|
|
operator<=(const tuple<_TElements...>& __t,
|
|
|
|
const tuple<_UElements...>& __u)
|
|
|
|
{ return !(__u < __t); }
|
|
|
|
|
|
|
|
template<typename... _TElements, typename... _UElements>
|
2013-06-01 23:39:50 +02:00
|
|
|
constexpr bool
|
2007-12-26 16:23:49 +01:00
|
|
|
operator>=(const tuple<_TElements...>& __t,
|
|
|
|
const tuple<_UElements...>& __u)
|
|
|
|
{ return !(__t < __u); }
|
|
|
|
|
|
|
|
// NB: DR 705.
|
|
|
|
template<typename... _Elements>
|
2011-09-16 02:41:33 +02:00
|
|
|
constexpr tuple<typename __decay_and_strip<_Elements>::__type...>
|
2007-12-26 16:23:49 +01:00
|
|
|
make_tuple(_Elements&&... __args)
|
|
|
|
{
|
|
|
|
typedef tuple<typename __decay_and_strip<_Elements>::__type...>
|
|
|
|
__result_type;
|
|
|
|
return __result_type(std::forward<_Elements>(__args)...);
|
|
|
|
}
|
|
|
|
|
2015-05-02 13:20:03 +02:00
|
|
|
// _GLIBCXX_RESOLVE_LIB_DEFECTS
|
|
|
|
// 2275. Why is forward_as_tuple not constexpr?
|
2018-06-14 16:01:29 +02:00
|
|
|
/// std::forward_as_tuple
|
2010-04-30 11:52:41 +02:00
|
|
|
template<typename... _Elements>
|
2015-05-02 13:20:03 +02:00
|
|
|
constexpr tuple<_Elements&&...>
|
2011-05-18 02:12:58 +02:00
|
|
|
forward_as_tuple(_Elements&&... __args) noexcept
|
2010-08-06 16:46:08 +02:00
|
|
|
{ return tuple<_Elements&&...>(std::forward<_Elements>(__args)...); }
|
2010-04-30 11:52:41 +02:00
|
|
|
|
2014-05-15 00:16:35 +02:00
|
|
|
template<size_t, typename, typename, size_t>
|
2011-09-12 00:10:21 +02:00
|
|
|
struct __make_tuple_impl;
|
|
|
|
|
2014-05-15 00:16:35 +02:00
|
|
|
template<size_t _Idx, typename _Tuple, typename... _Tp, size_t _Nm>
|
2011-09-12 00:10:21 +02:00
|
|
|
struct __make_tuple_impl<_Idx, tuple<_Tp...>, _Tuple, _Nm>
|
2014-05-15 00:16:35 +02:00
|
|
|
: __make_tuple_impl<_Idx + 1,
|
|
|
|
tuple<_Tp..., __tuple_element_t<_Idx, _Tuple>>,
|
|
|
|
_Tuple, _Nm>
|
|
|
|
{ };
|
2007-12-26 16:23:49 +01:00
|
|
|
|
2011-09-12 00:10:21 +02:00
|
|
|
template<std::size_t _Nm, typename _Tuple, typename... _Tp>
|
|
|
|
struct __make_tuple_impl<_Nm, tuple<_Tp...>, _Tuple, _Nm>
|
2007-12-26 16:23:49 +01:00
|
|
|
{
|
2011-09-12 00:10:21 +02:00
|
|
|
typedef tuple<_Tp...> __type;
|
|
|
|
};
|
2007-12-26 16:23:49 +01:00
|
|
|
|
2011-09-12 00:10:21 +02:00
|
|
|
template<typename _Tuple>
|
|
|
|
struct __do_make_tuple
|
2014-05-15 00:16:35 +02:00
|
|
|
: __make_tuple_impl<0, tuple<>, _Tuple, std::tuple_size<_Tuple>::value>
|
2011-09-12 00:10:21 +02:00
|
|
|
{ };
|
|
|
|
|
|
|
|
// Returns the std::tuple equivalent of a tuple-like type.
|
|
|
|
template<typename _Tuple>
|
|
|
|
struct __make_tuple
|
2018-05-03 14:40:10 +02:00
|
|
|
: public __do_make_tuple<__remove_cvref_t<_Tuple>>
|
2011-09-12 00:10:21 +02:00
|
|
|
{ };
|
|
|
|
|
|
|
|
// Combines several std::tuple's into a single one.
|
|
|
|
template<typename...>
|
|
|
|
struct __combine_tuples;
|
|
|
|
|
|
|
|
template<>
|
|
|
|
struct __combine_tuples<>
|
|
|
|
{
|
|
|
|
typedef tuple<> __type;
|
|
|
|
};
|
|
|
|
|
|
|
|
template<typename... _Ts>
|
|
|
|
struct __combine_tuples<tuple<_Ts...>>
|
2007-12-26 16:23:49 +01:00
|
|
|
{
|
2011-09-12 00:10:21 +02:00
|
|
|
typedef tuple<_Ts...> __type;
|
|
|
|
};
|
|
|
|
|
|
|
|
template<typename... _T1s, typename... _T2s, typename... _Rem>
|
|
|
|
struct __combine_tuples<tuple<_T1s...>, tuple<_T2s...>, _Rem...>
|
|
|
|
{
|
|
|
|
typedef typename __combine_tuples<tuple<_T1s..., _T2s...>,
|
|
|
|
_Rem...>::__type __type;
|
|
|
|
};
|
|
|
|
|
|
|
|
// Computes the result type of tuple_cat given a set of tuple-like types.
|
|
|
|
template<typename... _Tpls>
|
|
|
|
struct __tuple_cat_result
|
|
|
|
{
|
|
|
|
typedef typename __combine_tuples
|
|
|
|
<typename __make_tuple<_Tpls>::__type...>::__type __type;
|
|
|
|
};
|
|
|
|
|
|
|
|
// Helper to determine the index set for the first tuple-like
|
|
|
|
// type of a given set.
|
|
|
|
template<typename...>
|
|
|
|
struct __make_1st_indices;
|
|
|
|
|
|
|
|
template<>
|
|
|
|
struct __make_1st_indices<>
|
|
|
|
{
|
|
|
|
typedef std::_Index_tuple<> __type;
|
|
|
|
};
|
|
|
|
|
|
|
|
template<typename _Tp, typename... _Tpls>
|
|
|
|
struct __make_1st_indices<_Tp, _Tpls...>
|
|
|
|
{
|
|
|
|
typedef typename std::_Build_index_tuple<std::tuple_size<
|
|
|
|
typename std::remove_reference<_Tp>::type>::value>::__type __type;
|
|
|
|
};
|
|
|
|
|
|
|
|
// Performs the actual concatenation by step-wise expanding tuple-like
|
|
|
|
// objects into the elements, which are finally forwarded into the
|
|
|
|
// result tuple.
|
|
|
|
template<typename _Ret, typename _Indices, typename... _Tpls>
|
|
|
|
struct __tuple_concater;
|
|
|
|
|
|
|
|
template<typename _Ret, std::size_t... _Is, typename _Tp, typename... _Tpls>
|
|
|
|
struct __tuple_concater<_Ret, std::_Index_tuple<_Is...>, _Tp, _Tpls...>
|
|
|
|
{
|
|
|
|
template<typename... _Us>
|
2011-09-13 02:06:25 +02:00
|
|
|
static constexpr _Ret
|
2011-09-12 00:10:21 +02:00
|
|
|
_S_do(_Tp&& __tp, _Tpls&&... __tps, _Us&&... __us)
|
|
|
|
{
|
|
|
|
typedef typename __make_1st_indices<_Tpls...>::__type __idx;
|
|
|
|
typedef __tuple_concater<_Ret, __idx, _Tpls...> __next;
|
|
|
|
return __next::_S_do(std::forward<_Tpls>(__tps)...,
|
|
|
|
std::forward<_Us>(__us)...,
|
|
|
|
std::get<_Is>(std::forward<_Tp>(__tp))...);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
template<typename _Ret>
|
|
|
|
struct __tuple_concater<_Ret, std::_Index_tuple<>>
|
|
|
|
{
|
|
|
|
template<typename... _Us>
|
2011-09-13 02:06:25 +02:00
|
|
|
static constexpr _Ret
|
2011-09-12 00:10:21 +02:00
|
|
|
_S_do(_Us&&... __us)
|
|
|
|
{
|
|
|
|
return _Ret(std::forward<_Us>(__us)...);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2013-02-20 02:52:36 +01:00
|
|
|
/// tuple_cat
|
2011-09-13 02:06:25 +02:00
|
|
|
template<typename... _Tpls, typename = typename
|
|
|
|
enable_if<__and_<__is_tuple_like<_Tpls>...>::value>::type>
|
|
|
|
constexpr auto
|
2011-09-12 00:10:21 +02:00
|
|
|
tuple_cat(_Tpls&&... __tpls)
|
2011-09-13 02:06:25 +02:00
|
|
|
-> typename __tuple_cat_result<_Tpls...>::__type
|
2011-09-12 00:10:21 +02:00
|
|
|
{
|
|
|
|
typedef typename __tuple_cat_result<_Tpls...>::__type __ret;
|
|
|
|
typedef typename __make_1st_indices<_Tpls...>::__type __idx;
|
|
|
|
typedef __tuple_concater<__ret, __idx, _Tpls...> __concater;
|
|
|
|
return __concater::_S_do(std::forward<_Tpls>(__tpls)...);
|
2007-12-26 16:23:49 +01:00
|
|
|
}
|
|
|
|
|
2015-05-02 13:20:03 +02:00
|
|
|
// _GLIBCXX_RESOLVE_LIB_DEFECTS
|
|
|
|
// 2301. Why is tie not constexpr?
|
2013-02-20 02:52:36 +01:00
|
|
|
/// tie
|
2007-12-26 16:23:49 +01:00
|
|
|
template<typename... _Elements>
|
2015-05-02 13:20:03 +02:00
|
|
|
constexpr tuple<_Elements&...>
|
2011-05-18 02:12:58 +02:00
|
|
|
tie(_Elements&... __args) noexcept
|
2007-12-26 16:23:49 +01:00
|
|
|
{ return tuple<_Elements&...>(__args...); }
|
|
|
|
|
2013-02-20 02:52:36 +01:00
|
|
|
/// swap
|
2008-10-02 00:04:02 +02:00
|
|
|
template<typename... _Elements>
|
2016-06-16 17:07:19 +02:00
|
|
|
inline
|
|
|
|
#if __cplusplus > 201402L || !defined(__STRICT_ANSI__) // c++1z or gnu++11
|
|
|
|
// Constrained free swap overload, see p0185r1
|
|
|
|
typename enable_if<__and_<__is_swappable<_Elements>...>::value
|
|
|
|
>::type
|
|
|
|
#else
|
|
|
|
void
|
|
|
|
#endif
|
2008-10-02 00:04:02 +02:00
|
|
|
swap(tuple<_Elements...>& __x, tuple<_Elements...>& __y)
|
2011-05-18 02:12:58 +02:00
|
|
|
noexcept(noexcept(__x.swap(__y)))
|
2008-10-02 00:04:02 +02:00
|
|
|
{ __x.swap(__y); }
|
|
|
|
|
Implement LWG 2766,
Swapping non-swappable types and LWG 2749,
swappable traits for variants.
* include/bits/move.h (swap(_Tp&, _Tp&)): Constrain
with __is_tuple_like.
* include/bits/stl_pair.h (swap(pair<_T1, _T2>&, pair<_T1, _T2>&)):
Add a deleted overload.
* include/bits/unique_ptr.h
(swap(unique_ptr<_Tp, _Dp>&, unique_ptr<_Tp, _Dp>&)): Likewise.
* include/std/array
(swap(array<_Tp, _Nm>&, array<_Tp, _Nm>&)): Likewise.
* include/std/optional
(swap(optional<_Tp>&, optional<_Tp>&)): Likewise.
* include/std/tuple (__is_tuple_like_impl, __is_tuple_like):
Move to type_traits.
(swap(tuple<_Elements...>&, tuple<_Elements...>&)): Add a deleted
overload.
* include/std/type_traits (__is_tuple_like_impl, __is_tuple_like):
New.
(swap(_Tp&, _Tp&)): Constrain with __is_tuple_like.
* include/std/utility (__is_tuple_like_impl): Move to type_traits.
* include/std/variant
(swap(variant<_Types...>&, variant<_Types...>&)):
Add a deleted overload.
* testsuite/20_util/optional/swap/2.cc: Add tests for disabled
swaps.
* testsuite/20_util/pair/swap_cxx17.cc: New.
* testsuite/20_util/tuple/swap_cxx17.cc: Likewise.
* testsuite/20_util/unique_ptr/specialized_algorithms/swap_cxx17.cc:
Likewise.
* testsuite/20_util/variant/compile.cc: Add tests for disabled
swaps.
* testsuite/23_containers/array/specialized_algorithms/swap_cxx17.cc:
New.
* testsuite/23_containers/array/tuple_interface/get_neg.cc: Adjust.
* testsuite/23_containers/array/tuple_interface/tuple_element_neg.cc:
Likewise.
From-SVN: r243120
2016-12-01 17:23:21 +01:00
|
|
|
#if __cplusplus > 201402L || !defined(__STRICT_ANSI__) // c++1z or gnu++11
|
|
|
|
template<typename... _Elements>
|
|
|
|
typename enable_if<!__and_<__is_swappable<_Elements>...>::value>::type
|
|
|
|
swap(tuple<_Elements...>&, tuple<_Elements...>&) = delete;
|
|
|
|
#endif
|
|
|
|
|
2007-12-26 16:23:49 +01:00
|
|
|
// A class (and instance) which can be used in 'tie' when an element
|
Implement P0607R0 "Inline Variables for Standard Library" for C++17
2017-03-23 Daniel Kruegler <daniel.kruegler@gmail.com>
* include/bits/c++config (_GLIBCXX17_INLINE): Define.
* include/bits/regex_constants.h (All std::regex_constants constants):
Add _GLIBCXX17_INLINE as per P0607R0.
* include/bits/std_mutex.h (defer_lock, try_to_lock, adopt_lock):
Likewise.
* include/bits/stl_pair.h (piecewise_construct): Likewise.
* include/bits/uses_allocator.h (allocator_arg, uses_allocator_v)
(__is_uses_allocator_constructible_v)
(__is_nothrow_uses_allocator_constructible_v): Likewise.
* include/std/chrono (treat_as_floating_point_v): Likewise.
* include/std/functional (is_bind_expression_v, is_placeholder_v):
Likewise.
* include/std/optional (nullopt): Likewise.
* include/std/ratio (ratio_equal_v, ratio_not_equal_v, ratio_less_v)
ratio_less_equal_v, ratio_greater_v, ratio_greater_equal_v): Likewise.
* include/std/system_error (is_error_code_enum_v)
(is_error_condition_enum_v): Likewise.
* include/std/tuple (tuple_size_v, ignore): Likewise.
(ignore): Declare ignore constexpr as per LWG 2773, declare assignment
constexpr as per LWG 2933.
* include/std/type_traits (All variable templates): Add
_GLIBCXX17_INLINE as per P0607R0.
* include/std/variant (variant_size_v, variant_npos, __index_of_v)
(__tuple_count_v, __exactly_once): Likewise.
* testsuite/18_support/headers/new/synopsis.cc
(hardware_destructive_interference_size)
(hardware_constructive_interference_size): Likewise for commented-out
variables.
* testsuite/20_util/tuple/creation_functions/constexpr.cc: Add new
test function for constexpr std::ignore (LWG 2773).
* testsuite/20_util/tuple/creation_functions/constexpr_cpp14.cc: New
test for LWG 2933.
From-SVN: r246423
2017-03-23 20:40:07 +01:00
|
|
|
// of a tuple is not required.
|
|
|
|
// _GLIBCXX14_CONSTEXPR
|
|
|
|
// 2933. PR for LWG 2773 could be clearer
|
2007-12-26 16:23:49 +01:00
|
|
|
struct _Swallow_assign
|
|
|
|
{
|
|
|
|
template<class _Tp>
|
Implement P0607R0 "Inline Variables for Standard Library" for C++17
2017-03-23 Daniel Kruegler <daniel.kruegler@gmail.com>
* include/bits/c++config (_GLIBCXX17_INLINE): Define.
* include/bits/regex_constants.h (All std::regex_constants constants):
Add _GLIBCXX17_INLINE as per P0607R0.
* include/bits/std_mutex.h (defer_lock, try_to_lock, adopt_lock):
Likewise.
* include/bits/stl_pair.h (piecewise_construct): Likewise.
* include/bits/uses_allocator.h (allocator_arg, uses_allocator_v)
(__is_uses_allocator_constructible_v)
(__is_nothrow_uses_allocator_constructible_v): Likewise.
* include/std/chrono (treat_as_floating_point_v): Likewise.
* include/std/functional (is_bind_expression_v, is_placeholder_v):
Likewise.
* include/std/optional (nullopt): Likewise.
* include/std/ratio (ratio_equal_v, ratio_not_equal_v, ratio_less_v)
ratio_less_equal_v, ratio_greater_v, ratio_greater_equal_v): Likewise.
* include/std/system_error (is_error_code_enum_v)
(is_error_condition_enum_v): Likewise.
* include/std/tuple (tuple_size_v, ignore): Likewise.
(ignore): Declare ignore constexpr as per LWG 2773, declare assignment
constexpr as per LWG 2933.
* include/std/type_traits (All variable templates): Add
_GLIBCXX17_INLINE as per P0607R0.
* include/std/variant (variant_size_v, variant_npos, __index_of_v)
(__tuple_count_v, __exactly_once): Likewise.
* testsuite/18_support/headers/new/synopsis.cc
(hardware_destructive_interference_size)
(hardware_constructive_interference_size): Likewise for commented-out
variables.
* testsuite/20_util/tuple/creation_functions/constexpr.cc: Add new
test function for constexpr std::ignore (LWG 2773).
* testsuite/20_util/tuple/creation_functions/constexpr_cpp14.cc: New
test for LWG 2933.
From-SVN: r246423
2017-03-23 20:40:07 +01:00
|
|
|
_GLIBCXX14_CONSTEXPR const _Swallow_assign&
|
2010-06-11 17:02:33 +02:00
|
|
|
operator=(const _Tp&) const
|
2007-12-26 16:23:49 +01:00
|
|
|
{ return *this; }
|
|
|
|
};
|
|
|
|
|
Implement P0607R0 "Inline Variables for Standard Library" for C++17
2017-03-23 Daniel Kruegler <daniel.kruegler@gmail.com>
* include/bits/c++config (_GLIBCXX17_INLINE): Define.
* include/bits/regex_constants.h (All std::regex_constants constants):
Add _GLIBCXX17_INLINE as per P0607R0.
* include/bits/std_mutex.h (defer_lock, try_to_lock, adopt_lock):
Likewise.
* include/bits/stl_pair.h (piecewise_construct): Likewise.
* include/bits/uses_allocator.h (allocator_arg, uses_allocator_v)
(__is_uses_allocator_constructible_v)
(__is_nothrow_uses_allocator_constructible_v): Likewise.
* include/std/chrono (treat_as_floating_point_v): Likewise.
* include/std/functional (is_bind_expression_v, is_placeholder_v):
Likewise.
* include/std/optional (nullopt): Likewise.
* include/std/ratio (ratio_equal_v, ratio_not_equal_v, ratio_less_v)
ratio_less_equal_v, ratio_greater_v, ratio_greater_equal_v): Likewise.
* include/std/system_error (is_error_code_enum_v)
(is_error_condition_enum_v): Likewise.
* include/std/tuple (tuple_size_v, ignore): Likewise.
(ignore): Declare ignore constexpr as per LWG 2773, declare assignment
constexpr as per LWG 2933.
* include/std/type_traits (All variable templates): Add
_GLIBCXX17_INLINE as per P0607R0.
* include/std/variant (variant_size_v, variant_npos, __index_of_v)
(__tuple_count_v, __exactly_once): Likewise.
* testsuite/18_support/headers/new/synopsis.cc
(hardware_destructive_interference_size)
(hardware_constructive_interference_size): Likewise for commented-out
variables.
* testsuite/20_util/tuple/creation_functions/constexpr.cc: Add new
test function for constexpr std::ignore (LWG 2773).
* testsuite/20_util/tuple/creation_functions/constexpr_cpp14.cc: New
test for LWG 2933.
From-SVN: r246423
2017-03-23 20:40:07 +01:00
|
|
|
// _GLIBCXX_RESOLVE_LIB_DEFECTS
|
|
|
|
// 2773. Making std::ignore constexpr
|
|
|
|
_GLIBCXX17_INLINE constexpr _Swallow_assign ignore{};
|
2010-04-30 11:52:41 +02:00
|
|
|
|
2011-05-30 18:31:17 +02:00
|
|
|
/// Partial specialization for tuples
|
|
|
|
template<typename... _Types, typename _Alloc>
|
|
|
|
struct uses_allocator<tuple<_Types...>, _Alloc> : true_type { };
|
|
|
|
|
2010-04-30 11:52:41 +02:00
|
|
|
// See stl_pair.h...
|
2019-05-08 00:46:56 +02:00
|
|
|
/** "piecewise construction" using a tuple of arguments for each member.
|
|
|
|
*
|
|
|
|
* @param __first Arguments for the first member of the pair.
|
|
|
|
* @param __second Arguments for the second member of the pair.
|
|
|
|
*
|
|
|
|
* The elements of each tuple will be used as the constructor arguments
|
|
|
|
* for the data members of the pair.
|
|
|
|
*/
|
2010-04-30 11:52:41 +02:00
|
|
|
template<class _T1, class _T2>
|
re PR libstdc++/51183 (pair piecewise_construct_t constructor copies)
2011-12-06 Jonathan Wakely <jwakely.gcc@gmail.com>
Chris Jefferson <chris@bubblescope.net>
PR libstdc++/51183
* include/std/stl_pair.h (pair<>::__cons, pair<>::__do_cons): Remove.
(pair<>::pair(piecewise_construct_t, tuple<>, tuple<>): Only declare.
(pair<>::pair(tuple<>&, tuple<>&, _Index_tuple<>, _Index_tuple<>)):
Declare.
* include/std/tuple (pair<>::__cons, pair<>::__do_cons): Remove.
(pair<>::pair(tuple<>&, tuple<>&, _Index_tuple<>, _Index_tuple<>)):
Define.
(pair<>::pair(piecewise_construct_t, tuple<>, tuple<>): Define,
delegating to the latter.
* testsuite/20_util/pair/piecewise2.cc: New.
Co-Authored-By: Chris Jefferson <chris@bubblescope.net>
From-SVN: r182054
2011-12-06 16:13:04 +01:00
|
|
|
template<typename... _Args1, typename... _Args2>
|
|
|
|
inline
|
|
|
|
pair<_T1, _T2>::
|
|
|
|
pair(piecewise_construct_t,
|
|
|
|
tuple<_Args1...> __first, tuple<_Args2...> __second)
|
|
|
|
: pair(__first, __second,
|
|
|
|
typename _Build_index_tuple<sizeof...(_Args1)>::__type(),
|
|
|
|
typename _Build_index_tuple<sizeof...(_Args2)>::__type())
|
|
|
|
{ }
|
2010-04-30 11:52:41 +02:00
|
|
|
|
|
|
|
template<class _T1, class _T2>
|
re PR libstdc++/51183 (pair piecewise_construct_t constructor copies)
2011-12-06 Jonathan Wakely <jwakely.gcc@gmail.com>
Chris Jefferson <chris@bubblescope.net>
PR libstdc++/51183
* include/std/stl_pair.h (pair<>::__cons, pair<>::__do_cons): Remove.
(pair<>::pair(piecewise_construct_t, tuple<>, tuple<>): Only declare.
(pair<>::pair(tuple<>&, tuple<>&, _Index_tuple<>, _Index_tuple<>)):
Declare.
* include/std/tuple (pair<>::__cons, pair<>::__do_cons): Remove.
(pair<>::pair(tuple<>&, tuple<>&, _Index_tuple<>, _Index_tuple<>)):
Define.
(pair<>::pair(piecewise_construct_t, tuple<>, tuple<>): Define,
delegating to the latter.
* testsuite/20_util/pair/piecewise2.cc: New.
Co-Authored-By: Chris Jefferson <chris@bubblescope.net>
From-SVN: r182054
2011-12-06 16:13:04 +01:00
|
|
|
template<typename... _Args1, std::size_t... _Indexes1,
|
|
|
|
typename... _Args2, std::size_t... _Indexes2>
|
|
|
|
inline
|
|
|
|
pair<_T1, _T2>::
|
|
|
|
pair(tuple<_Args1...>& __tuple1, tuple<_Args2...>& __tuple2,
|
|
|
|
_Index_tuple<_Indexes1...>, _Index_tuple<_Indexes2...>)
|
|
|
|
: first(std::forward<_Args1>(std::get<_Indexes1>(__tuple1))...),
|
|
|
|
second(std::forward<_Args2>(std::get<_Indexes2>(__tuple2))...)
|
|
|
|
{ }
|
2010-11-02 19:51:23 +01:00
|
|
|
|
2019-04-24 18:25:17 +02:00
|
|
|
#if __cplusplus >= 201703L
|
2016-08-06 02:06:02 +02:00
|
|
|
# define __cpp_lib_apply 201603
|
|
|
|
|
|
|
|
template <typename _Fn, typename _Tuple, size_t... _Idx>
|
|
|
|
constexpr decltype(auto)
|
|
|
|
__apply_impl(_Fn&& __f, _Tuple&& __t, index_sequence<_Idx...>)
|
|
|
|
{
|
|
|
|
return std::__invoke(std::forward<_Fn>(__f),
|
|
|
|
std::get<_Idx>(std::forward<_Tuple>(__t))...);
|
|
|
|
}
|
|
|
|
|
|
|
|
template <typename _Fn, typename _Tuple>
|
|
|
|
constexpr decltype(auto)
|
|
|
|
apply(_Fn&& __f, _Tuple&& __t)
|
|
|
|
{
|
2019-04-24 18:25:17 +02:00
|
|
|
using _Indices
|
|
|
|
= make_index_sequence<tuple_size_v<remove_reference_t<_Tuple>>>;
|
2016-08-19 17:42:11 +02:00
|
|
|
return std::__apply_impl(std::forward<_Fn>(__f),
|
|
|
|
std::forward<_Tuple>(__t),
|
|
|
|
_Indices{});
|
2016-08-06 02:06:02 +02:00
|
|
|
}
|
2016-08-11 16:51:47 +02:00
|
|
|
|
2016-08-15 14:46:47 +02:00
|
|
|
#define __cpp_lib_make_from_tuple 201606
|
|
|
|
|
2016-08-11 16:51:47 +02:00
|
|
|
template <typename _Tp, typename _Tuple, size_t... _Idx>
|
|
|
|
constexpr _Tp
|
|
|
|
__make_from_tuple_impl(_Tuple&& __t, index_sequence<_Idx...>)
|
2016-08-15 14:46:47 +02:00
|
|
|
{ return _Tp(std::get<_Idx>(std::forward<_Tuple>(__t))...); }
|
2016-08-11 16:51:47 +02:00
|
|
|
|
|
|
|
template <typename _Tp, typename _Tuple>
|
|
|
|
constexpr _Tp
|
|
|
|
make_from_tuple(_Tuple&& __t)
|
|
|
|
{
|
|
|
|
return __make_from_tuple_impl<_Tp>(
|
|
|
|
std::forward<_Tuple>(__t),
|
2019-05-17 11:28:13 +02:00
|
|
|
make_index_sequence<tuple_size_v<remove_reference_t<_Tuple>>>{});
|
2016-08-11 16:51:47 +02:00
|
|
|
}
|
2016-08-06 02:06:02 +02:00
|
|
|
#endif // C++17
|
|
|
|
|
2013-02-20 02:52:36 +01:00
|
|
|
/// @}
|
|
|
|
|
PR libstdc++/36104 part four
2011-01-30 Benjamin Kosnik <bkoz@redhat.com>
PR libstdc++/36104 part four
* include/bits/c++config (_GLIBCXX_STD): Remove.
(_GLIBCXX_STD_D, _GLIBCXX_PR): Now _GLIBCXX_STD_C.
(_GLIBCXX_P): Now _GLIBCXX_STD_A.
(_GLIBCXX_NAMESPACE_DEBUG, _GLIBCXX_NAMESPACE_PARALLEL,
_GLIBCXX_NAMESPACE_PROFILE, _GLIBCXX_NAMESPACE_VERSION): Remove.
(_GLIBCXX_INLINE_DEBUG, _GLIBCXX_INLINE_PARALLEL,
_GLIBCXX_INLINE_PROFILE): Remove.
(_GLIBCXX_BEGIN_NAMESPACE(X)): Remove.
(_GLIBCXX_END_NAMESPACE): Remove.
(_GLIBCXX_BEGIN_NESTED_NAMESPACE(X, Y)): Remove.
(_GLIBCXX_END_NESTED_NAMESPACE): Remove.
(_GLIBCXX_BEGIN_NAMESPACE_ALGO): Add.
(_GLIBCXX_END_NAMESPACE_ALGO): Add.
(_GLIBCXX_BEGIN_NAMESPACE_CONTAINER): Add.
(_GLIBCXX_END_NAMESPACE_CONTAINER): Add.
(_GLIBCXX_BEGIN_NAMESPACE_VERSION): Add.
(_GLIBCXX_END_NAMESPACE_VERSION): Add.
(_GLIBCXX_BEGIN_LDBL_NAMESPACE): To _GLIBCXX_BEGIN_NAMESPACE_LDBL.
(_GLIBCXX_END_LDBL_NAMESPACE): To _GLIBCXX_END_NAMESPACE_LDBL.
(_GLIBCXX_VISIBILITY_ATTR): Revert to _GLIBCXX_VISIBILITY.
* include/*: Use new macros for namespace scope.
* config/*: Same.
* src/*: Same.
* src/Makefile.am (sources): Remove debug_list.cc, add
compatibility-debug_list-2.cc.
(parallel_sources): Remove parallel_list.cc, add
compatibility-parallel_list-2.cc.
(compatibility-parallel_list-2.[o,lo]): New rule.
* src/Makefile.in: Regenerate.
* src/debug_list.cc: Remove.
* src/parallel_list.cc: Remove.
* src/compatibility-list-2.cc: New.
* src/compatibility-debug_list-2.cc: New.
* src/compatibility-parallel_list-2.cc: New.
* doc/doxygen/user.cfg.in: Adjust macros.
* testsuite/20_util/auto_ptr/assign_neg.cc: Adjust line numbers, macros.
* testsuite/20_util/declval/requirements/1_neg.cc: Same.
* testsuite/20_util/duration/requirements/typedefs_neg1.cc: Same.
* testsuite/20_util/duration/requirements/typedefs_neg2.cc: Same.
* testsuite/20_util/duration/requirements/typedefs_neg3.cc: Same.
* testsuite/20_util/forward/c_neg.cc: Same.
* testsuite/20_util/forward/f_neg.cc: Same.
* testsuite/20_util/make_signed/requirements/typedefs_neg.cc: Same.
* testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc: Same.
* testsuite/20_util/ratio/cons/cons_overflow_neg.cc: Same.
* testsuite/20_util/ratio/operations/ops_overflow_neg.cc: Same.
* testsuite/20_util/shared_ptr/cons/43820_neg.cc: Same.
* testsuite/20_util/weak_ptr/comparison/cmp_neg.cc: Same.
* testsuite/23_containers/deque/requirements/dr438/assign_neg.cc: Same.
* testsuite/23_containers/deque/requirements/dr438/
constructor_1_neg.cc: Same.
* testsuite/23_containers/deque/requirements/dr438/
constructor_2_neg.cc: Same.
* testsuite/23_containers/deque/requirements/dr438/insert_neg.cc: Same.
* testsuite/23_containers/forward_list/capacity/1.cc: Same.
* testsuite/23_containers/forward_list/requirements/dr438/
assign_neg.cc: Same.
* testsuite/23_containers/forward_list/requirements/dr438/
constructor_1_neg.cc: Same.
* testsuite/23_containers/forward_list/requirements/dr438/
constructor_2_neg.cc: Same.
* testsuite/23_containers/forward_list/requirements/dr438/
insert_neg.cc: Same.
* testsuite/23_containers/list/capacity/29134.cc: Same.
* testsuite/23_containers/list/requirements/dr438/assign_neg.cc: Same.
* testsuite/23_containers/list/requirements/dr438/
constructor_1_neg.cc: Same.
* testsuite/23_containers/list/requirements/dr438/
constructor_2_neg.cc: Same.
* testsuite/23_containers/list/requirements/dr438/insert_neg.cc: Same.
* testsuite/23_containers/vector/bool/capacity/29134.cc: Same.
* testsuite/23_containers/vector/bool/modifiers/insert/31370.cc: Same.
* testsuite/23_containers/vector/requirements/dr438/assign_neg.cc: Same.
* testsuite/23_containers/vector/requirements/dr438/
constructor_1_neg.cc: Same.
* testsuite/23_containers/vector/requirements/dr438/
constructor_2_neg.cc: Same.
* testsuite/23_containers/vector/requirements/dr438/insert_neg.cc: Same.
* testsuite/25_algorithms/sort/35588.cc: Same.
* testsuite/27_io/ios_base/cons/assign_neg.cc: Same.
* testsuite/27_io/ios_base/cons/copy_neg.cc: Same.
* testsuite/ext/profile/mutex_extensions_neg.cc: Same.
* testsuite/ext/profile/profiler_algos.cc: Same.
* testsuite/ext/type_traits/add_unsigned_floating_neg.cc: Same.
* testsuite/ext/type_traits/add_unsigned_integer_neg.cc: Same.
* testsuite/ext/type_traits/remove_unsigned_floating_neg.cc: Same.
* testsuite/ext/type_traits/remove_unsigned_integer_neg.cc: Same.
* testsuite/tr1/2_general_utilities/shared_ptr/cons/43820_neg.cc: Same.
From-SVN: r169421
2011-01-30 23:39:36 +01:00
|
|
|
_GLIBCXX_END_NAMESPACE_VERSION
|
2013-02-20 02:52:36 +01:00
|
|
|
} // namespace std
|
2007-03-04 23:59:49 +01:00
|
|
|
|
2012-11-10 18:27:22 +01:00
|
|
|
#endif // C++11
|
2008-05-26 04:19:57 +02:00
|
|
|
|
2008-04-10 21:02:57 +02:00
|
|
|
#endif // _GLIBCXX_TUPLE
|