libcxx

libcxx mirror with random patches
git clone https://git.neptards.moe/neptards/libcxx.git
Log | Files | Refs

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