1 2 #ifndef DEFINE_BASE 3 #define DEFINE_BASE(Name) ::ArchetypeBases::NullBase 4 #endif 5 #ifndef DEFINE_EXPLICIT 6 #define DEFINE_EXPLICIT 7 #endif 8 #ifndef DEFINE_CONSTEXPR 9 #ifdef TEST_WORKAROUND_EDG_EXPLICIT_CONSTEXPR 10 #define DEFINE_CONSTEXPR 11 #else // TEST_WORKAROUND_EDG_EXPLICIT_CONSTEXPR 12 #define DEFINE_CONSTEXPR constexpr 13 #endif // TEST_WORKAROUND_EDG_EXPLICIT_CONSTEXPR 14 #endif 15 #ifndef DEFINE_ASSIGN_CONSTEXPR 16 #if TEST_STD_VER >= 14 17 #define DEFINE_ASSIGN_CONSTEXPR DEFINE_CONSTEXPR 18 #else 19 #define DEFINE_ASSIGN_CONSTEXPR 20 #endif 21 #endif 22 #ifndef DEFINE_CTOR 23 #define DEFINE_CTOR = default 24 #endif 25 #ifndef DEFINE_DEFAULT_CTOR 26 #define DEFINE_DEFAULT_CTOR DEFINE_CTOR 27 #endif 28 #ifndef DEFINE_ASSIGN 29 #define DEFINE_ASSIGN = default 30 #endif 31 #ifndef DEFINE_DTOR 32 #define DEFINE_DTOR(Name) 33 #endif 34 35 struct AllCtors : DEFINE_BASE(AllCtors) { 36 using Base = DEFINE_BASE(AllCtors); 37 using Base::Base; 38 using Base::operator=; 39 DEFINE_EXPLICIT DEFINE_CONSTEXPR AllCtors() DEFINE_DEFAULT_CTOR; 40 DEFINE_EXPLICIT DEFINE_CONSTEXPR AllCtors(AllCtors const&) DEFINE_CTOR; 41 DEFINE_EXPLICIT DEFINE_CONSTEXPR AllCtors(AllCtors &&) DEFINE_CTOR; 42 DEFINE_ASSIGN_CONSTEXPR AllCtors& operator=(AllCtors const&) DEFINE_ASSIGN; 43 DEFINE_ASSIGN_CONSTEXPR AllCtors& operator=(AllCtors &&) DEFINE_ASSIGN; 44 DEFINE_DTOR(AllCtors) 45 }; 46 47 struct NoCtors : DEFINE_BASE(NoCtors) { 48 using Base = DEFINE_BASE(NoCtors); 49 DEFINE_EXPLICIT NoCtors() = delete; 50 DEFINE_EXPLICIT NoCtors(NoCtors const&) = delete; 51 NoCtors& operator=(NoCtors const&) = delete; 52 DEFINE_DTOR(NoCtors) 53 }; 54 55 struct NoDefault : DEFINE_BASE(NoDefault) { 56 using Base = DEFINE_BASE(NoDefault); 57 using Base::Base; 58 DEFINE_EXPLICIT DEFINE_CONSTEXPR NoDefault() = delete; 59 DEFINE_DTOR(NoDefault) 60 }; 61 62 struct DefaultOnly : DEFINE_BASE(DefaultOnly) { 63 using Base = DEFINE_BASE(DefaultOnly); 64 using Base::Base; 65 DEFINE_EXPLICIT DEFINE_CONSTEXPR DefaultOnly() DEFINE_DEFAULT_CTOR; 66 DefaultOnly(DefaultOnly const&) = delete; 67 DefaultOnly& operator=(DefaultOnly const&) = delete; 68 DEFINE_DTOR(DefaultOnly) 69 }; 70 71 struct Copyable : DEFINE_BASE(Copyable) { 72 using Base = DEFINE_BASE(Copyable); 73 using Base::Base; 74 DEFINE_EXPLICIT DEFINE_CONSTEXPR Copyable() DEFINE_DEFAULT_CTOR; 75 DEFINE_EXPLICIT DEFINE_CONSTEXPR Copyable(Copyable const &) DEFINE_CTOR; 76 Copyable &operator=(Copyable const &) DEFINE_ASSIGN; 77 DEFINE_DTOR(Copyable) 78 }; 79 80 struct CopyOnly : DEFINE_BASE(CopyOnly) { 81 using Base = DEFINE_BASE(CopyOnly); 82 using Base::Base; 83 DEFINE_EXPLICIT DEFINE_CONSTEXPR CopyOnly() DEFINE_DEFAULT_CTOR; 84 DEFINE_EXPLICIT DEFINE_CONSTEXPR CopyOnly(CopyOnly const &) DEFINE_CTOR; 85 DEFINE_EXPLICIT DEFINE_CONSTEXPR CopyOnly(CopyOnly &&) = delete; 86 CopyOnly &operator=(CopyOnly const &) DEFINE_ASSIGN; 87 CopyOnly &operator=(CopyOnly &&) = delete; 88 DEFINE_DTOR(CopyOnly) 89 }; 90 91 struct NonCopyable : DEFINE_BASE(NonCopyable) { 92 using Base = DEFINE_BASE(NonCopyable); 93 using Base::Base; 94 DEFINE_EXPLICIT DEFINE_CONSTEXPR NonCopyable() DEFINE_DEFAULT_CTOR; 95 DEFINE_EXPLICIT DEFINE_CONSTEXPR NonCopyable(NonCopyable const &) = delete; 96 NonCopyable &operator=(NonCopyable const &) = delete; 97 DEFINE_DTOR(NonCopyable) 98 }; 99 100 struct MoveOnly : DEFINE_BASE(MoveOnly) { 101 using Base = DEFINE_BASE(MoveOnly); 102 using Base::Base; 103 DEFINE_EXPLICIT DEFINE_CONSTEXPR MoveOnly() DEFINE_DEFAULT_CTOR; 104 DEFINE_EXPLICIT DEFINE_CONSTEXPR MoveOnly(MoveOnly &&) DEFINE_CTOR; 105 MoveOnly &operator=(MoveOnly &&) DEFINE_ASSIGN; 106 DEFINE_DTOR(MoveOnly) 107 }; 108 109 struct CopyAssignable : DEFINE_BASE(CopyAssignable) { 110 using Base = DEFINE_BASE(CopyAssignable); 111 using Base::Base; 112 DEFINE_EXPLICIT DEFINE_CONSTEXPR CopyAssignable() = delete; 113 CopyAssignable& operator=(CopyAssignable const&) DEFINE_ASSIGN; 114 DEFINE_DTOR(CopyAssignable) 115 }; 116 117 struct CopyAssignOnly : DEFINE_BASE(CopyAssignOnly) { 118 using Base = DEFINE_BASE(CopyAssignOnly); 119 using Base::Base; 120 DEFINE_EXPLICIT DEFINE_CONSTEXPR CopyAssignOnly() = delete; 121 CopyAssignOnly& operator=(CopyAssignOnly const&) DEFINE_ASSIGN; 122 CopyAssignOnly& operator=(CopyAssignOnly &&) = delete; 123 DEFINE_DTOR(CopyAssignOnly) 124 }; 125 126 struct MoveAssignOnly : DEFINE_BASE(MoveAssignOnly) { 127 using Base = DEFINE_BASE(MoveAssignOnly); 128 using Base::Base; 129 DEFINE_EXPLICIT DEFINE_CONSTEXPR MoveAssignOnly() = delete; 130 MoveAssignOnly& operator=(MoveAssignOnly const&) = delete; 131 MoveAssignOnly& operator=(MoveAssignOnly &&) DEFINE_ASSIGN; 132 DEFINE_DTOR(MoveAssignOnly) 133 }; 134 135 struct ConvertingType : DEFINE_BASE(ConvertingType) { 136 using Base = DEFINE_BASE(ConvertingType); 137 using Base::Base; 138 DEFINE_EXPLICIT DEFINE_CONSTEXPR ConvertingType() DEFINE_DEFAULT_CTOR; 139 DEFINE_EXPLICIT DEFINE_CONSTEXPR ConvertingType(ConvertingType const&) DEFINE_CTOR; 140 DEFINE_EXPLICIT DEFINE_CONSTEXPR ConvertingType(ConvertingType &&) DEFINE_CTOR; 141 ConvertingType& operator=(ConvertingType const&) DEFINE_ASSIGN; 142 ConvertingType& operator=(ConvertingType &&) DEFINE_ASSIGN; 143 template <class ...Args> 144 DEFINE_EXPLICIT DEFINE_CONSTEXPR ConvertingType(Args&&...) {} 145 template <class Arg> 146 ConvertingType& operator=(Arg&&) { return *this; } 147 DEFINE_DTOR(ConvertingType) 148 }; 149 150 template <template <class...> class List> 151 using ApplyTypes = List< 152 AllCtors, 153 NoCtors, 154 NoDefault, 155 DefaultOnly, 156 Copyable, 157 CopyOnly, 158 NonCopyable, 159 MoveOnly, 160 CopyAssignable, 161 CopyAssignOnly, 162 MoveAssignOnly, 163 ConvertingType 164 >; 165 166 #undef DEFINE_BASE 167 #undef DEFINE_EXPLICIT 168 #undef DEFINE_CONSTEXPR 169 #undef DEFINE_ASSIGN_CONSTEXPR 170 #undef DEFINE_CTOR 171 #undef DEFINE_DEFAULT_CTOR 172 #undef DEFINE_ASSIGN 173 #undef DEFINE_DTOR 174