222 using namespace cpp_type_util;
224 debug_name_ = debug_name;
226 alignment_ =
int64_t(
alignof(T));
227 is_trivial_ = std::is_trivial_v<T>;
228 is_trivially_destructible_ = std::is_trivially_destructible_v<T>;
229 if constexpr (std::is_default_constructible_v<T>) {
230 default_construct_ = default_construct_cb<T>;
231 default_construct_indices_ = default_construct_indices_cb<T>;
232 value_initialize_ = value_initialize_cb<T>;
233 value_initialize_indices_ = value_initialize_indices_cb<T>;
243 if constexpr (std::is_destructible_v<T>) {
244 destruct_ = destruct_cb<T>;
245 destruct_indices_ = destruct_indices_cb<T>;
247 if constexpr (std::is_copy_assignable_v<T>) {
248 copy_assign_ = copy_assign_cb<T>;
249 copy_assign_indices_ = copy_assign_indices_cb<T>;
250 copy_assign_compressed_ = copy_assign_compressed_cb<T>;
252 if constexpr (std::is_copy_constructible_v<T>) {
253 if constexpr (std::is_trivially_copy_constructible_v<T>) {
254 copy_construct_ = copy_assign_;
255 copy_construct_indices_ = copy_assign_indices_;
256 copy_construct_compressed_ = copy_assign_compressed_;
259 copy_construct_ = copy_construct_cb<T>;
260 copy_construct_indices_ = copy_construct_indices_cb<T>;
261 copy_construct_compressed_ = copy_construct_compressed_cb<T>;
264 if constexpr (std::is_move_assignable_v<T>) {
265 if constexpr (std::is_trivially_move_assignable_v<T>) {
268 move_assign_ =
reinterpret_cast<decltype(move_assign_)
>(copy_assign_);
269 move_assign_indices_ =
reinterpret_cast<decltype(move_assign_indices_)
>(
270 copy_assign_indices_);
273 move_assign_ = move_assign_cb<T>;
274 move_assign_indices_ = move_assign_indices_cb<T>;
277 if constexpr (std::is_move_constructible_v<T>) {
278 if constexpr (std::is_trivially_move_constructible_v<T>) {
279 move_construct_ = move_assign_;
280 move_construct_indices_ = move_assign_indices_;
283 move_construct_ = move_construct_cb<T>;
284 move_construct_indices_ = move_construct_indices_cb<T>;
287 if constexpr (std::is_destructible_v<T>) {
288 if constexpr (std::is_trivially_move_assignable_v<T> && std::is_trivially_destructible_v<T>) {
289 relocate_assign_ = move_assign_;
290 relocate_assign_indices_ = move_assign_indices_;
292 relocate_construct_ = move_assign_;
293 relocate_construct_indices_ = move_assign_indices_;
296 if constexpr (std::is_move_assignable_v<T>) {
297 relocate_assign_ = relocate_assign_cb<T>;
298 relocate_assign_indices_ = relocate_assign_indices_cb<T>;
300 if constexpr (std::is_move_constructible_v<T>) {
301 relocate_construct_ = relocate_construct_cb<T>;
302 relocate_construct_indices_ = relocate_construct_indices_cb<T>;
306 if constexpr (std::is_copy_assignable_v<T>) {
307 fill_assign_indices_ = fill_assign_indices_cb<T>;
309 if constexpr (std::is_copy_constructible_v<T>) {
310 if constexpr (std::is_trivially_constructible_v<T>) {
311 fill_construct_indices_ = fill_assign_indices_;
314 fill_construct_indices_ = fill_construct_indices_cb<T>;
321 print_ = print_cb<T>;
324 is_equal_ = is_equal_cb<T>;
328 has_special_member_functions_ = (default_construct_ && copy_construct_ && copy_assign_ &&
329 move_construct_ && move_assign_ && destruct_);