1//===----------------------------------------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef _LIBCPP___TUPLE_SFINAE_HELPERS_H
10#define _LIBCPP___TUPLE_SFINAE_HELPERS_H
11
12#include <__config>
13
14#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
15# pragma GCC system_header
16#endif
17
18_LIBCPP_BEGIN_NAMESPACE_STD
19
20#ifndef _LIBCPP_CXX03_LANG
21
22struct __check_tuple_constructor_fail {
23 static _LIBCPP_HIDE_FROM_ABI constexpr bool __enable_explicit_default() { return false; }
24 static _LIBCPP_HIDE_FROM_ABI constexpr bool __enable_implicit_default() { return false; }
25 template <class...>
26 static _LIBCPP_HIDE_FROM_ABI constexpr bool __enable_explicit() {
27 return false;
28 }
29 template <class...>
30 static _LIBCPP_HIDE_FROM_ABI constexpr bool __enable_implicit() {
31 return false;
32 }
33 template <class...>
34 static _LIBCPP_HIDE_FROM_ABI constexpr bool __enable_assign() {
35 return false;
36 }
37};
38#endif // !defined(_LIBCPP_CXX03_LANG)
39
40#if _LIBCPP_STD_VER >= 17
41
42template <bool _CanCopy, bool _CanMove>
43struct __sfinae_ctor_base {};
44template <>
45struct __sfinae_ctor_base<false, false> {
46 __sfinae_ctor_base() = default;
47 __sfinae_ctor_base(__sfinae_ctor_base const&) = delete;
48 __sfinae_ctor_base(__sfinae_ctor_base&&) = delete;
49 __sfinae_ctor_base& operator=(__sfinae_ctor_base const&) = default;
50 __sfinae_ctor_base& operator=(__sfinae_ctor_base&&) = default;
51};
52template <>
53struct __sfinae_ctor_base<true, false> {
54 __sfinae_ctor_base() = default;
55 __sfinae_ctor_base(__sfinae_ctor_base const&) = default;
56 __sfinae_ctor_base(__sfinae_ctor_base&&) = delete;
57 __sfinae_ctor_base& operator=(__sfinae_ctor_base const&) = default;
58 __sfinae_ctor_base& operator=(__sfinae_ctor_base&&) = default;
59};
60template <>
61struct __sfinae_ctor_base<false, true> {
62 __sfinae_ctor_base() = default;
63 __sfinae_ctor_base(__sfinae_ctor_base const&) = delete;
64 __sfinae_ctor_base(__sfinae_ctor_base&&) = default;
65 __sfinae_ctor_base& operator=(__sfinae_ctor_base const&) = default;
66 __sfinae_ctor_base& operator=(__sfinae_ctor_base&&) = default;
67};
68
69template <bool _CanCopy, bool _CanMove>
70struct __sfinae_assign_base {};
71template <>
72struct __sfinae_assign_base<false, false> {
73 __sfinae_assign_base() = default;
74 __sfinae_assign_base(__sfinae_assign_base const&) = default;
75 __sfinae_assign_base(__sfinae_assign_base&&) = default;
76 __sfinae_assign_base& operator=(__sfinae_assign_base const&) = delete;
77 __sfinae_assign_base& operator=(__sfinae_assign_base&&) = delete;
78};
79template <>
80struct __sfinae_assign_base<true, false> {
81 __sfinae_assign_base() = default;
82 __sfinae_assign_base(__sfinae_assign_base const&) = default;
83 __sfinae_assign_base(__sfinae_assign_base&&) = default;
84 __sfinae_assign_base& operator=(__sfinae_assign_base const&) = default;
85 __sfinae_assign_base& operator=(__sfinae_assign_base&&) = delete;
86};
87template <>
88struct __sfinae_assign_base<false, true> {
89 __sfinae_assign_base() = default;
90 __sfinae_assign_base(__sfinae_assign_base const&) = default;
91 __sfinae_assign_base(__sfinae_assign_base&&) = default;
92 __sfinae_assign_base& operator=(__sfinae_assign_base const&) = delete;
93 __sfinae_assign_base& operator=(__sfinae_assign_base&&) = default;
94};
95#endif // _LIBCPP_STD_VER >= 17
96
97_LIBCPP_END_NAMESPACE_STD
98
99#endif // _LIBCPP___TUPLE_SFINAE_HELPERS_H
100