| //===----------------------------------------------------------------------===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef DEFINE_BASE |
| #define DEFINE_BASE(Name) ::ArchetypeBases::NullBase |
| #endif |
| #ifndef DEFINE_EXPLICIT |
| #define DEFINE_EXPLICIT |
| #endif |
| #ifndef DEFINE_NOEXCEPT |
| #define DEFINE_NOEXCEPT |
| #endif |
| #ifndef DEFINE_CONSTEXPR |
| #ifdef TEST_WORKAROUND_EDG_EXPLICIT_CONSTEXPR |
| #define DEFINE_CONSTEXPR |
| #else // TEST_WORKAROUND_EDG_EXPLICIT_CONSTEXPR |
| #define DEFINE_CONSTEXPR constexpr |
| #endif // TEST_WORKAROUND_EDG_EXPLICIT_CONSTEXPR |
| #endif |
| #ifndef DEFINE_ASSIGN_CONSTEXPR |
| #if TEST_STD_VER >= 14 |
| #define DEFINE_ASSIGN_CONSTEXPR DEFINE_CONSTEXPR |
| #else |
| #define DEFINE_ASSIGN_CONSTEXPR |
| #endif |
| #endif |
| #ifndef DEFINE_CTOR |
| #define DEFINE_CTOR = default |
| #endif |
| #ifndef DEFINE_DEFAULT_CTOR |
| #define DEFINE_DEFAULT_CTOR DEFINE_CTOR |
| #endif |
| #ifndef DEFINE_ASSIGN |
| #define DEFINE_ASSIGN = default |
| #endif |
| #ifndef DEFINE_DTOR |
| #define DEFINE_DTOR(Name) |
| #endif |
| |
| struct AllCtors : DEFINE_BASE(AllCtors) { |
| using Base = DEFINE_BASE(AllCtors); |
| using Base::Base; |
| using Base::operator=; |
| DEFINE_EXPLICIT DEFINE_CONSTEXPR AllCtors() DEFINE_NOEXCEPT DEFINE_DEFAULT_CTOR; |
| DEFINE_EXPLICIT DEFINE_CONSTEXPR AllCtors(AllCtors const&) DEFINE_NOEXCEPT DEFINE_CTOR; |
| DEFINE_EXPLICIT DEFINE_CONSTEXPR AllCtors(AllCtors &&) DEFINE_NOEXCEPT DEFINE_CTOR; |
| DEFINE_ASSIGN_CONSTEXPR AllCtors& operator=(AllCtors const&) DEFINE_NOEXCEPT DEFINE_ASSIGN; |
| DEFINE_ASSIGN_CONSTEXPR AllCtors& operator=(AllCtors &&) DEFINE_NOEXCEPT DEFINE_ASSIGN; |
| DEFINE_DTOR(AllCtors) |
| }; |
| |
| struct NoCtors : DEFINE_BASE(NoCtors) { |
| using Base = DEFINE_BASE(NoCtors); |
| DEFINE_EXPLICIT NoCtors() DEFINE_NOEXCEPT = delete; |
| DEFINE_EXPLICIT NoCtors(NoCtors const&) DEFINE_NOEXCEPT = delete; |
| NoCtors& operator=(NoCtors const&) DEFINE_NOEXCEPT = delete; |
| DEFINE_DTOR(NoCtors) |
| }; |
| |
| struct NoDefault : DEFINE_BASE(NoDefault) { |
| using Base = DEFINE_BASE(NoDefault); |
| using Base::Base; |
| DEFINE_EXPLICIT DEFINE_CONSTEXPR NoDefault() DEFINE_NOEXCEPT = delete; |
| DEFINE_DTOR(NoDefault) |
| }; |
| |
| struct DefaultOnly : DEFINE_BASE(DefaultOnly) { |
| using Base = DEFINE_BASE(DefaultOnly); |
| using Base::Base; |
| DEFINE_EXPLICIT DEFINE_CONSTEXPR DefaultOnly() DEFINE_NOEXCEPT DEFINE_DEFAULT_CTOR; |
| DefaultOnly(DefaultOnly const&) DEFINE_NOEXCEPT = delete; |
| DefaultOnly& operator=(DefaultOnly const&) DEFINE_NOEXCEPT = delete; |
| DEFINE_DTOR(DefaultOnly) |
| }; |
| |
| struct Copyable : DEFINE_BASE(Copyable) { |
| using Base = DEFINE_BASE(Copyable); |
| using Base::Base; |
| DEFINE_EXPLICIT DEFINE_CONSTEXPR Copyable() DEFINE_NOEXCEPT DEFINE_DEFAULT_CTOR; |
| DEFINE_EXPLICIT DEFINE_CONSTEXPR Copyable(Copyable const &) DEFINE_NOEXCEPT DEFINE_CTOR; |
| Copyable &operator=(Copyable const &) DEFINE_NOEXCEPT DEFINE_ASSIGN; |
| DEFINE_DTOR(Copyable) |
| }; |
| |
| struct CopyOnly : DEFINE_BASE(CopyOnly) { |
| using Base = DEFINE_BASE(CopyOnly); |
| using Base::Base; |
| DEFINE_EXPLICIT DEFINE_CONSTEXPR CopyOnly() DEFINE_NOEXCEPT DEFINE_DEFAULT_CTOR; |
| DEFINE_EXPLICIT DEFINE_CONSTEXPR CopyOnly(CopyOnly const &) DEFINE_NOEXCEPT DEFINE_CTOR; |
| DEFINE_EXPLICIT DEFINE_CONSTEXPR CopyOnly(CopyOnly &&) DEFINE_NOEXCEPT = delete; |
| CopyOnly &operator=(CopyOnly const &) DEFINE_NOEXCEPT DEFINE_ASSIGN; |
| CopyOnly &operator=(CopyOnly &&) DEFINE_NOEXCEPT = delete; |
| DEFINE_DTOR(CopyOnly) |
| }; |
| |
| struct NonCopyable : DEFINE_BASE(NonCopyable) { |
| using Base = DEFINE_BASE(NonCopyable); |
| using Base::Base; |
| DEFINE_EXPLICIT DEFINE_CONSTEXPR NonCopyable() DEFINE_NOEXCEPT DEFINE_DEFAULT_CTOR; |
| DEFINE_EXPLICIT DEFINE_CONSTEXPR NonCopyable(NonCopyable const &) DEFINE_NOEXCEPT = delete; |
| NonCopyable &operator=(NonCopyable const &) DEFINE_NOEXCEPT = delete; |
| DEFINE_DTOR(NonCopyable) |
| }; |
| |
| struct MoveOnly : DEFINE_BASE(MoveOnly) { |
| using Base = DEFINE_BASE(MoveOnly); |
| using Base::Base; |
| DEFINE_EXPLICIT DEFINE_CONSTEXPR MoveOnly() DEFINE_NOEXCEPT DEFINE_DEFAULT_CTOR; |
| DEFINE_EXPLICIT DEFINE_CONSTEXPR MoveOnly(MoveOnly &&) DEFINE_NOEXCEPT DEFINE_CTOR; |
| MoveOnly &operator=(MoveOnly &&) DEFINE_NOEXCEPT DEFINE_ASSIGN; |
| DEFINE_DTOR(MoveOnly) |
| }; |
| |
| struct CopyAssignable : DEFINE_BASE(CopyAssignable) { |
| using Base = DEFINE_BASE(CopyAssignable); |
| using Base::Base; |
| DEFINE_EXPLICIT DEFINE_CONSTEXPR CopyAssignable() DEFINE_NOEXCEPT = delete; |
| CopyAssignable& operator=(CopyAssignable const&) DEFINE_NOEXCEPT DEFINE_ASSIGN; |
| DEFINE_DTOR(CopyAssignable) |
| }; |
| |
| struct CopyAssignOnly : DEFINE_BASE(CopyAssignOnly) { |
| using Base = DEFINE_BASE(CopyAssignOnly); |
| using Base::Base; |
| DEFINE_EXPLICIT DEFINE_CONSTEXPR CopyAssignOnly() DEFINE_NOEXCEPT = delete; |
| CopyAssignOnly& operator=(CopyAssignOnly const&) DEFINE_NOEXCEPT DEFINE_ASSIGN; |
| CopyAssignOnly& operator=(CopyAssignOnly &&) DEFINE_NOEXCEPT = delete; |
| DEFINE_DTOR(CopyAssignOnly) |
| }; |
| |
| struct MoveAssignOnly : DEFINE_BASE(MoveAssignOnly) { |
| using Base = DEFINE_BASE(MoveAssignOnly); |
| using Base::Base; |
| DEFINE_EXPLICIT DEFINE_CONSTEXPR MoveAssignOnly() DEFINE_NOEXCEPT = delete; |
| MoveAssignOnly& operator=(MoveAssignOnly const&) DEFINE_NOEXCEPT = delete; |
| MoveAssignOnly& operator=(MoveAssignOnly &&) DEFINE_NOEXCEPT DEFINE_ASSIGN; |
| DEFINE_DTOR(MoveAssignOnly) |
| }; |
| |
| struct ConvertingType : DEFINE_BASE(ConvertingType) { |
| using Base = DEFINE_BASE(ConvertingType); |
| using Base::Base; |
| DEFINE_EXPLICIT DEFINE_CONSTEXPR ConvertingType() DEFINE_NOEXCEPT DEFINE_DEFAULT_CTOR; |
| DEFINE_EXPLICIT DEFINE_CONSTEXPR ConvertingType(ConvertingType const&) DEFINE_NOEXCEPT DEFINE_CTOR; |
| DEFINE_EXPLICIT DEFINE_CONSTEXPR ConvertingType(ConvertingType &&) DEFINE_NOEXCEPT DEFINE_CTOR; |
| ConvertingType& operator=(ConvertingType const&) DEFINE_NOEXCEPT DEFINE_ASSIGN; |
| ConvertingType& operator=(ConvertingType &&) DEFINE_NOEXCEPT DEFINE_ASSIGN; |
| template <class ...Args> |
| DEFINE_EXPLICIT DEFINE_CONSTEXPR ConvertingType(Args&&...) DEFINE_NOEXCEPT {} |
| template <class Arg> |
| ConvertingType& operator=(Arg&&) DEFINE_NOEXCEPT { return *this; } |
| DEFINE_DTOR(ConvertingType) |
| }; |
| |
| template <template <class...> class List> |
| using ApplyTypes = List< |
| AllCtors, |
| NoCtors, |
| NoDefault, |
| DefaultOnly, |
| Copyable, |
| CopyOnly, |
| NonCopyable, |
| MoveOnly, |
| CopyAssignable, |
| CopyAssignOnly, |
| MoveAssignOnly, |
| ConvertingType |
| >; |
| |
| #undef DEFINE_BASE |
| #undef DEFINE_EXPLICIT |
| #undef DEFINE_NOEXCEPT |
| #undef DEFINE_CONSTEXPR |
| #undef DEFINE_ASSIGN_CONSTEXPR |
| #undef DEFINE_CTOR |
| #undef DEFINE_DEFAULT_CTOR |
| #undef DEFINE_ASSIGN |
| #undef DEFINE_DTOR |