-
Notifications
You must be signed in to change notification settings - Fork 10.4k
/
Copy pathKeyPathPerformanceTests.swift
1775 lines (1671 loc) · 58.7 KB
/
KeyPathPerformanceTests.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
//===--- KeyPathPerformanceTests.swift -------------------------------------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2022 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
import TestsUtils
public let benchmarks = [
BenchmarkInfo(
name: "KeyPathNestedStructs",
runFunction: run_KeyPathNestedStructs,
tags: [.validation, .api],
setUpFunction: setupKeyPathNestedStructs
),
BenchmarkInfo(
name: "KeyPathDirectAccess",
runFunction: run_testDirectAccess,
tags: [.validation, .api, .skip],
setUpFunction: setupSingleton
),
BenchmarkInfo(
name: "KeyPathReadPerformance",
runFunction: run_testKeyPathReadPerformance,
tags: [.validation, .api],
setUpFunction: setupSingleton
),
BenchmarkInfo(
name: "KeyPathWritePerformance",
runFunction: run_testKeyPathWritePerformance,
tags: [.validation, .api],
setUpFunction: setupSingleton
),
BenchmarkInfo(
name: "KeyPathsSmallStruct",
runFunction: run_testKeyPathSmallStruct,
tags: [.validation, .api],
setUpFunction: setupSingleton
),
BenchmarkInfo(
name: "KeyPathMutatingGetset",
runFunction: run_KeyPathMutatingGetset,
tags: [.validation, .api],
setUpFunction: setupKeyPathNestedStructs
),
BenchmarkInfo(
name: "KeyPathGet",
runFunction: run_KeyPathGet,
tags: [.validation, .api],
setUpFunction: setupKeyPathNestedStructs
),
BenchmarkInfo(
name: "KeyPathOptionals",
runFunction: run_KeyPathOptionals,
tags: [.validation, .api],
setUpFunction: setupKeyPathNestedStructs
),
BenchmarkInfo(
name: "KeyPathNestedClasses",
runFunction: run_KeyPathNestedClasses,
tags: [.validation, .api],
setUpFunction: setupKeyPathNestedStructs
),
BenchmarkInfo(
name: "KeyPathClassStructs",
runFunction: run_KeyPathClassStructs,
tags: [.validation, .api],
setUpFunction: setupKeyPathNestedStructs
),
]
/**
There are several types of KeyPathComponents.
The following table indicates which type is featured in which benchmark.
Note that some types may be observed in other benchmarks as well.
| KeyPathComponent Type |Featured in Benchmark |
|-----------------------|:---------------------------------|
| struct |*run_KeyPathNestedStruct()* |
| class |*run_KeyPathNestedClasses()* |
| get |*run_KeyPathGet()* |
| mutatingGetset |*run_KeyPathMutatingGetset()* |
| nonmutatingGetset |*run_KeyPathNonmutatingGetset()* |
| optionalChain |*run_KeyPathOptionals()* |
| optionalForce |*run_KeyPathOptionals()* |
| optionalWrap |*run_KeyPathOptionals()* |
*/
let numberOfElementsForNestedStructs = 20000
let expectedIntForNestedItems = 3
// Make it easy to switch between primitives of different types (Int, Float, Double, etc.).
typealias ElementType = Double
// The purpose of this class is to hold arrays used during the course of the benchmarks.
// This is to avoid storing them in the global scope, which can slow things down.
class FixedSizeArrayHolder {
var fixedSizeArray100: FixedSizeArray100<ElementType>
var fixedSizeArray10: FixedSizeArray10<ElementType>
var mainArrayForNestedStructs: [A]
var mainArrayForClassStructs: [D1]
var arrayForMutatingGetset: [MutatingGetsetNested1]
var arrayForGet: [GetNested1]
var arrayForOptionals: [Optional1]
var arrayForNestedClasses: [C1]
var arrayForNonMutatingGetset: [M]
var keypathForMutatingGetSet: WritableKeyPath<MutatingGetsetNested1, Int>
var keypathForGet: KeyPath<GetNested1, Int>
var keypathForOptional: KeyPath<Optional1, Int?>
var keypathForNestedClasses: KeyPath<C1, Int>
var keypathForNonMutatingGetset: WritableKeyPath<M, Int>
var keypathForClassStructs: WritableKeyPath<D1, Int>
// Same order as in KeyPathWritePerformance
var kp46: WritableKeyPath<FixedSizeArray100<ElementType>, ElementType>
var kp43: WritableKeyPath<FixedSizeArray100<ElementType>, ElementType>
var kp81: WritableKeyPath<FixedSizeArray100<ElementType>, ElementType>
var kp31: WritableKeyPath<FixedSizeArray100<ElementType>, ElementType>
var kp35: WritableKeyPath<FixedSizeArray100<ElementType>, ElementType>
var kp14: WritableKeyPath<FixedSizeArray100<ElementType>, ElementType>
var kp51: WritableKeyPath<FixedSizeArray100<ElementType>, ElementType>
var kp24: WritableKeyPath<FixedSizeArray100<ElementType>, ElementType>
var kp90: WritableKeyPath<FixedSizeArray100<ElementType>, ElementType>
var kp80: WritableKeyPath<FixedSizeArray100<ElementType>, ElementType>
var kp47: WritableKeyPath<FixedSizeArray100<ElementType>, ElementType>
var kp92: WritableKeyPath<FixedSizeArray100<ElementType>, ElementType>
var kp78: WritableKeyPath<FixedSizeArray100<ElementType>, ElementType>
var kp79: WritableKeyPath<FixedSizeArray100<ElementType>, ElementType>
var kp48: WritableKeyPath<FixedSizeArray100<ElementType>, ElementType>
var kp64: WritableKeyPath<FixedSizeArray100<ElementType>, ElementType>
var kp65: WritableKeyPath<FixedSizeArray100<ElementType>, ElementType>
var kp19: WritableKeyPath<FixedSizeArray100<ElementType>, ElementType>
var kp66: WritableKeyPath<FixedSizeArray100<ElementType>, ElementType>
var kp10: WritableKeyPath<FixedSizeArray100<ElementType>, ElementType>
var kp89: WritableKeyPath<FixedSizeArray100<ElementType>, ElementType>
var kp16: WritableKeyPath<FixedSizeArray100<ElementType>, ElementType>
var kp06: WritableKeyPath<FixedSizeArray100<ElementType>, ElementType>
var kp26: WritableKeyPath<FixedSizeArray100<ElementType>, ElementType>
var kp83: WritableKeyPath<FixedSizeArray100<ElementType>, ElementType>
// Same order as in KeyPathReadPerformance, with duplicates removed.
var kp99: WritableKeyPath<FixedSizeArray100<ElementType>, ElementType>
var kp27: WritableKeyPath<FixedSizeArray100<ElementType>, ElementType>
var kp09: WritableKeyPath<FixedSizeArray100<ElementType>, ElementType>
var kp84: WritableKeyPath<FixedSizeArray100<ElementType>, ElementType>
var kp22: WritableKeyPath<FixedSizeArray100<ElementType>, ElementType>
var kp82: WritableKeyPath<FixedSizeArray100<ElementType>, ElementType>
var kp86: WritableKeyPath<FixedSizeArray100<ElementType>, ElementType>
var kp49: WritableKeyPath<FixedSizeArray100<ElementType>, ElementType>
var kp18: WritableKeyPath<FixedSizeArray100<ElementType>, ElementType>
var kp97: WritableKeyPath<FixedSizeArray100<ElementType>, ElementType>
var kp69: WritableKeyPath<FixedSizeArray100<ElementType>, ElementType>
var kp76: WritableKeyPath<FixedSizeArray100<ElementType>, ElementType>
var kp32: WritableKeyPath<FixedSizeArray100<ElementType>, ElementType>
var kp52: WritableKeyPath<FixedSizeArray100<ElementType>, ElementType>
var kp87: WritableKeyPath<FixedSizeArray100<ElementType>, ElementType>
var kp67: WritableKeyPath<FixedSizeArray100<ElementType>, ElementType>
var kp12: WritableKeyPath<FixedSizeArray100<ElementType>, ElementType>
var kp21: WritableKeyPath<FixedSizeArray100<ElementType>, ElementType>
var kp77: WritableKeyPath<FixedSizeArray100<ElementType>, ElementType>
var kp40: WritableKeyPath<FixedSizeArray100<ElementType>, ElementType>
var kp60: WritableKeyPath<FixedSizeArray100<ElementType>, ElementType>
var kp50: WritableKeyPath<FixedSizeArray100<ElementType>, ElementType>
// Same order as in KeyPathSmallStruct.
var kp0: WritableKeyPath<FixedSizeArray10<ElementType>, ElementType>
var kp1: WritableKeyPath<FixedSizeArray10<ElementType>, ElementType>
var kp2: WritableKeyPath<FixedSizeArray10<ElementType>, ElementType>
var kp3: WritableKeyPath<FixedSizeArray10<ElementType>, ElementType>
var kp4: WritableKeyPath<FixedSizeArray10<ElementType>, ElementType>
var kp5: WritableKeyPath<FixedSizeArray10<ElementType>, ElementType>
var kp6: WritableKeyPath<FixedSizeArray10<ElementType>, ElementType>
var kp7: WritableKeyPath<FixedSizeArray10<ElementType>, ElementType>
var kp8: WritableKeyPath<FixedSizeArray10<ElementType>, ElementType>
var kp9: WritableKeyPath<FixedSizeArray10<ElementType>, ElementType>
static let shared = FixedSizeArrayHolder()
init() {
fixedSizeArray100 = initializeFixedSizeArray100()
fixedSizeArray10 = initializeFixedSizeArray10()
mainArrayForNestedStructs = [A]()
mainArrayForClassStructs = [D1]()
arrayForMutatingGetset = [MutatingGetsetNested1]()
arrayForGet = [GetNested1]()
arrayForOptionals = [Optional1]()
arrayForNestedClasses = [C1]()
arrayForNonMutatingGetset = [M]()
kp46 = identity(FixedSizeArray100<ElementType>.getKeypathToElement(index: 46))
kp43 = identity(FixedSizeArray100<ElementType>.getKeypathToElement(index: 43))
kp81 = identity(FixedSizeArray100<ElementType>.getKeypathToElement(index: 81))
kp31 = identity(FixedSizeArray100<ElementType>.getKeypathToElement(index: 31))
kp35 = identity(FixedSizeArray100<ElementType>.getKeypathToElement(index: 35))
kp14 = identity(FixedSizeArray100<ElementType>.getKeypathToElement(index: 14))
kp51 = identity(FixedSizeArray100<ElementType>.getKeypathToElement(index: 51))
kp24 = identity(FixedSizeArray100<ElementType>.getKeypathToElement(index: 24))
kp90 = identity(FixedSizeArray100<ElementType>.getKeypathToElement(index: 90))
kp80 = identity(FixedSizeArray100<ElementType>.getKeypathToElement(index: 80))
kp47 = identity(FixedSizeArray100<ElementType>.getKeypathToElement(index: 47))
kp92 = identity(FixedSizeArray100<ElementType>.getKeypathToElement(index: 92))
kp78 = identity(FixedSizeArray100<ElementType>.getKeypathToElement(index: 78))
kp79 = identity(FixedSizeArray100<ElementType>.getKeypathToElement(index: 79))
kp48 = identity(FixedSizeArray100<ElementType>.getKeypathToElement(index: 48))
kp64 = identity(FixedSizeArray100<ElementType>.getKeypathToElement(index: 64))
kp65 = identity(FixedSizeArray100<ElementType>.getKeypathToElement(index: 65))
kp19 = identity(FixedSizeArray100<ElementType>.getKeypathToElement(index: 19))
kp66 = identity(FixedSizeArray100<ElementType>.getKeypathToElement(index: 66))
kp10 = identity(FixedSizeArray100<ElementType>.getKeypathToElement(index: 10))
kp89 = identity(FixedSizeArray100<ElementType>.getKeypathToElement(index: 89))
kp16 = identity(FixedSizeArray100<ElementType>.getKeypathToElement(index: 16))
kp06 = identity(FixedSizeArray100<ElementType>.getKeypathToElement(index: 06))
kp26 = identity(FixedSizeArray100<ElementType>.getKeypathToElement(index: 26))
kp83 = identity(FixedSizeArray100<ElementType>.getKeypathToElement(index: 83))
kp99 = identity(FixedSizeArray100<ElementType>.getKeypathToElement(index: 99))
kp27 = identity(FixedSizeArray100<ElementType>.getKeypathToElement(index: 27))
kp09 = identity(FixedSizeArray100<ElementType>.getKeypathToElement(index: 09))
kp84 = identity(FixedSizeArray100<ElementType>.getKeypathToElement(index: 84))
kp22 = identity(FixedSizeArray100<ElementType>.getKeypathToElement(index: 22))
kp82 = identity(FixedSizeArray100<ElementType>.getKeypathToElement(index: 82))
kp86 = identity(FixedSizeArray100<ElementType>.getKeypathToElement(index: 86))
kp49 = identity(FixedSizeArray100<ElementType>.getKeypathToElement(index: 49))
kp18 = identity(FixedSizeArray100<ElementType>.getKeypathToElement(index: 18))
kp97 = identity(FixedSizeArray100<ElementType>.getKeypathToElement(index: 97))
kp69 = identity(FixedSizeArray100<ElementType>.getKeypathToElement(index: 69))
kp76 = identity(FixedSizeArray100<ElementType>.getKeypathToElement(index: 76))
kp32 = identity(FixedSizeArray100<ElementType>.getKeypathToElement(index: 32))
kp52 = identity(FixedSizeArray100<ElementType>.getKeypathToElement(index: 52))
kp24 = identity(FixedSizeArray100<ElementType>.getKeypathToElement(index: 24))
kp87 = identity(FixedSizeArray100<ElementType>.getKeypathToElement(index: 87))
kp67 = identity(FixedSizeArray100<ElementType>.getKeypathToElement(index: 67))
kp65 = identity(FixedSizeArray100<ElementType>.getKeypathToElement(index: 65))
kp43 = identity(FixedSizeArray100<ElementType>.getKeypathToElement(index: 43))
kp12 = identity(FixedSizeArray100<ElementType>.getKeypathToElement(index: 12))
kp21 = identity(FixedSizeArray100<ElementType>.getKeypathToElement(index: 21))
kp77 = identity(FixedSizeArray100<ElementType>.getKeypathToElement(index: 77))
kp40 = identity(FixedSizeArray100<ElementType>.getKeypathToElement(index: 40))
kp60 = identity(FixedSizeArray100<ElementType>.getKeypathToElement(index: 60))
kp50 = identity(FixedSizeArray100<ElementType>.getKeypathToElement(index: 50))
kp0 = identity(FixedSizeArray10<ElementType>.getKeypathToElement(index: 0))
kp1 = identity(FixedSizeArray10<ElementType>.getKeypathToElement(index: 1))
kp2 = identity(FixedSizeArray10<ElementType>.getKeypathToElement(index: 2))
kp3 = identity(FixedSizeArray10<ElementType>.getKeypathToElement(index: 3))
kp4 = identity(FixedSizeArray10<ElementType>.getKeypathToElement(index: 4))
kp5 = identity(FixedSizeArray10<ElementType>.getKeypathToElement(index: 5))
kp6 = identity(FixedSizeArray10<ElementType>.getKeypathToElement(index: 6))
kp7 = identity(FixedSizeArray10<ElementType>.getKeypathToElement(index: 7))
kp8 = identity(FixedSizeArray10<ElementType>.getKeypathToElement(index: 8))
kp9 = identity(FixedSizeArray10<ElementType>.getKeypathToElement(index: 9))
keypathForMutatingGetSet = identity(\MutatingGetsetNested1.nestedItem.nestedItem.nestedItem
.nestedItem.storage)
keypathForGet = identity(\GetNested1.nestedItem.nestedItem.nestedItem.nestedItem.storage)
keypathForOptional = identity(\Optional1._nestedItemStorage?!._nestedItemStorage?!
._nestedItemStorage?!._nestedItemStorage?!._storage)
keypathForNestedClasses = identity(\C1.r.r.r.r.a)
keypathForNonMutatingGetset = identity(\M.n.o.p.q.q)
keypathForClassStructs = identity(\D1.b.c.d.e.e)
}
}
// Setup Functions.
public func setupKeyPathNestedStructs() {
let holder = FixedSizeArrayHolder.shared
for _ in 0 ..< numberOfElementsForNestedStructs {
let instance = A(a: 0, b: B(b: 0, c: C(c: 0, d: D(d: 0, e: E(e: expectedIntForNestedItems)))))
holder.mainArrayForNestedStructs.append(instance)
let classStructInstance = D1(b: D2(b: 0, c: D3(c: 0, d: D4(d: 0,
e: D5(e: expectedIntForNestedItems)))))
holder.mainArrayForClassStructs.append(classStructInstance)
var mutatingGetsetInstance = MutatingGetsetNested1()
mutatingGetsetInstance.nestedItem.nestedItem.nestedItem.nestedItem
.storage = expectedIntForNestedItems
holder.arrayForMutatingGetset.append(mutatingGetsetInstance)
holder.arrayForGet.append(GetNested1())
holder.arrayForOptionals.append(Optional1())
holder.arrayForNestedClasses.append(C1())
holder.arrayForNonMutatingGetset
.append(M(n: N(o: O(p: P(q: Q(q: expectedIntForNestedItems))))))
}
}
public func setupSingleton() {
blackHole(FixedSizeArrayHolder.shared)
}
// We would like to compute the sums of the arrays once the iterations finish,
// and doing it this way it likely faster than using keypaths via getKeypathToElement().
func computeSumOfFixedSizeArray100(fixedSizeArray100: inout FixedSizeArray100<ElementType>)
-> ElementType
{
var sum = ElementType(0)
withUnsafeBytes(of: fixedSizeArray100) {
var pointer = $0.baseAddress.unsafelyUnwrapped
for _ in 0 ..< fixedSizeArray100.count {
sum += pointer.assumingMemoryBound(to: ElementType.self).pointee
pointer = pointer.advanced(by: MemoryLayout<ElementType>.size)
}
}
return sum
}
func computeSumOfFixedSizeArray10(fixedSizeArray10: inout FixedSizeArray10<ElementType>)
-> ElementType
{
var sum = ElementType(0)
withUnsafeBytes(of: fixedSizeArray10) {
var pointer = $0.baseAddress.unsafelyUnwrapped
for _ in 0 ..< fixedSizeArray10.count {
sum += pointer.assumingMemoryBound(to: ElementType.self).pointee
pointer = pointer.advanced(by: MemoryLayout<ElementType>.size)
}
}
return sum
}
// Used for run_KeyPathNestedStructs().
struct A {
var a: Int
var b: B
}
struct B {
var b: Int
var c: C
}
struct C {
var c: Int
var d: D
}
struct D {
var d: Int
var e: E
}
struct E {
var e: Int
}
// Used for run_KeyPathClassStruct().
class D1 {
var a: Int
var b: D2
init(b: D2)
{
a = 0
self.b = b
}
}
struct D2 {
var b: Int
var c: D3
}
struct D3 {
var c: Int
var d: D4
}
struct D4 {
var d: Int
var e: D5
}
struct D5 {
var e: Int
}
// Used for run_KeyPathNestedClasses()
class C1 {
let a: Int = 0
let r: C2 = .init()
class C2 {
let b: Int = 0
let r: C3 = .init()
class C3 {
let a: Int = 0
let r: C4 = .init()
class C4 {
let a: Int = 0
let r: C5 = .init()
class C5 {
let a: Int = expectedIntForNestedItems
}
}
}
}
}
// Used for run_KeyPathNonmutatingGetset()
class M {
var n: N
init(n: N) { self.n = n }
}
class N {
var o: O
init(o: O) { self.o = o }
}
class O {
var p: P
init(p: P) { self.p = p }
}
class P {
var q: Q
init(q: Q) { self.q = q }
}
class Q {
var q: Int
init(q: Int) { self.q = q }
}
// Used for run_KeyPathMutatingGetset()
struct MutatingGetsetNested1 {
var _storage: Int
var _nestedItemStorage: MutatingGetsetNested2
var storage: Int {
get { return _storage }
set { _storage = newValue }
}
var nestedItem: MutatingGetsetNested2 {
get { return _nestedItemStorage }
set { _nestedItemStorage = newValue }
}
init() {
_storage = 0
_nestedItemStorage = MutatingGetsetNested2()
}
}
struct MutatingGetsetNested2 {
var _storage: Int
var _nestedItemStorage: MutatingGetsetNested3
var storage: Int {
get { return _storage }
set { _storage = newValue }
}
var nestedItem: MutatingGetsetNested3 {
get { return _nestedItemStorage }
set { _nestedItemStorage = newValue }
}
init() {
_storage = 0
_nestedItemStorage = MutatingGetsetNested3()
}
}
struct MutatingGetsetNested3 {
var _storage: Int
var _nestedItemStorage: MutatingGetsetNested4
var storage: Int {
get { return _storage }
set { _storage = newValue }
}
var nestedItem: MutatingGetsetNested4 {
get { return _nestedItemStorage }
set { _nestedItemStorage = newValue }
}
init() {
_storage = 0
_nestedItemStorage = MutatingGetsetNested4()
}
}
struct MutatingGetsetNested4 {
var _storage: Int
var _nestedItemStorage: MutatingGetsetNested5
var storage: Int {
get { return _storage }
set { _storage = newValue }
}
var nestedItem: MutatingGetsetNested5 {
get { return _nestedItemStorage }
set { _nestedItemStorage = newValue }
}
init() {
_storage = 0
_nestedItemStorage = MutatingGetsetNested5()
}
}
struct MutatingGetsetNested5 {
var _storage: Int
var storage: Int {
get { return _storage }
set { _storage = newValue }
}
init() {
_storage = 10
}
}
// Used for run_KeyPathGet().
struct GetNested1 {
var _storage: Int
var _nestedItemStorage: GetNested2
var storage: Int { return _storage }
var nestedItem: GetNested2 { return _nestedItemStorage }
init() {
_storage = 0
_nestedItemStorage = GetNested2()
}
}
struct GetNested2 {
var _storage: Int
var _nestedItemStorage: GetNested3
var storage: Int { return _storage }
var nestedItem: GetNested3 { return _nestedItemStorage }
init() {
_storage = 0
_nestedItemStorage = GetNested3()
}
}
struct GetNested3 {
var _storage: Int
var _nestedItemStorage: GetNested4
var storage: Int { return _storage }
var nestedItem: GetNested4 { return _nestedItemStorage }
init() {
_storage = 0
_nestedItemStorage = GetNested4()
}
}
struct GetNested4 {
var _storage: Int
var _nestedItemStorage: GetNested5
var storage: Int { return _storage }
var nestedItem: GetNested5 { return _nestedItemStorage }
init() {
_storage = 0
_nestedItemStorage = GetNested5()
}
}
struct GetNested5 {
var _storage: Int
var storage: Int { return _storage }
init() {
_storage = expectedIntForNestedItems
}
}
// Used for run_KeyPathOptionals().
struct Optional1 {
var _storage: Int
var _nestedItemStorage: Optional2??
init() {
_storage = 0
_nestedItemStorage = Optional2()
}
}
struct Optional2 {
var _storage: Int
var _nestedItemStorage: Optional3??
init() {
_storage = 0
_nestedItemStorage = Optional3()
}
}
struct Optional3 {
var _storage: Int
var _nestedItemStorage: Optional4??
init() {
_storage = 0
_nestedItemStorage = Optional4()
}
}
struct Optional4 {
var _storage: Int
var _nestedItemStorage: Optional5??
init() {
_storage = 0
_nestedItemStorage = Optional5()
}
}
struct Optional5 {
public var _storage: Int
init() {
_storage = expectedIntForNestedItems
}
}
// Used for run_KeyPathFixedSizeArrayAccess() and run_testDirectAccess().
struct FixedSizeArray100<Element>: Sequence, IteratorProtocol {
let count: Int = 100
public init(
element0: Element,
element1: Element,
element2: Element,
element3: Element,
element4: Element,
element5: Element,
element6: Element,
element7: Element,
element8: Element,
element9: Element,
element10: Element,
element11: Element,
element12: Element,
element13: Element,
element14: Element,
element15: Element,
element16: Element,
element17: Element,
element18: Element,
element19: Element,
element20: Element,
element21: Element,
element22: Element,
element23: Element,
element24: Element,
element25: Element,
element26: Element,
element27: Element,
element28: Element,
element29: Element,
element30: Element,
element31: Element,
element32: Element,
element33: Element,
element34: Element,
element35: Element,
element36: Element,
element37: Element,
element38: Element,
element39: Element,
element40: Element,
element41: Element,
element42: Element,
element43: Element,
element44: Element,
element45: Element,
element46: Element,
element47: Element,
element48: Element,
element49: Element,
element50: Element,
element51: Element,
element52: Element,
element53: Element,
element54: Element,
element55: Element,
element56: Element,
element57: Element,
element58: Element,
element59: Element,
element60: Element,
element61: Element,
element62: Element,
element63: Element,
element64: Element,
element65: Element,
element66: Element,
element67: Element,
element68: Element,
element69: Element,
element70: Element,
element71: Element,
element72: Element,
element73: Element,
element74: Element,
element75: Element,
element76: Element,
element77: Element,
element78: Element,
element79: Element,
element80: Element,
element81: Element,
element82: Element,
element83: Element,
element84: Element,
element85: Element,
element86: Element,
element87: Element,
element88: Element,
element89: Element,
element90: Element,
element91: Element,
element92: Element,
element93: Element,
element94: Element,
element95: Element,
element96: Element,
element97: Element,
element98: Element,
element99: Element
) {
self.element0 = element0
self.element1 = element1
self.element2 = element2
self.element3 = element3
self.element4 = element4
self.element5 = element5
self.element6 = element6
self.element7 = element7
self.element8 = element8
self.element9 = element9
self.element10 = element10
self.element11 = element11
self.element12 = element12
self.element13 = element13
self.element14 = element14
self.element15 = element15
self.element16 = element16
self.element17 = element17
self.element18 = element18
self.element19 = element19
self.element20 = element20
self.element21 = element21
self.element22 = element22
self.element23 = element23
self.element24 = element24
self.element25 = element25
self.element26 = element26
self.element27 = element27
self.element28 = element28
self.element29 = element29
self.element30 = element30
self.element31 = element31
self.element32 = element32
self.element33 = element33
self.element34 = element34
self.element35 = element35
self.element36 = element36
self.element37 = element37
self.element38 = element38
self.element39 = element39
self.element40 = element40
self.element41 = element41
self.element42 = element42
self.element43 = element43
self.element44 = element44
self.element45 = element45
self.element46 = element46
self.element47 = element47
self.element48 = element48
self.element49 = element49
self.element50 = element50
self.element51 = element51
self.element52 = element52
self.element53 = element53
self.element54 = element54
self.element55 = element55
self.element56 = element56
self.element57 = element57
self.element58 = element58
self.element59 = element59
self.element60 = element60
self.element61 = element61
self.element62 = element62
self.element63 = element63
self.element64 = element64
self.element65 = element65
self.element66 = element66
self.element67 = element67
self.element68 = element68
self.element69 = element69
self.element70 = element70
self.element71 = element71
self.element72 = element72
self.element73 = element73
self.element74 = element74
self.element75 = element75
self.element76 = element76
self.element77 = element77
self.element78 = element78
self.element79 = element79
self.element80 = element80
self.element81 = element81
self.element82 = element82
self.element83 = element83
self.element84 = element84
self.element85 = element85
self.element86 = element86
self.element87 = element87
self.element88 = element88
self.element89 = element89
self.element90 = element90
self.element91 = element91
self.element92 = element92
self.element93 = element93
self.element94 = element94
self.element95 = element95
self.element96 = element96
self.element97 = element97
self.element98 = element98
self.element99 = element99
}
var element0: Element
var element1: Element
var element2: Element
var element3: Element
var element4: Element
var element5: Element
var element6: Element
var element7: Element
var element8: Element
var element9: Element
var element10: Element
var element11: Element
var element12: Element
var element13: Element
var element14: Element
var element15: Element
var element16: Element
var element17: Element
var element18: Element
var element19: Element
var element20: Element
var element21: Element
var element22: Element
var element23: Element
var element24: Element
var element25: Element
var element26: Element
var element27: Element
var element28: Element
var element29: Element
var element30: Element
var element31: Element
var element32: Element
var element33: Element
var element34: Element
var element35: Element
var element36: Element
var element37: Element
var element38: Element
var element39: Element
var element40: Element
var element41: Element
var element42: Element
var element43: Element
var element44: Element
var element45: Element
var element46: Element
var element47: Element
var element48: Element
var element49: Element
var element50: Element
var element51: Element
var element52: Element
var element53: Element
var element54: Element
var element55: Element
var element56: Element
var element57: Element
var element58: Element
var element59: Element
var element60: Element
var element61: Element
var element62: Element
var element63: Element
var element64: Element
var element65: Element
var element66: Element
var element67: Element
var element68: Element
var element69: Element
var element70: Element
var element71: Element
var element72: Element
var element73: Element
var element74: Element
var element75: Element
var element76: Element
var element77: Element
var element78: Element
var element79: Element
var element80: Element
var element81: Element
var element82: Element
var element83: Element
var element84: Element
var element85: Element
var element86: Element
var element87: Element
var element88: Element
var element89: Element
var element90: Element
var element91: Element
var element92: Element
var element93: Element
var element94: Element
var element95: Element
var element96: Element
var element97: Element
var element98: Element
var element99: Element
@inline(never)
static func getKeypathToElement(index: Int)
-> WritableKeyPath<FixedSizeArray100<Element>, Element>
{
switch index {
case 0:
return \FixedSizeArray100.element0
case 1:
return \FixedSizeArray100.element1
case 2:
return \FixedSizeArray100.element2
case 3:
return \FixedSizeArray100.element3
case 4:
return \FixedSizeArray100.element4
case 5:
return \FixedSizeArray100.element5
case 6:
return \FixedSizeArray100.element6
case 7:
return \FixedSizeArray100.element7
case 8:
return \FixedSizeArray100.element8
case 9:
return \FixedSizeArray100.element9
case 10:
return \FixedSizeArray100.element10
case 11:
return \FixedSizeArray100.element11
case 12:
return \FixedSizeArray100.element12
case 13:
return \FixedSizeArray100.element13
case 14:
return \FixedSizeArray100.element14
case 15:
return \FixedSizeArray100.element15
case 16:
return \FixedSizeArray100.element16
case 17:
return \FixedSizeArray100.element17
case 18:
return \FixedSizeArray100.element18
case 19:
return \FixedSizeArray100.element19
case 20:
return \FixedSizeArray100.element20
case 21:
return \FixedSizeArray100.element21
case 22:
return \FixedSizeArray100.element22
case 23:
return \FixedSizeArray100.element23
case 24:
return \FixedSizeArray100.element24
case 25:
return \FixedSizeArray100.element25
case 26:
return \FixedSizeArray100.element26
case 27:
return \FixedSizeArray100.element27
case 28:
return \FixedSizeArray100.element28
case 29:
return \FixedSizeArray100.element29
case 30:
return \FixedSizeArray100.element30
case 31:
return \FixedSizeArray100.element31
case 32:
return \FixedSizeArray100.element32
case 33:
return \FixedSizeArray100.element33
case 34:
return \FixedSizeArray100.element34
case 35:
return \FixedSizeArray100.element35
case 36:
return \FixedSizeArray100.element36