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