100 lines · c
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-exception6//7//===----------------------------------------------------------------------===//8 9#ifndef _LIBCPP___TUPLE_SFINAE_HELPERS_H10#define _LIBCPP___TUPLE_SFINAE_HELPERS_H11 12#include <__config>13 14#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)15# pragma GCC system_header16#endif17 18_LIBCPP_BEGIN_NAMESPACE_STD19 20#ifndef _LIBCPP_CXX03_LANG21 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 >= 1741 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 >= 1796 97_LIBCPP_END_NAMESPACE_STD98 99#endif // _LIBCPP___TUPLE_SFINAE_HELPERS_H100