3 #define DEFINE_BASE(Name) ::ArchetypeBases::NullBase
5 #ifndef DEFINE_EXPLICIT
6 #define DEFINE_EXPLICIT
8 #ifndef DEFINE_CONSTEXPR
9 #define DEFINE_CONSTEXPR constexpr
11 #ifndef DEFINE_ASSIGN_CONSTEXPR
12 #if TEST_STD_VER >= 14
13 #define DEFINE_ASSIGN_CONSTEXPR DEFINE_CONSTEXPR
15 #define DEFINE_ASSIGN_CONSTEXPR
19 #define DEFINE_CTOR = default
21 #ifndef DEFINE_DEFAULT_CTOR
22 #define DEFINE_DEFAULT_CTOR DEFINE_CTOR
25 #define DEFINE_ASSIGN = default
28 #define DEFINE_DTOR(Name)
31 struct AllCtors : DEFINE_BASE(AllCtors) {
32 using Base = DEFINE_BASE(AllCtors);
34 using Base::operator=;
35 DEFINE_EXPLICIT DEFINE_CONSTEXPR AllCtors() DEFINE_DEFAULT_CTOR;
36 DEFINE_EXPLICIT DEFINE_CONSTEXPR AllCtors(AllCtors const&) DEFINE_CTOR;
37 DEFINE_EXPLICIT DEFINE_CONSTEXPR AllCtors(AllCtors &&) DEFINE_CTOR;
38 DEFINE_ASSIGN_CONSTEXPR AllCtors& operator=(AllCtors const&) DEFINE_ASSIGN;
39 DEFINE_ASSIGN_CONSTEXPR AllCtors& operator=(AllCtors &&) DEFINE_ASSIGN;
43 struct NoCtors : DEFINE_BASE(NoCtors) {
44 using Base = DEFINE_BASE(NoCtors);
45 DEFINE_EXPLICIT NoCtors() = delete;
46 DEFINE_EXPLICIT NoCtors(NoCtors const&) = delete;
47 NoCtors& operator=(NoCtors const&) = delete;
51 struct NoDefault : DEFINE_BASE(NoDefault) {
52 using Base = DEFINE_BASE(NoDefault);
54 DEFINE_EXPLICIT DEFINE_CONSTEXPR NoDefault() = delete;
55 DEFINE_DTOR(NoDefault)
58 struct DefaultOnly : DEFINE_BASE(DefaultOnly) {
59 using Base = DEFINE_BASE(DefaultOnly);
61 DEFINE_EXPLICIT DEFINE_CONSTEXPR DefaultOnly() DEFINE_DEFAULT_CTOR;
62 DefaultOnly(DefaultOnly const&) = delete;
63 DefaultOnly& operator=(DefaultOnly const&) = delete;
64 DEFINE_DTOR(DefaultOnly)
67 struct Copyable : DEFINE_BASE(Copyable) {
68 using Base = DEFINE_BASE(Copyable);
70 DEFINE_EXPLICIT DEFINE_CONSTEXPR Copyable() DEFINE_DEFAULT_CTOR;
71 DEFINE_EXPLICIT DEFINE_CONSTEXPR Copyable(Copyable const &) DEFINE_CTOR;
72 Copyable &operator=(Copyable const &) DEFINE_ASSIGN;
76 struct CopyOnly : DEFINE_BASE(CopyOnly) {
77 using Base = DEFINE_BASE(CopyOnly);
79 DEFINE_EXPLICIT DEFINE_CONSTEXPR CopyOnly() DEFINE_DEFAULT_CTOR;
80 DEFINE_EXPLICIT DEFINE_CONSTEXPR CopyOnly(CopyOnly const &) DEFINE_CTOR;
81 DEFINE_EXPLICIT DEFINE_CONSTEXPR CopyOnly(CopyOnly &&) = delete;
82 CopyOnly &operator=(CopyOnly const &) DEFINE_ASSIGN;
83 CopyOnly &operator=(CopyOnly &&) = delete;
87 struct NonCopyable : DEFINE_BASE(NonCopyable) {
88 using Base = DEFINE_BASE(NonCopyable);
90 DEFINE_EXPLICIT DEFINE_CONSTEXPR NonCopyable() DEFINE_DEFAULT_CTOR;
91 DEFINE_EXPLICIT DEFINE_CONSTEXPR NonCopyable(NonCopyable const &) = delete;
92 NonCopyable &operator=(NonCopyable const &) = delete;
93 DEFINE_DTOR(NonCopyable)
96 struct MoveOnly : DEFINE_BASE(MoveOnly) {
97 using Base = DEFINE_BASE(MoveOnly);
99 DEFINE_EXPLICIT DEFINE_CONSTEXPR MoveOnly() DEFINE_DEFAULT_CTOR;
100 DEFINE_EXPLICIT DEFINE_CONSTEXPR MoveOnly(MoveOnly &&) DEFINE_CTOR;
101 MoveOnly &operator=(MoveOnly &&) DEFINE_ASSIGN;
102 DEFINE_DTOR(MoveOnly)
105 struct CopyAssignable : DEFINE_BASE(CopyAssignable) {
106 using Base = DEFINE_BASE(CopyAssignable);
108 DEFINE_EXPLICIT DEFINE_CONSTEXPR CopyAssignable() = delete;
109 CopyAssignable& operator=(CopyAssignable const&) DEFINE_ASSIGN;
110 DEFINE_DTOR(CopyAssignable)
113 struct CopyAssignOnly : DEFINE_BASE(CopyAssignOnly) {
114 using Base = DEFINE_BASE(CopyAssignOnly);
116 DEFINE_EXPLICIT DEFINE_CONSTEXPR CopyAssignOnly() = delete;
117 CopyAssignOnly& operator=(CopyAssignOnly const&) DEFINE_ASSIGN;
118 CopyAssignOnly& operator=(CopyAssignOnly &&) = delete;
119 DEFINE_DTOR(CopyAssignOnly)
122 struct MoveAssignOnly : DEFINE_BASE(MoveAssignOnly) {
123 using Base = DEFINE_BASE(MoveAssignOnly);
125 DEFINE_EXPLICIT DEFINE_CONSTEXPR MoveAssignOnly() = delete;
126 MoveAssignOnly& operator=(MoveAssignOnly const&) = delete;
127 MoveAssignOnly& operator=(MoveAssignOnly &&) DEFINE_ASSIGN;
128 DEFINE_DTOR(MoveAssignOnly)
131 struct ConvertingType : DEFINE_BASE(ConvertingType) {
132 using Base = DEFINE_BASE(ConvertingType);
134 DEFINE_EXPLICIT DEFINE_CONSTEXPR ConvertingType() DEFINE_DEFAULT_CTOR;
135 DEFINE_EXPLICIT DEFINE_CONSTEXPR ConvertingType(ConvertingType const&) DEFINE_CTOR;
136 DEFINE_EXPLICIT DEFINE_CONSTEXPR ConvertingType(ConvertingType &&) DEFINE_CTOR;
137 ConvertingType& operator=(ConvertingType const&) DEFINE_ASSIGN;
138 ConvertingType& operator=(ConvertingType &&) DEFINE_ASSIGN;
139 template <class ...Args>
140 DEFINE_EXPLICIT DEFINE_CONSTEXPR ConvertingType(Args&&...) {}
142 ConvertingType& operator=(Arg&&) { return *this; }
143 DEFINE_DTOR(ConvertingType)
146 template <template <class...> class List>
147 using ApplyTypes = List<
163 #undef DEFINE_EXPLICIT
164 #undef DEFINE_CONSTEXPR
165 #undef DEFINE_ASSIGN_CONSTEXPR
167 #undef DEFINE_DEFAULT_CTOR