@@ -478,7 +478,7 @@ DictionaryTestSuite.test("COW.Slow.AddDoesNotReallocate") {
478
478
}
479
479
}
480
480
481
- DictionaryTestSuite . test ( " COW.Fast.MergeDoesNotReallocate " ) {
481
+ DictionaryTestSuite . test ( " COW.Fast.MergeSequenceDoesNotReallocate " ) {
482
482
do {
483
483
var d1 = getCOWFastDictionary ( )
484
484
var identity1 = d1. _rawIdentifier ( )
@@ -502,6 +502,13 @@ DictionaryTestSuite.test("COW.Fast.MergeDoesNotReallocate") {
502
502
assert ( d1. count == 7 )
503
503
assert ( d1 [ 30 ] ! == 1030 )
504
504
assert ( d1 [ 70 ] ! == 2070 )
505
+
506
+ let d2 = d1. merging ( [ ( 40 , 3040 ) , ( 80 , 3080 ) ] ) { _, y in y }
507
+ assert ( identity1 == d1. _rawIdentifier ( ) )
508
+ assert ( identity1 != d2. _rawIdentifier ( ) )
509
+ assert ( d2. count == 8 )
510
+ assert ( d2 [ 40 ] ! == 3040 )
511
+ assert ( d2 [ 80 ] ! == 3080 )
505
512
}
506
513
507
514
do {
@@ -592,6 +599,127 @@ DictionaryTestSuite.test("COW.Fast.MergeDoesNotReallocate") {
592
599
}
593
600
}
594
601
602
+ DictionaryTestSuite . test ( " COW.Fast.MergeDictionaryDoesNotReallocate " ) {
603
+ do {
604
+ var d1 = getCOWFastDictionary ( )
605
+ var identity1 = d1. _rawIdentifier ( )
606
+
607
+ // Merge some new values.
608
+ d1. merge ( [ 40 : 2040 , 50 : 2050 ] ) { _, y in y }
609
+ assert ( identity1 == d1. _rawIdentifier ( ) )
610
+ assert ( d1. count == 5 )
611
+ assert ( d1 [ 50 ] ! == 2050 )
612
+
613
+ // Merge and overwrite some existing values.
614
+ d1. merge ( [ 10 : 2010 , 60 : 2060 ] ) { _, y in y }
615
+ assert ( identity1 == d1. _rawIdentifier ( ) )
616
+ assert ( d1. count == 6 )
617
+ assert ( d1 [ 10 ] ! == 2010 )
618
+ assert ( d1 [ 60 ] ! == 2060 )
619
+
620
+ // Merge, keeping existing values.
621
+ d1. merge ( [ 30 : 2030 , 70 : 2070 ] ) { x, _ in x }
622
+ assert ( identity1 == d1. _rawIdentifier ( ) )
623
+ assert ( d1. count == 7 )
624
+ assert ( d1 [ 30 ] ! == 1030 )
625
+ assert ( d1 [ 70 ] ! == 2070 )
626
+
627
+ let d2 = d1. merging ( [ 40 : 3040 , 80 : 3080 ] ) { _, y in y }
628
+ assert ( identity1 == d1. _rawIdentifier ( ) )
629
+ assert ( identity1 != d2. _rawIdentifier ( ) )
630
+ assert ( d2. count == 8 )
631
+ assert ( d2 [ 40 ] ! == 3040 )
632
+ assert ( d2 [ 80 ] ! == 3080 )
633
+ }
634
+
635
+ do {
636
+ var d1 = getCOWFastDictionary ( )
637
+ var identity1 = d1. _rawIdentifier ( )
638
+
639
+ var d2 = d1
640
+ assert ( identity1 == d1. _rawIdentifier ( ) )
641
+ assert ( identity1 == d2. _rawIdentifier ( ) )
642
+
643
+ // Merge some new values.
644
+ d2. merge ( [ 40 : 2040 , 50 : 2050 ] ) { _, y in y }
645
+ assert ( identity1 == d1. _rawIdentifier ( ) )
646
+ assert ( identity1 != d2. _rawIdentifier ( ) )
647
+
648
+ assert ( d1. count == 3 )
649
+ assert ( d1 [ 10 ] ! == 1010 )
650
+ assert ( d1 [ 20 ] ! == 1020 )
651
+ assert ( d1 [ 30 ] ! == 1030 )
652
+ assert ( d1 [ 40 ] == nil )
653
+
654
+ assert ( d2. count == 5 )
655
+ assert ( d2 [ 10 ] ! == 1010 )
656
+ assert ( d2 [ 20 ] ! == 1020 )
657
+ assert ( d2 [ 30 ] ! == 1030 )
658
+ assert ( d2 [ 40 ] ! == 2040 )
659
+ assert ( d2 [ 50 ] ! == 2050 )
660
+
661
+ // Keep variables alive.
662
+ _fixLifetime ( d1)
663
+ _fixLifetime ( d2)
664
+ }
665
+
666
+ do {
667
+ var d1 = getCOWFastDictionary ( )
668
+ var identity1 = d1. _rawIdentifier ( )
669
+
670
+ var d2 = d1
671
+ assert ( identity1 == d1. _rawIdentifier ( ) )
672
+ assert ( identity1 == d2. _rawIdentifier ( ) )
673
+
674
+ // Merge and overwrite some existing values.
675
+ d2. merge ( [ 10 : 2010 ] ) { _, y in y }
676
+ assert ( identity1 == d1. _rawIdentifier ( ) )
677
+ assert ( identity1 != d2. _rawIdentifier ( ) )
678
+
679
+ assert ( d1. count == 3 )
680
+ assert ( d1 [ 10 ] ! == 1010 )
681
+ assert ( d1 [ 20 ] ! == 1020 )
682
+ assert ( d1 [ 30 ] ! == 1030 )
683
+
684
+ assert ( d2. count == 3 )
685
+ assert ( d2 [ 10 ] ! == 2010 )
686
+ assert ( d2 [ 20 ] ! == 1020 )
687
+ assert ( d2 [ 30 ] ! == 1030 )
688
+
689
+ // Keep variables alive.
690
+ _fixLifetime ( d1)
691
+ _fixLifetime ( d2)
692
+ }
693
+
694
+ do {
695
+ var d1 = getCOWFastDictionary ( )
696
+ var identity1 = d1. _rawIdentifier ( )
697
+
698
+ var d2 = d1
699
+ assert ( identity1 == d1. _rawIdentifier ( ) )
700
+ assert ( identity1 == d2. _rawIdentifier ( ) )
701
+
702
+ // Merge, keeping existing values.
703
+ d2. merge ( [ 10 : 2010 ] ) { x, _ in x }
704
+ assert ( identity1 == d1. _rawIdentifier ( ) )
705
+ assert ( identity1 != d2. _rawIdentifier ( ) )
706
+
707
+ assert ( d1. count == 3 )
708
+ assert ( d1 [ 10 ] ! == 1010 )
709
+ assert ( d1 [ 20 ] ! == 1020 )
710
+ assert ( d1 [ 30 ] ! == 1030 )
711
+
712
+ assert ( d2. count == 3 )
713
+ assert ( d2 [ 10 ] ! == 1010 )
714
+ assert ( d2 [ 20 ] ! == 1020 )
715
+ assert ( d2 [ 30 ] ! == 1030 )
716
+
717
+ // Keep variables alive.
718
+ _fixLifetime ( d1)
719
+ _fixLifetime ( d2)
720
+ }
721
+ }
722
+
595
723
DictionaryTestSuite . test ( " COW.Fast.DefaultedSubscriptDoesNotReallocate " ) {
596
724
do {
597
725
var d1 = getCOWFastDictionary ( )
0 commit comments