1 // <bits/enable_special_members.h> -*- C++ -*- 2 3 // Copyright (C) 2013-2015 Free Software Foundation, Inc. 4 // 5 // This file is part of the GNU ISO C++ Library. This library is free 6 // software; you can redistribute it and/or modify it under the 7 // terms of the GNU General Public License as published by the 8 // Free Software Foundation; either version 3, or (at your option) 9 // any later version. 10 11 // This library is distributed in the hope that it will be useful, 12 // but WITHOUT ANY WARRANTY; without even the implied warranty of 13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 // GNU General Public License for more details. 15 16 // Under Section 7 of GPL version 3, you are granted additional 17 // permissions described in the GCC Runtime Library Exception, version 18 // 3.1, as published by the Free Software Foundation. 19 20 // You should have received a copy of the GNU General Public License and 21 // a copy of the GCC Runtime Library Exception along with this program; 22 // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 23 // <http://www.gnu.org/licenses/>. 24 25 /** @file bits/enable_special_members.h 26 * This is an internal header file, included by other library headers. 27 * Do not attempt to use it directly. 28 */ 29 30 #ifndef _ENABLE_SPECIAL_MEMBERS_H 31 #define _ENABLE_SPECIAL_MEMBERS_H 1 32 33 #pragma GCC system_header 34 35 namespace std _GLIBCXX_VISIBILITY(default) 36 { 37 _GLIBCXX_BEGIN_NAMESPACE_VERSION 38 39 /** 40 * @brief A mixin helper to conditionally enable or disable the default 41 * constructor. 42 * @sa _Enable_special_members 43 */ 44 template<bool _Switch, typename _Tag = void> 45 struct _Enable_default_constructor { }; 46 47 48 /** 49 * @brief A mixin helper to conditionally enable or disable the default 50 * destructor. 51 * @sa _Enable_special_members 52 */ 53 template<bool _Switch, typename _Tag = void> 54 struct _Enable_destructor { }; 55 56 /** 57 * @brief A mixin helper to conditionally enable or disable the copy/move 58 * special members. 59 * @sa _Enable_special_members 60 */ 61 template<bool _Copy, bool _CopyAssignment, 62 bool _Move, bool _MoveAssignment, 63 typename _Tag = void> 64 struct _Enable_copy_move { }; 65 66 /** 67 * @brief A mixin helper to conditionally enable or disable the special 68 * members. 69 * 70 * The @c _Tag type parameter is to make mixin bases unique and thus avoid 71 * ambiguities. 72 */ 73 template<bool _Default, bool _Destructor, 74 bool _Copy, bool _CopyAssignment, 75 bool _Move, bool _MoveAssignment, 76 typename _Tag = void> 77 struct _Enable_special_members 78 : private _Enable_default_constructor<_Default, _Tag>, 79 private _Enable_destructor<_Destructor, _Tag>, 80 private _Enable_copy_move<_Copy, _CopyAssignment, 81 _Move, _MoveAssignment, 82 _Tag> 83 { }; 84 85 // Boilerplate follows. 86 87 template<typename _Tag> 88 struct _Enable_default_constructor<false, _Tag> 89 { constexpr _Enable_default_constructor() noexcept = delete; }; 90 91 template<typename _Tag> 92 struct _Enable_destructor<false, _Tag> 93 { ~_Enable_destructor() noexcept = delete; }; 94 95 template<typename _Tag> 96 struct _Enable_copy_move<false, true, true, true, _Tag> 97 { 98 constexpr _Enable_copy_move() noexcept = default; 99 constexpr _Enable_copy_move(_Enable_copy_move const&) noexcept = delete; 100 constexpr _Enable_copy_move(_Enable_copy_move&&) noexcept = default; 101 _Enable_copy_move& 102 operator=(_Enable_copy_move const&) noexcept = default; 103 _Enable_copy_move& 104 operator=(_Enable_copy_move&&) noexcept = default; 105 }; 106 107 template<typename _Tag> 108 struct _Enable_copy_move<true, false, true, true, _Tag> 109 { 110 constexpr _Enable_copy_move() noexcept = default; 111 constexpr _Enable_copy_move(_Enable_copy_move const&) noexcept = default; 112 constexpr _Enable_copy_move(_Enable_copy_move&&) noexcept = default; 113 _Enable_copy_move& 114 operator=(_Enable_copy_move const&) noexcept = delete; 115 _Enable_copy_move& 116 operator=(_Enable_copy_move&&) noexcept = default; 117 }; 118 119 template<typename _Tag> 120 struct _Enable_copy_move<false, false, true, true, _Tag> 121 { 122 constexpr _Enable_copy_move() noexcept = default; 123 constexpr _Enable_copy_move(_Enable_copy_move const&) noexcept = delete; 124 constexpr _Enable_copy_move(_Enable_copy_move&&) noexcept = default; 125 _Enable_copy_move& 126 operator=(_Enable_copy_move const&) noexcept = delete; 127 _Enable_copy_move& 128 operator=(_Enable_copy_move&&) noexcept = default; 129 }; 130 131 template<typename _Tag> 132 struct _Enable_copy_move<true, true, false, true, _Tag> 133 { 134 constexpr _Enable_copy_move() noexcept = default; 135 constexpr _Enable_copy_move(_Enable_copy_move const&) noexcept = default; 136 constexpr _Enable_copy_move(_Enable_copy_move&&) noexcept = delete; 137 _Enable_copy_move& 138 operator=(_Enable_copy_move const&) noexcept = default; 139 _Enable_copy_move& 140 operator=(_Enable_copy_move&&) noexcept = default; 141 }; 142 143 template<typename _Tag> 144 struct _Enable_copy_move<false, true, false, true, _Tag> 145 { 146 constexpr _Enable_copy_move() noexcept = default; 147 constexpr _Enable_copy_move(_Enable_copy_move const&) noexcept = delete; 148 constexpr _Enable_copy_move(_Enable_copy_move&&) noexcept = delete; 149 _Enable_copy_move& 150 operator=(_Enable_copy_move const&) noexcept = default; 151 _Enable_copy_move& 152 operator=(_Enable_copy_move&&) noexcept = default; 153 }; 154 155 template<typename _Tag> 156 struct _Enable_copy_move<true, false, false, true, _Tag> 157 { 158 constexpr _Enable_copy_move() noexcept = default; 159 constexpr _Enable_copy_move(_Enable_copy_move const&) noexcept = default; 160 constexpr _Enable_copy_move(_Enable_copy_move&&) noexcept = delete; 161 _Enable_copy_move& 162 operator=(_Enable_copy_move const&) noexcept = delete; 163 _Enable_copy_move& 164 operator=(_Enable_copy_move&&) noexcept = default; 165 }; 166 167 template<typename _Tag> 168 struct _Enable_copy_move<false, false, false, true, _Tag> 169 { 170 constexpr _Enable_copy_move() noexcept = default; 171 constexpr _Enable_copy_move(_Enable_copy_move const&) noexcept = delete; 172 constexpr _Enable_copy_move(_Enable_copy_move&&) noexcept = delete; 173 _Enable_copy_move& 174 operator=(_Enable_copy_move const&) noexcept = delete; 175 _Enable_copy_move& 176 operator=(_Enable_copy_move&&) noexcept = default; 177 }; 178 179 template<typename _Tag> 180 struct _Enable_copy_move<true, true, true, false, _Tag> 181 { 182 constexpr _Enable_copy_move() noexcept = default; 183 constexpr _Enable_copy_move(_Enable_copy_move const&) noexcept = default; 184 constexpr _Enable_copy_move(_Enable_copy_move&&) noexcept = default; 185 _Enable_copy_move& 186 operator=(_Enable_copy_move const&) noexcept = default; 187 _Enable_copy_move& 188 operator=(_Enable_copy_move&&) noexcept = delete; 189 }; 190 191 template<typename _Tag> 192 struct _Enable_copy_move<false, true, true, false, _Tag> 193 { 194 constexpr _Enable_copy_move() noexcept = default; 195 constexpr _Enable_copy_move(_Enable_copy_move const&) noexcept = delete; 196 constexpr _Enable_copy_move(_Enable_copy_move&&) noexcept = default; 197 _Enable_copy_move& 198 operator=(_Enable_copy_move const&) noexcept = default; 199 _Enable_copy_move& 200 operator=(_Enable_copy_move&&) noexcept = delete; 201 }; 202 203 template<typename _Tag> 204 struct _Enable_copy_move<true, false, true, false, _Tag> 205 { 206 constexpr _Enable_copy_move() noexcept = default; 207 constexpr _Enable_copy_move(_Enable_copy_move const&) noexcept = default; 208 constexpr _Enable_copy_move(_Enable_copy_move&&) noexcept = default; 209 _Enable_copy_move& 210 operator=(_Enable_copy_move const&) noexcept = delete; 211 _Enable_copy_move& 212 operator=(_Enable_copy_move&&) noexcept = delete; 213 }; 214 215 template<typename _Tag> 216 struct _Enable_copy_move<false, false, true, false, _Tag> 217 { 218 constexpr _Enable_copy_move() noexcept = default; 219 constexpr _Enable_copy_move(_Enable_copy_move const&) noexcept = delete; 220 constexpr _Enable_copy_move(_Enable_copy_move&&) noexcept = default; 221 _Enable_copy_move& 222 operator=(_Enable_copy_move const&) noexcept = delete; 223 _Enable_copy_move& 224 operator=(_Enable_copy_move&&) noexcept = delete; 225 }; 226 227 template<typename _Tag> 228 struct _Enable_copy_move<true, true, false, false, _Tag> 229 { 230 constexpr _Enable_copy_move() noexcept = default; 231 constexpr _Enable_copy_move(_Enable_copy_move const&) noexcept = default; 232 constexpr _Enable_copy_move(_Enable_copy_move&&) noexcept = delete; 233 _Enable_copy_move& 234 operator=(_Enable_copy_move const&) noexcept = default; 235 _Enable_copy_move& 236 operator=(_Enable_copy_move&&) noexcept = delete; 237 }; 238 239 template<typename _Tag> 240 struct _Enable_copy_move<false, true, false, false, _Tag> 241 { 242 constexpr _Enable_copy_move() noexcept = default; 243 constexpr _Enable_copy_move(_Enable_copy_move const&) noexcept = delete; 244 constexpr _Enable_copy_move(_Enable_copy_move&&) noexcept = delete; 245 _Enable_copy_move& 246 operator=(_Enable_copy_move const&) noexcept = default; 247 _Enable_copy_move& 248 operator=(_Enable_copy_move&&) noexcept = delete; 249 }; 250 251 template<typename _Tag> 252 struct _Enable_copy_move<true, false, false, false, _Tag> 253 { 254 constexpr _Enable_copy_move() noexcept = default; 255 constexpr _Enable_copy_move(_Enable_copy_move const&) noexcept = default; 256 constexpr _Enable_copy_move(_Enable_copy_move&&) noexcept = delete; 257 _Enable_copy_move& 258 operator=(_Enable_copy_move const&) noexcept = delete; 259 _Enable_copy_move& 260 operator=(_Enable_copy_move&&) noexcept = delete; 261 }; 262 263 template<typename _Tag> 264 struct _Enable_copy_move<false, false, false, false, _Tag> 265 { 266 constexpr _Enable_copy_move() noexcept = default; 267 constexpr _Enable_copy_move(_Enable_copy_move const&) noexcept = delete; 268 constexpr _Enable_copy_move(_Enable_copy_move&&) noexcept = delete; 269 _Enable_copy_move& 270 operator=(_Enable_copy_move const&) noexcept = delete; 271 _Enable_copy_move& 272 operator=(_Enable_copy_move&&) noexcept = delete; 273 }; 274 275 _GLIBCXX_END_NAMESPACE_VERSION 276 } // namespace std 277 278 #endif // _ENABLE_SPECIAL_MEMBERS_H 279