@@ -439,46 +439,122 @@ struct __optional_storage_base<_Tp, true>
439
439
}
440
440
};
441
441
442
- template <class _Tp , bool = is_trivially_copyable<_Tp>::value>
443
- struct __optional_storage ;
444
-
445
- template <class _Tp >
446
- struct __optional_storage <_Tp, true > : __optional_storage_base<_Tp>
442
+ template <class _Tp , bool = is_trivially_copy_constructible<_Tp>::value>
443
+ struct __optional_copy_base : __optional_storage_base<_Tp>
447
444
{
448
445
using __optional_storage_base<_Tp>::__optional_storage_base;
449
446
};
450
447
451
448
template <class _Tp >
452
- struct __optional_storage <_Tp, false > : __optional_storage_base<_Tp>
449
+ struct __optional_copy_base <_Tp, false > : __optional_storage_base<_Tp>
453
450
{
454
- using value_type = _Tp;
455
451
using __optional_storage_base<_Tp>::__optional_storage_base;
456
452
457
453
_LIBCPP_INLINE_VISIBILITY
458
- __optional_storage () = default ;
454
+ __optional_copy_base () = default ;
459
455
460
456
_LIBCPP_INLINE_VISIBILITY
461
- __optional_storage (const __optional_storage & __opt)
457
+ __optional_copy_base (const __optional_copy_base & __opt)
462
458
{
463
459
this ->__construct_from (__opt);
464
460
}
465
461
466
462
_LIBCPP_INLINE_VISIBILITY
467
- __optional_storage (__optional_storage&& __opt)
463
+ __optional_copy_base (__optional_copy_base&&) = default ;
464
+ _LIBCPP_INLINE_VISIBILITY
465
+ __optional_copy_base& operator =(const __optional_copy_base&) = default ;
466
+ _LIBCPP_INLINE_VISIBILITY
467
+ __optional_copy_base& operator =(__optional_copy_base&&) = default ;
468
+ };
469
+
470
+ template <class _Tp , bool = is_trivially_move_constructible<_Tp>::value>
471
+ struct __optional_move_base : __optional_copy_base<_Tp>
472
+ {
473
+ using __optional_copy_base<_Tp>::__optional_copy_base;
474
+ };
475
+
476
+ template <class _Tp >
477
+ struct __optional_move_base <_Tp, false > : __optional_copy_base<_Tp>
478
+ {
479
+ using value_type = _Tp;
480
+ using __optional_copy_base<_Tp>::__optional_copy_base;
481
+
482
+ _LIBCPP_INLINE_VISIBILITY
483
+ __optional_move_base () = default ;
484
+ _LIBCPP_INLINE_VISIBILITY
485
+ __optional_move_base (const __optional_move_base&) = default ;
486
+
487
+ _LIBCPP_INLINE_VISIBILITY
488
+ __optional_move_base (__optional_move_base&& __opt)
468
489
noexcept (is_nothrow_move_constructible_v<value_type>)
469
490
{
470
491
this ->__construct_from (_VSTD::move (__opt));
471
492
}
472
493
473
494
_LIBCPP_INLINE_VISIBILITY
474
- __optional_storage& operator =(const __optional_storage& __opt)
495
+ __optional_move_base& operator =(const __optional_move_base&) = default ;
496
+ _LIBCPP_INLINE_VISIBILITY
497
+ __optional_move_base& operator =(__optional_move_base&&) = default ;
498
+ };
499
+
500
+ template <class _Tp , bool =
501
+ is_trivially_destructible<_Tp>::value &&
502
+ is_trivially_copy_constructible<_Tp>::value &&
503
+ is_trivially_copy_assignable<_Tp>::value>
504
+ struct __optional_copy_assign_base : __optional_move_base<_Tp>
505
+ {
506
+ using __optional_move_base<_Tp>::__optional_move_base;
507
+ };
508
+
509
+ template <class _Tp >
510
+ struct __optional_copy_assign_base <_Tp, false > : __optional_move_base<_Tp>
511
+ {
512
+ using __optional_move_base<_Tp>::__optional_move_base;
513
+
514
+ _LIBCPP_INLINE_VISIBILITY
515
+ __optional_copy_assign_base () = default ;
516
+ _LIBCPP_INLINE_VISIBILITY
517
+ __optional_copy_assign_base (const __optional_copy_assign_base&) = default ;
518
+ _LIBCPP_INLINE_VISIBILITY
519
+ __optional_copy_assign_base (__optional_copy_assign_base&&) = default ;
520
+
521
+ _LIBCPP_INLINE_VISIBILITY
522
+ __optional_copy_assign_base& operator =(const __optional_copy_assign_base& __opt)
475
523
{
476
524
this ->__assign_from (__opt);
477
525
return *this ;
478
526
}
479
527
480
528
_LIBCPP_INLINE_VISIBILITY
481
- __optional_storage& operator =(__optional_storage&& __opt)
529
+ __optional_copy_assign_base& operator =(__optional_copy_assign_base&&) = default ;
530
+ };
531
+
532
+ template <class _Tp , bool =
533
+ is_trivially_destructible<_Tp>::value &&
534
+ is_trivially_move_constructible<_Tp>::value &&
535
+ is_trivially_move_assignable<_Tp>::value>
536
+ struct __optional_move_assign_base : __optional_copy_assign_base<_Tp>
537
+ {
538
+ using __optional_copy_assign_base<_Tp>::__optional_copy_assign_base;
539
+ };
540
+
541
+ template <class _Tp >
542
+ struct __optional_move_assign_base <_Tp, false > : __optional_copy_assign_base<_Tp>
543
+ {
544
+ using value_type = _Tp;
545
+ using __optional_copy_assign_base<_Tp>::__optional_copy_assign_base;
546
+
547
+ _LIBCPP_INLINE_VISIBILITY
548
+ __optional_move_assign_base () = default ;
549
+ _LIBCPP_INLINE_VISIBILITY
550
+ __optional_move_assign_base (const __optional_move_assign_base& __opt) = default ;
551
+ _LIBCPP_INLINE_VISIBILITY
552
+ __optional_move_assign_base (__optional_move_assign_base&&) = default ;
553
+ _LIBCPP_INLINE_VISIBILITY
554
+ __optional_move_assign_base& operator =(const __optional_move_assign_base&) = default ;
555
+
556
+ _LIBCPP_INLINE_VISIBILITY
557
+ __optional_move_assign_base& operator =(__optional_move_assign_base&& __opt)
482
558
noexcept (is_nothrow_move_assignable_v<value_type> &&
483
559
is_nothrow_move_constructible_v<value_type>)
484
560
{
@@ -501,11 +577,11 @@ using __optional_sfinae_assign_base_t = __sfinae_assign_base<
501
577
502
578
template <class _Tp >
503
579
class optional
504
- : private __optional_storage <_Tp>
580
+ : private __optional_move_assign_base <_Tp>
505
581
, private __optional_sfinae_ctor_base_t <_Tp>
506
582
, private __optional_sfinae_assign_base_t <_Tp>
507
583
{
508
- using __base = __optional_storage <_Tp>;
584
+ using __base = __optional_move_assign_base <_Tp>;
509
585
public:
510
586
using value_type = _Tp;
511
587
0 commit comments