@@ -450,17 +450,10 @@ namespace etl
450
450
template <typename ... TArgs>
451
451
reference create (TArgs&&... args) ETL_NOEXCEPT_EXPR(ETL_NOT_USING_EXCEPTIONS)
452
452
{
453
- if (has_value ())
454
- {
455
- storage.value = T (args...);
456
- }
457
- else
458
- {
459
- valid = true ;
460
- ::new (&storage.value ) value_type (etl::forward<TArgs>(args)...);
461
- }
462
-
463
- return storage.value ;
453
+ ETL_ASSERT (!has_value (), ETL_ERROR (etl::typed_storage_error));
454
+ pointer p = ::new (&storage.value ) value_type (etl::forward<TArgs>(args)...);
455
+ valid = true ;
456
+ return *p;
464
457
}
465
458
#else
466
459
// ***************************************************************************
@@ -470,17 +463,10 @@ namespace etl
470
463
template <typename T1>
471
464
reference create (const T1& t1)
472
465
{
473
- if (has_value ())
474
- {
475
- storage.value = T (t1);
476
- }
477
- else
478
- {
479
- valid = true ;
480
- ::new (&storage.value ) value_type (t1);
481
- }
482
-
483
- return storage.value ;
466
+ ETL_ASSERT (!has_value (), ETL_ERROR (etl::typed_storage_error));
467
+ pointer p = ::new (&storage.value ) value_type (t1);
468
+ valid = true ;
469
+ return *p;
484
470
}
485
471
486
472
// ***************************************************************************
@@ -490,17 +476,10 @@ namespace etl
490
476
template <typename T1, typename T2>
491
477
reference create (const T1& t1, const T2& t2)
492
478
{
493
- if (has_value ())
494
- {
495
- storage.value = T (t1, t2);
496
- }
497
- else
498
- {
499
- valid = true ;
500
- ::new (&storage.value ) value_type (t1, t2);
501
- }
502
-
503
- return storage.value ;
479
+ ETL_ASSERT (!has_value (), ETL_ERROR (etl::typed_storage_error));
480
+ pointer p = ::new (&storage.value ) value_type (t1, t2);
481
+ valid = true ;
482
+ return *p;
504
483
}
505
484
506
485
// ***************************************************************************
@@ -510,17 +489,10 @@ namespace etl
510
489
template <typename T1, typename T2, typename T3>
511
490
reference create (const T1& t1, const T2& t2, const T3& t3)
512
491
{
513
- if (has_value ())
514
- {
515
- storage.value = T (t1, t2, t3);
516
- }
517
- else
518
- {
519
- valid = true ;
520
- ::new (&storage.value ) value_type (t1, t2, t3);
521
- }
522
-
523
- return storage.value ;
492
+ ETL_ASSERT (!has_value (), ETL_ERROR (etl::typed_storage_error));
493
+ pointer p = ::new (&storage.value ) value_type (t1, t2, t3);
494
+ valid = true ;
495
+ return *p;
524
496
}
525
497
526
498
// ***************************************************************************
@@ -530,17 +502,10 @@ namespace etl
530
502
template <typename T1, typename T2, typename T3, typename T4>
531
503
reference create (const T1& t1, const T2& t2, const T3& t3, const T4& t4)
532
504
{
533
- if (has_value ())
534
- {
535
- storage.value = T (t1, t2, t3, t4);
536
- }
537
- else
538
- {
539
- valid = true ;
540
- ::new (&storage.value ) value_type (t1, t2, t3, t4);
541
- }
542
-
543
- return storage.value ;
505
+ ETL_ASSERT (!has_value (), ETL_ERROR (etl::typed_storage_error));
506
+ pointer p = ::new (&storage.value ) value_type (t1, t2, t3, t4);
507
+ valid = true ;
508
+ return *p;
544
509
}
545
510
#endif
546
511
@@ -684,6 +649,7 @@ namespace etl
684
649
, valid(false )
685
650
{
686
651
ETL_ASSERT (etl::is_aligned (pbuffer_, etl::alignment_of<T>::value), ETL_ERROR (etl::alignment_error));
652
+ create (t1);
687
653
}
688
654
689
655
// ***************************************************************************
@@ -744,62 +710,67 @@ namespace etl
744
710
#if ETL_USING_CPP11
745
711
// ***************************************************************************
746
712
// / Constructs the instance of T forwarding the given \p args to its constructor.
747
- // / \returns the instance of T which has been constructed in the internal byte array .
713
+ // / \returns the instance of T which has been constructed in the external buffer .
748
714
// ***************************************************************************
749
715
template <typename ... TArgs>
750
716
reference create (TArgs&&... args) ETL_NOEXCEPT_EXPR(ETL_NOT_USING_EXCEPTIONS)
751
717
{
752
718
ETL_ASSERT (!has_value (), ETL_ERROR (etl::typed_storage_error));
719
+ pointer p = ::new (pbuffer) value_type (etl::forward<TArgs>(args)...);
753
720
valid = true ;
754
- return *:: new (pbuffer) value_type (etl::forward<TArgs>(args)...) ;
721
+ return *p ;
755
722
}
756
723
#else
757
724
// ***************************************************************************
758
725
// / Constructs the instance of T with type T1
759
- // / \returns the instance of T which has been constructed in the internal byte array .
726
+ // / \returns the instance of T which has been constructed in the external buffer .
760
727
// ***************************************************************************
761
728
template <typename T1>
762
729
reference create (const T1& t1)
763
730
{
764
731
ETL_ASSERT (!has_value (), ETL_ERROR (etl::typed_storage_error));
732
+ pointer p = ::new (pbuffer) value_type (t1);
765
733
valid = true ;
766
- return *:: new (pbuffer) value_type (t1) ;
734
+ return *p ;
767
735
}
768
736
769
737
// ***************************************************************************
770
738
// / Constructs the instance of T with types T1, T2
771
- // / \returns the instance of T which has been constructed in the internal byte array .
739
+ // / \returns the instance of T which has been constructed in the external buffer .
772
740
// ***************************************************************************
773
741
template <typename T1, typename T2>
774
742
reference create (const T1& t1, const T2& t2)
775
743
{
776
744
ETL_ASSERT (!has_value (), ETL_ERROR (etl::typed_storage_error));
745
+ pointer p = ::new (pbuffer) value_type (t1, t2);
777
746
valid = true ;
778
- return *:: new (pbuffer) value_type (t1, t2) ;
747
+ return *p ;
779
748
}
780
749
781
750
// ***************************************************************************
782
751
// / Constructs the instance of T with types T1, T2, T3
783
- // / \returns the instance of T which has been constructed in the internal byte array .
752
+ // / \returns the instance of T which has been constructed in the external buffer .
784
753
// ***************************************************************************
785
754
template <typename T1, typename T2, typename T3>
786
755
reference create (const T1& t1, const T2& t2, const T3& t3)
787
756
{
788
757
ETL_ASSERT (!has_value (), ETL_ERROR (etl::typed_storage_error));
758
+ pointer p = ::new (pbuffer) value_type (t1, t2, t3);
789
759
valid = true ;
790
- return *:: new (pbuffer) value_type (t1, t2, t3) ;
760
+ return *p ;
791
761
}
792
762
793
763
// ***************************************************************************
794
764
// / Constructs the instance of T with types T1, T2, T3, T4
795
- // / \returns the instance of T which has been constructed in the internal byte array .
765
+ // / \returns the instance of T which has been constructed in the external buffer .
796
766
// ***************************************************************************
797
767
template <typename T1, typename T2, typename T3, typename T4>
798
768
reference create (const T1& t1, const T2& t2, const T3& t3, const T4& t4)
799
769
{
800
770
ETL_ASSERT (!has_value (), ETL_ERROR (etl::typed_storage_error));
771
+ pointer p = ::new (pbuffer) value_type (t1, t2, t3, t4);
801
772
valid = true ;
802
- return *:: new (pbuffer) value_type (t1, t2, t3, t4) ;
773
+ return *p ;
803
774
}
804
775
#endif
805
776
0 commit comments