1234353Sdim//===----------------------------------------------------------------------===//
2198090Srdivacky//
3198090Srdivacky// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4198090Srdivacky// See https://llvm.org/LICENSE.txt for license information.
5198090Srdivacky// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6198090Srdivacky//
7198090Srdivacky//===----------------------------------------------------------------------===//
8198090Srdivacky
9198090Srdivacky#ifndef _LIBCPP___TUPLE_TUPLE_LIKE_H
10198090Srdivacky#define _LIBCPP___TUPLE_TUPLE_LIKE_H
11198090Srdivacky
12198090Srdivacky#include <__config>
13198090Srdivacky#include <__fwd/array.h>
14198090Srdivacky#include <__fwd/pair.h>
15198090Srdivacky#include <__fwd/subrange.h>
16198090Srdivacky#include <__fwd/tuple.h>
17198090Srdivacky#include <__type_traits/integral_constant.h>
18198090Srdivacky#include <__type_traits/remove_cvref.h>
19198090Srdivacky#include <cstddef>
20224145Sdim
21224145Sdim#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
22224145Sdim#  pragma GCC system_header
23198090Srdivacky#endif
24198090Srdivacky
25198090Srdivacky_LIBCPP_BEGIN_NAMESPACE_STD
26198090Srdivacky
27198090Srdivacky#if _LIBCPP_STD_VER >= 20
28198090Srdivacky
29198090Srdivackytemplate <class _Tp>
30198090Srdivackystruct __tuple_like_impl : false_type {};
31198090Srdivacky
32198090Srdivackytemplate <class... _Tp>
33198090Srdivackystruct __tuple_like_impl<tuple<_Tp...> > : true_type {};
34198090Srdivacky
35198090Srdivackytemplate <class _T1, class _T2>
36218893Sdimstruct __tuple_like_impl<pair<_T1, _T2> > : true_type {};
37218893Sdim
38234353Sdimtemplate <class _Tp, size_t _Size>
39218893Sdimstruct __tuple_like_impl<array<_Tp, _Size> > : true_type {};
40218893Sdim
41218893Sdimtemplate <class _Ip, class _Sp, ranges::subrange_kind _Kp>
42218893Sdimstruct __tuple_like_impl<ranges::subrange<_Ip, _Sp, _Kp> > : true_type {};
43218893Sdim
44218893Sdimtemplate <class _Tp>
45218893Sdimconcept __tuple_like = __tuple_like_impl<remove_cvref_t<_Tp>>::value;
46234353Sdim
47234353Sdim#endif // _LIBCPP_STD_VER >= 20
48218893Sdim
49218893Sdim_LIBCPP_END_NAMESPACE_STD
50218893Sdim
51218893Sdim#endif // _LIBCPP___TUPLE_TUPLE_LIKE_H
52218893Sdim