diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2015-12-30 11:54:09 +0000 |
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2015-12-30 11:54:09 +0000 |
| commit | b4c64ad90b81d2a779786b7edb4c5c6dd28cc57d (patch) | |
| tree | 13f237c02db4d1894ab06884d1b739344766bede /include/tuple | |
| parent | 61b9a7258a7693d7f3674a5a1daf7b036ff1d382 (diff) | |
Notes
Diffstat (limited to 'include/tuple')
| -rw-r--r-- | include/tuple | 42 |
1 files changed, 33 insertions, 9 deletions
diff --git a/include/tuple b/include/tuple index 3a22aa5ff5ace..cb1e27d93cf26 100644 --- a/include/tuple +++ b/include/tuple @@ -80,28 +80,33 @@ template <class... Tuples> tuple<CTypes...> tuple_cat(Tuples&&... tpls); // cons // 20.4.1.4, tuple helper classes: template <class T> class tuple_size; // undefined template <class... T> class tuple_size<tuple<T...>>; -template <intsize_t I, class T> class tuple_element; // undefined -template <intsize_t I, class... T> class tuple_element<I, tuple<T...>>; -template <size_t _Ip, class ..._Tp> - using tuple_element_t = typename tuple_element <_Ip, _Tp...>::type; // C++14 +template <size_t I, class T> class tuple_element; // undefined +template <size_t I, class... T> class tuple_element<I, tuple<T...>>; +template <size_t I, class T> + using tuple_element_t = typename tuple_element <I, T>::type; // C++14 // 20.4.1.5, element access: -template <intsize_t I, class... T> +template <size_t I, class... T> typename tuple_element<I, tuple<T...>>::type& get(tuple<T...>&) noexcept; // constexpr in C++14 -template <intsize_t I, class... T> - typename const tuple_element<I, tuple<T...>>::type & +template <size_t I, class... T> + const typename tuple_element<I, tuple<T...>>::type& get(const tuple<T...>&) noexcept; // constexpr in C++14 -template <intsize_t I, class... T> +template <size_t I, class... T> typename tuple_element<I, tuple<T...>>::type&& get(tuple<T...>&&) noexcept; // constexpr in C++14 +template <size_t I, class... T> + const typename tuple_element<I, tuple<T...>>::type&& + get(const tuple<T...>&&) noexcept; // constexpr in C++14 template <class T1, class... T> constexpr T1& get(tuple<T...>&) noexcept; // C++14 template <class T1, class... T> - constexpr T1 const& get(const tuple<T...>&) noexcept; // C++14 + constexpr const T1& get(const tuple<T...>&) noexcept; // C++14 template <class T1, class... T> constexpr T1&& get(tuple<T...>&&) noexcept; // C++14 +template <class T1, class... T> + constexpr const T1&& get(const tuple<T...>&&) noexcept; // C++14 // 20.4.1.6, relational operators: template<class... T, class... U> bool operator==(const tuple<T...>&, const tuple<U...>&); // constexpr in C++14 @@ -507,6 +512,8 @@ class _LIBCPP_TYPE_VIS_ONLY tuple const typename tuple_element<_Jp, tuple<_Up...> >::type& get(const tuple<_Up...>&) _NOEXCEPT; template <size_t _Jp, class ..._Up> friend _LIBCPP_CONSTEXPR_AFTER_CXX11 typename tuple_element<_Jp, tuple<_Up...> >::type&& get(tuple<_Up...>&&) _NOEXCEPT; + template <size_t _Jp, class ..._Up> friend _LIBCPP_CONSTEXPR_AFTER_CXX11 + const typename tuple_element<_Jp, tuple<_Up...> >::type&& get(const tuple<_Up...>&&) _NOEXCEPT; public: template <bool _Dummy = true, class = typename enable_if< @@ -766,6 +773,16 @@ get(tuple<_Tp...>&& __t) _NOEXCEPT static_cast<__tuple_leaf<_Ip, type>&&>(__t.base_).get()); } +template <size_t _Ip, class ..._Tp> +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 +const typename tuple_element<_Ip, tuple<_Tp...> >::type&& +get(const tuple<_Tp...>&& __t) _NOEXCEPT +{ + typedef typename tuple_element<_Ip, tuple<_Tp...> >::type type; + return static_cast<const type&&>( + static_cast<const __tuple_leaf<_Ip, type>&&>(__t.base_).get()); +} + #if _LIBCPP_STD_VER > 11 // get by type template <typename _T1, size_t _Idx, typename... _Args> @@ -822,6 +839,13 @@ constexpr _T1&& get(tuple<_Args...>&& __tup) noexcept return _VSTD::get<__find_exactly_one_t<_T1, _Args...>::value>(_VSTD::move(__tup)); } +template <class _T1, class... _Args> +inline _LIBCPP_INLINE_VISIBILITY +constexpr _T1 const&& get(tuple<_Args...> const&& __tup) noexcept +{ + return _VSTD::get<__find_exactly_one_t<_T1, _Args...>::value>(_VSTD::move(__tup)); +} + #endif // tie |
