Home | History | Annotate | Download | only in support
      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