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#ifndef _LIBCPP_CXX03_LANG
19
20_LIBCPP_BEGIN_NAMESPACE_STD
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
39# if _LIBCPP_STD_VER >= 17
40
41template <bool _CanCopy, bool _CanMove>
42struct __sfinae_ctor_base {};
43template <>
44struct __sfinae_ctor_base<false, false> {
45 __sfinae_ctor_base() = default;
46 __sfinae_ctor_base(__sfinae_ctor_base const&) = delete;
47 __sfinae_ctor_base(__sfinae_ctor_base&&) = delete;
48 __sfinae_ctor_base& operator=(__sfinae_ctor_base const&) = default;
49 __sfinae_ctor_base& operator=(__sfinae_ctor_base&&) = default;
50};
51template <>
52struct __sfinae_ctor_base<true, false> {
53 __sfinae_ctor_base() = default;
54 __sfinae_ctor_base(__sfinae_ctor_base const&) = default;
55 __sfinae_ctor_base(__sfinae_ctor_base&&) = delete;
56 __sfinae_ctor_base& operator=(__sfinae_ctor_base const&) = default;
57 __sfinae_ctor_base& operator=(__sfinae_ctor_base&&) = default;
58};
59template <>
60struct __sfinae_ctor_base<false, true> {
61 __sfinae_ctor_base() = default;
62 __sfinae_ctor_base(__sfinae_ctor_base const&) = delete;
63 __sfinae_ctor_base(__sfinae_ctor_base&&) = default;
64 __sfinae_ctor_base& operator=(__sfinae_ctor_base const&) = default;
65 __sfinae_ctor_base& operator=(__sfinae_ctor_base&&) = default;
66};
67
68template <bool _CanCopy, bool _CanMove>
69struct __sfinae_assign_base {};
70template <>
71struct __sfinae_assign_base<false, false> {
72 __sfinae_assign_base() = default;
73 __sfinae_assign_base(__sfinae_assign_base const&) = default;
74 __sfinae_assign_base(__sfinae_assign_base&&) = default;
75 __sfinae_assign_base& operator=(__sfinae_assign_base const&) = delete;
76 __sfinae_assign_base& operator=(__sfinae_assign_base&&) = delete;
77};
78template <>
79struct __sfinae_assign_base<true, false> {
80 __sfinae_assign_base() = default;
81 __sfinae_assign_base(__sfinae_assign_base const&) = default;
82 __sfinae_assign_base(__sfinae_assign_base&&) = default;
83 __sfinae_assign_base& operator=(__sfinae_assign_base const&) = default;
84 __sfinae_assign_base& operator=(__sfinae_assign_base&&) = delete;
85};
86template <>
87struct __sfinae_assign_base<false, true> {
88 __sfinae_assign_base() = default;
89 __sfinae_assign_base(__sfinae_assign_base const&) = default;
90 __sfinae_assign_base(__sfinae_assign_base&&) = default;
91 __sfinae_assign_base& operator=(__sfinae_assign_base const&) = delete;
92 __sfinae_assign_base& operator=(__sfinae_assign_base&&) = default;
93};
94# endif // _LIBCPP_STD_VER >= 17
95
96_LIBCPP_END_NAMESPACE_STD
97
98#endif // !defined(_LIBCPP_CXX03_LANG)
99
100#endif // _LIBCPP___TUPLE_SFINAE_HELPERS_H
101