106c3fb27SDimitry Andric //===----------------------------------------------------------------------===//
206c3fb27SDimitry Andric //
306c3fb27SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
406c3fb27SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
506c3fb27SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
606c3fb27SDimitry Andric //
706c3fb27SDimitry Andric //===----------------------------------------------------------------------===//
806c3fb27SDimitry Andric 
906c3fb27SDimitry Andric #ifndef _LIBCPP___TUPLE_TUPLE_LIKE_EXT_H
1006c3fb27SDimitry Andric #define _LIBCPP___TUPLE_TUPLE_LIKE_EXT_H
1106c3fb27SDimitry Andric 
1206c3fb27SDimitry Andric #include <__config>
1306c3fb27SDimitry Andric #include <__fwd/array.h>
1406c3fb27SDimitry Andric #include <__fwd/pair.h>
1506c3fb27SDimitry Andric #include <__fwd/tuple.h>
1606c3fb27SDimitry Andric #include <__tuple/tuple_types.h>
1706c3fb27SDimitry Andric #include <__type_traits/integral_constant.h>
1806c3fb27SDimitry Andric #include <cstddef>
1906c3fb27SDimitry Andric 
2006c3fb27SDimitry Andric #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
2106c3fb27SDimitry Andric #  pragma GCC system_header
2206c3fb27SDimitry Andric #endif
2306c3fb27SDimitry Andric 
2406c3fb27SDimitry Andric _LIBCPP_BEGIN_NAMESPACE_STD
2506c3fb27SDimitry Andric 
26*cb14a3feSDimitry Andric template <class _Tp>
27*cb14a3feSDimitry Andric struct __tuple_like_ext : false_type {};
2806c3fb27SDimitry Andric 
29*cb14a3feSDimitry Andric template <class _Tp>
30*cb14a3feSDimitry Andric struct __tuple_like_ext<const _Tp> : public __tuple_like_ext<_Tp> {};
31*cb14a3feSDimitry Andric template <class _Tp>
32*cb14a3feSDimitry Andric struct __tuple_like_ext<volatile _Tp> : public __tuple_like_ext<_Tp> {};
33*cb14a3feSDimitry Andric template <class _Tp>
34*cb14a3feSDimitry Andric struct __tuple_like_ext<const volatile _Tp> : public __tuple_like_ext<_Tp> {};
3506c3fb27SDimitry Andric 
3606c3fb27SDimitry Andric #ifndef _LIBCPP_CXX03_LANG
37*cb14a3feSDimitry Andric template <class... _Tp>
38*cb14a3feSDimitry Andric struct __tuple_like_ext<tuple<_Tp...> > : true_type {};
3906c3fb27SDimitry Andric #endif
4006c3fb27SDimitry Andric 
41*cb14a3feSDimitry Andric template <class _T1, class _T2>
42*cb14a3feSDimitry Andric struct __tuple_like_ext<pair<_T1, _T2> > : true_type {};
4306c3fb27SDimitry Andric 
44*cb14a3feSDimitry Andric template <class _Tp, size_t _Size>
45*cb14a3feSDimitry Andric struct __tuple_like_ext<array<_Tp, _Size> > : true_type {};
4606c3fb27SDimitry Andric 
47*cb14a3feSDimitry Andric template <class... _Tp>
48*cb14a3feSDimitry Andric struct __tuple_like_ext<__tuple_types<_Tp...> > : true_type {};
4906c3fb27SDimitry Andric 
5006c3fb27SDimitry Andric _LIBCPP_END_NAMESPACE_STD
5106c3fb27SDimitry Andric 
5206c3fb27SDimitry Andric #endif // _LIBCPP___TUPLE_TUPLE_LIKE_EXT_H
53