about summary refs log tree commit diff stats
path: root/ABOUT-NLS
blob: 92e0eef842e83fb6cdf21506fd22b2f8f8b5842c (plain) (blame)
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
Some of this discussion is obsolete - lynx does not bundle the "intl"
directory, and consequently the "--with-included-gettext" configure option is
not supported.
------------------------------------------------------------------------------

Notes on the Free Translation Project
*************************************

   Free software is going international!  The Free Translation Project
is a way to get maintainers of free software, translators, and users all
together, so that will gradually become able to speak many languages.
A few packages already provide translations for their messages.

   If you found this `ABOUT-NLS' file inside a distribution, you may
assume that the distributed package does use GNU `gettext' internally,
itself available at your nearest GNU archive site.  But you do *not*
need to install GNU `gettext' prior to configuring, installing or using
this package with messages translated.

   Installers will find here some useful hints.  These notes also
explain how users should proceed for getting the programs to use the
available translations.  They tell how people wanting to contribute and
work at translations should contact the appropriate team.

   When reporting bugs in the `intl/' directory or bugs which may be
related to internationalization, you should tell about the version of
`gettext' which is used.  The information can be found in the
`intl/VERSION' file, in internationalized packages.

One advise in advance
=====================

   If you want to exploit the full power of internationalization, you
should configure it using

     ./configure --with-included-gettext

to force usage of internationalizing routines provided within this
package, despite the existence of internationalizing capabilities in the
operating system where this package is being installed.  So far, only
the `gettext' implementation in the GNU C library version 2 provides as
many features (such as locale alias or message inheritance) as the
implementation here.  It is also not possible to offer this additional
functionality on top of a `catgets' implementation.  Future versions of
GNU `gettext' will very likely convey even more functionality.  So it
might be a good idea to change to GNU `gettext' as soon as possible.

   So you need not provide this option if you are using GNU libc 2 or
you have installed a recent copy of the GNU gettext package with the
included `libintl'.

INSTALL Matters
===============

   Some packages are "localizable" when properly installed; the
programs they contain can be made to speak your own native language.
Most such packages use GNU `gettext'.  Other packages have their own
ways to internationalization, predating GNU `gettext'.

   By default, this package will be installed to allow translation of
messages.  It will automatically detect whether the system provides
usable `catgets' (if using this is selected by the installer) or
`gettext' functions.  If neither is available, the GNU `gettext' own
library will be used.  This library is wholly contained within this
package, usually in the `intl/' subdirectory, so prior installation of
the GNU `gettext' package is *not* required.  Installers may use
special options at configuration time for changing the default
behaviour.  The commands:

     ./configure --with-included-gettext
     ./configure --with-catgets
     ./configure --disable-nls

will respectively bypass any pre-existing `catgets' or `gettext' to use
the internationalizing routines provided within this package, enable
the use of the `catgets' functions (if found on the locale system), or
else, *totally* disable translation of messages.

   When you already have GNU `gettext' installed on your system and run
configure without an option for your new package, `configure' will
probably detect the previously built and installed `libintl.a' file and
will decide to use this.  This might be not what is desirable.  You
should use the more recent version of the GNU `gettext' library.  I.e.
if the file `intl/VERSION' shows that the library which comes with this
package is more recent, you should use

     ./configure --with-included-gettext

to prevent auto-detection.

   By default the configuration process will not test for the `catgets'
function and therefore they will not be used.  The reasons are already
given above: the emulation on top of `catgets' cannot provide all the
extensions provided by the GNU `gettext' library.  If you nevertheless
want to use the `catgets' functions use

     ./configure --with-catgets

to enable the test for `catgets' (this causes no harm if `catgets' is
not available on your system).  If you really select this option we
would like to hear about the reasons because we cannot think of any
good one ourself.

   Internationalized packages have usually many `po/LL.po' files, where
LL gives an ISO 639 two-letter code identifying the language.  Unless
translations have been forbidden at `configure' time by using the
`--disable-nls' switch, all available translations are installed
together with the package.  However, the environment variable `LINGUAS'
may be set, prior to configuration, to limit the installed set.
`LINGUAS' should then contain a space separated list of two-letter
codes, stating which languages are allowed.

Using This Package
==================

   As a user, if your language has been installed for this package, you
only have to set the `LANG' environment variable to the appropriate
ISO 639 `LL' two-letter code prior to using the programs in the
package.  For example, let's suppose that you speak German.  At the
shell prompt, merely execute `setenv LANG de' (in `csh'),
`export LANG; LANG=de' (in `sh') or `export LANG=de' (in `bash').  This
can be done from your `.login' or `.profile' file, once and for all.

   An operating system might already offer message localization for
many of its programs, while other programs have been installed locally
with the full capabilities of GNU `gettext'.  Just using `gettext'
extended syntax for `LANG' would break proper localization of already
available operating system programs.  In this case, users should set
both `LANGUAGE' and `LANG' variables in their environment, as programs
using GNU `gettext' give preference to `LANGUAGE'.  For example, some
Swedish users would rather read translations in German than English for
when Swedish is not available.  This is easily accomplished by setting
`LANGUAGE' to `sv:de' while leaving `LANG' to `sv'.

Translating Teams
=================

   For the Free Translation Project to be a success, we need interested
people who like their own language and write it well, and who are also
able to synergize with other translators speaking the same language.
Each translation team has its own mailing list, courtesy of Linux
International.  You may reach your translation team at the address
`LL@li.org', replacing LL by the two-letter ISO 639 code for your
language.  Language codes are *not* the same as the country codes given
in ISO 3166.  The following translation teams exist, as of August 1998:

     Chinese `zh', Czech `cs', Danish `da', Dutch `nl', English `en',
     Esperanto `eo', Finnish `fi', French `fr', German `de', Hungarian
     `hu', Irish `ga', Italian `it', Indonesian `id', Japanese `ja',
     Korean `ko', Latin `la', Norwegian `no', Persian `fa', Polish
     `pl', Portuguese `pt', Russian `ru', Slovenian `sl', Spanish `es',
     Swedish `sv', and Turkish `tr'.

For example, you may reach the Chinese translation team by writing to
`zh@li.org'.

   If you'd like to volunteer to *work* at translating messages, you
should become a member of the translating team for your own language.
The subscribing address is *not* the same as the list itself, it has
`-request' appended.  For example, speakers of Swedish can send a
message to `sv-request@li.org', having this message body:

     subscribe

   Keep in mind that team members are expected to participate
*actively* in translations, or at solving translational difficulties,
rather than merely lurking around.  If your team does not exist yet and
you want to start one, or if you are unsure about what to do or how to
get started, please write to `translation@iro.umontreal.ca' to reach the
coordinator for all translator teams.

   The English team is special.  It works at improving and uniformizing
the terminology in use.  Proven linguistic skill are praised more than
programming skill, here.

Available Packages
==================

   Languages are not equally supported in all packages.  The following
matrix shows the current state of internationalization, as of August
1998.  The matrix shows, in regard of each package, for which languages
PO files have been submitted to translation coordination.

     Ready PO files    cs da de el en es fi fr it
                     .----------------------------.
     bash            |       []             []    |
     bison           |       []             []    |
     clisp           |       []    [] []    []    |
     cpio            |       []       []    []    |
     diffutils       |       []       []    []    |
     enscript        |       []       [] [] []    |
     fileutils       | []    []       []    []    |
     findutils       |       []       []    [] [] |
     flex            |                []    []    |
     gcal            |       []             []    |
     gettext         |    [] [] []    []    []    |
     grep            |       [] []    []    []    |
     hello           |    [] []       []    [] [] |
     id-utils        |       []             []    |
     indent          |    [] []                   |
     libc            |       []       []    []    |
     m4              |       []             []    |
     make            |       []       []    []    |
     music           |                      []    |
     ptx             |       []       []    []    |
     recode          |    [] []       []    []    |
     sed             |                            |
     sh-utils        |       []       []    []    |
     sharutils       | []    [] []    []    []    |
     tar             | []    []             [] [] |
     texinfo         | []    []             []    |
     textutils       | []    []       []    []    |
     wdiff           | []    []       []    []    |
     wget            | []    [] []             [] |
                     `----------------------------'
                       cs da de el en es fi fr it
                        7  4 26  4  1 18  1 26  4
     
                       ja ko nl no pl pt ru sl sv
                     .----------------------------.
     bash            |       []                   |  3
     bison           |       []                   |  3
     clisp           |                            |  4
     cpio            |    [] []    []             |  6
     diffutils       |             []          [] |  5
     enscript        |       []             []    |  6
     fileutils       |    [] []    [] [] [] [] [] | 11
     findutils       |    [] []    []    []    [] |  9
     flex            |    []                   [] |  4
     gcal            |       []    []          [] |  5
     gettext         |    [] [] [] [] []    [] [] | 13
     grep            |    [] [] [] []    [] [] [] | 11
     hello           |    [] [] [] [] []    [] [] | 12
     id-utils        |             []             |  3
     indent          |    []       []    []       |  5
     libc            |    [] [] [] []          [] |  8
     m4              | []    []          []    [] |  6
     make            |    [] []    []             |  6
     music           |             []             |  2
     ptx             |       [] [] [] []       [] |  8
     recode          |       []    [] []    [] [] |  9
     sed             |                            |  0
     sh-utils        |       [] [] [] []       [] |  8
     sharutils       |       []                [] |  7
     tar             |    [] [] [] [] []    [] [] | 11
     texinfo         |       []                   |  4
     textutils       |    [] [] [] []          [] |  9
     wdiff           |       [] [] []          [] |  8
     wget            |          []                |  5
                     `----------------------------'
       18 teams        ja ko nl no pl pt ru sl sv
       29 domains       1 12 21 11 19  7  5  7 17  191

   Some counters in the preceding matrix are higher than the number of
visible blocks let us expect.  This is because a few extra PO files are
used for implementing regional variants of languages, or language
dialects.

   For a PO file in the matrix above to be effective, the package to
which it applies should also have been internationalized and
distributed as such by its maintainer.  There might be an observable
lag between the mere existence a PO file and its wide availability in a
distribution.

   If August 1998 seems to be old, you may fetch a more recent copy of
this `ABOUT-NLS' file on most GNU archive sites.

Using `gettext' in new packages
===============================

   If you are writing a freely available program and want to
internationalize it you are welcome to use GNU `gettext' in your
package.  Of course the GNU Public License applies to your sources from
then if you include `gettext' directly in your distribution on but
since you are writing free software anyway this is no restriction.

   Once the sources are change appropriately and the setup can handle to
use of `gettext' the only thing missing are the translations.  The Free
Translation Project is also available for packages which are not
developed inside the GNU project.  Therefore the information given above
applies also for every other Free Software Project.  Contact
`translation@iro.umontreal.ca' to make the `.pot' files available to
the translation teams.
K. Agaram <vc@akkartik.com> 2017-03-07 01:41:48 -0800 committer Kartik K. Agaram <vc@akkartik.com> 2017-03-07 01:41:48 -0800 3761' href='/akkartik/mu/commit/html/055shape_shifting_container.cc.html?h=main&id=9e751bb8c0cdf771d34c839cb6591d892b8e62de'>9e751bb8 ^
1c2d788b ^
9e751bb8 ^


204dae92 ^


2c678a4e ^

204dae92 ^





2c678a4e ^
9e751bb8 ^

1c2d788b ^
9e751bb8 ^


1c2d788b ^
9e751bb8 ^

1c2d788b ^
9e751bb8 ^


2c678a4e ^
204dae92 ^




2c678a4e ^
1c2d788b ^
9e751bb8 ^

204dae92 ^



1c2d788b ^
204dae92 ^





2c678a4e ^
204dae92 ^



2c678a4e ^
204dae92 ^






201458e3 ^
204dae92 ^


























201458e3 ^
204dae92 ^









201458e3 ^
204dae92 ^










201458e3 ^
204dae92 ^













201458e3 ^
204dae92 ^









201458e3 ^
204dae92 ^
ffc9e66b ^

204dae92 ^



1c2d788b ^
204dae92 ^


























9e751bb8 ^
1c2d788b ^
9e751bb8 ^
204dae92 ^



1c2d788b ^
204dae92 ^


1c2d788b ^

9e751bb8 ^

1c2d788b ^
9e751bb8 ^


1c2d788b ^

9e751bb8 ^
204dae92 ^
1c2d788b ^

204dae92 ^



9e751bb8 ^


204dae92 ^
fd7d8138 ^
204dae92 ^










1c2d788b ^
204dae92 ^
1c2d788b ^
9e751bb8 ^
204dae92 ^







9e751bb8 ^

204dae92 ^
9e751bb8 ^
204dae92 ^









1c2d788b ^
9e751bb8 ^

204dae92 ^






9e751bb8 ^


204dae92 ^
1c2d788b ^
850822ff ^
204dae92 ^



9e751bb8 ^




204dae92 ^
1c2d788b ^
850822ff ^
204dae92 ^



9e751bb8 ^




ffc9e66b ^
1c2d788b ^
ffc9e66b ^
204dae92 ^



9e751bb8 ^




204dae92 ^
1c2d788b ^
ffc9e66b ^
204dae92 ^



9e751bb8 ^


204dae92 ^
1c2d788b ^
850822ff ^
1c2d788b ^
ffc9e66b ^
204dae92 ^



9e751bb8 ^

204dae92 ^
1c2d788b ^
51728d93 ^
204dae92 ^



9e751bb8 ^



204dae92 ^
1c2d788b ^
850822ff ^
1c2d788b ^
ffc9e66b ^
1c2d788b ^
850822ff ^
204dae92 ^



9e751bb8 ^


204dae92 ^
1c2d788b ^
ffc9e66b ^
204dae92 ^



9e751bb8 ^






204dae92 ^
1c2d788b ^
ffc9e66b ^
204dae92 ^















201458e3 ^
204dae92 ^












3ea092f2 ^



















51728d93 ^
3ea092f2 ^








51728d93 ^
3ea092f2 ^

51728d93 ^
3ea092f2 ^








51728d93 ^
3ea092f2 ^

51728d93 ^

3ea092f2 ^








51728d93 ^
3ea092f2 ^



aac2775a ^






850822ff ^
aac2775a ^











ffc9e66b ^


51728d93 ^



aac2775a ^














ffc9e66b ^


51728d93 ^






aac2775a ^








ffc9e66b ^
aac2775a ^




















































3ea092f2 ^
aac2775a ^



































76755b28 ^


a654e4ec ^
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


                                                                                          
                                                  
                                                
                                  
                                                                                                               
                                           
                       

                                                                                                 
                                       
                                      
                                   
                             
                           
                             
                              
                                                                           
                                  
                            
                                                        
                             
                            
                               
        


                               





















                                                                                 
         
       
                             
                         


































                                                                                                                                                                                                                                                  
                                                                                                                                                                                                                                                                                                                                                                                                                                                  



                                                                                                                        
                                                                                                                            







                                                                                                                                                                                                                                                                                             
                                                                                                                            













                                                                                                                                                                                                                                                                                                
                                                                                                                            







                                                                                                                                                                                                                                                                                                
                                                                                                                            
                                                                                                                                                        
                                                                                                                                                                                                                                                                                                                                                                                                                                      








                                                                                                                      
                                                                                                                                                                                                                                       
                                          
                                                                                                                            

















































                                                                                                                                                                                                                                                                                                                                   
                                                                                                                                                                                                                                                                                                                                                                                  
                                                                                                                                                                                                                                                                               

                                                                                                                                                                                                                  








                                                                                                                                                                                                                                                                                                                                 
                                                                                                                                                                                      
                                                                                                                                                                                                                                        


                                                                                                                                                                                                                                                                                                                                                                                            
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   

                                                                                                                                                                                                                      

                                                                                                                                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                             




                                                                                                                                                                                                                                                                                                                                                                                                                      
                                                                                                                                                                                                                                                             
                                                                                                                                                                                                                                                       
                                                                                                                                                                                                                                                                                                                                                                                                                        

                                                                                                                                                                                                                                                                                                                                         
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
                                                                                                                                                                                                                      
                                                                                                                                                                                                                                                                                                                                                                                                       

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
                                                                                                                                                                                                                                                                               



                                                                                                                                                                                                                                                                                                                                                                                                                                                 
                                                                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                                                                                                                                                                                                                                                                                                                                                              
                                                                                                                                                                                                                                                                                                                                                                                                                                                     


                                                                                                                                                     
                                                                                                                                                                         




                                                                                                                                                                                                                                                                                                               
                                                                                                                                                                                                                                                                                 


                                                                                                                                                                                   
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      





                                                                                                                               
                                                                                                                             

























                                                                                                                                                                                                                                                                                                                                                                                                                                  
                                                                                                                             








                                                                                                                                                                                                                                                                                                 
                                                                                                                             









                                                                                                                                                                                                                                                                                                 
                                                                                                                             












                                                                                                                                                                                                                                                     
                                                                                                                             








                                                                                                                                                                                                                                                                                                                                                            
                                                                                                                             
                                                                                                                                                         
                                                                                                                                                                                                                                                                                                                                                                                                                                       


                                                                                                                                                                                                                                                               
                                                                                                                                                                     

























                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 
                                                                                                                                                                                                                                
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 
                                                                                                                                                                                                                                                                                                                                                                                                      


                                                                                                                                                                   
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        

                                                                                                                                                                                                                                                                                                          
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          

                                                                                                                                                                                                                  
                                                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                                                  
                                                                            
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  


                                                                                                                                                                                                                                                                                                                                                                                                                               

                                                                                                                                                                                                                                                                          
                                                                            
                                                                                                                                                                                                  









                                                                                                                                                                                                                                                     
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  
                                                                                                                                                                                                                                                                                             
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   
                                                                                                                                                  






                                                                                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                                                                                                
                                                                                                                                                                                                                     
                                                                                                                                                                








                                                                                                                                                                                                                                                                                                                                                         
                                                                                                                                                                                                                                                                                                                            
                                                                                                                                                                                                                                                                                                                                                                                   





                                                                                                                                                                                                            

                                                                                                                                                                                                                                                      
                                                                                                                                                                                  
                                                                                                                                                                                                                                                                                               
                                                                                                                                                                                                                                                                                                                                                                                                                                                                             


                                                                                                                                                                                                            



                                                                                                                                                                                                                                                      
                                                                                                                                                                                  
                                                                                                                                                                                                                                                                                               
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         


                                                                                                                                                                                                            



                                                                                                                                                                                                                                                      
                                                                                                                                                                                                                                       
                                                                                                                                                                                                                                                                                               
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          


                                                                                                                                                                                                            



                                                                                                                                                                                                                                                      
                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                               
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           


                                                                                                                                                                                                            

                                                                                                                                                                                                                                                      
                                                                                                                                                                                                                  
                                                                                                                                                                                                                                                                                                
                                                                                                                                                                                                                                                                                                                                                                                                                                                                               
                                                                                                                                                                                                                                                                                                
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 


                                                                                                                                                                                                            
                                                                                                                                                                                                                                                      
                                                                                                                                                                                                   
                                                                                                                                                                                                                                                                                               
                                                                                                                                                                                                                                                                                                                                                                                  


                                                                                                                                                                                                               


                                                                                                                                                                                                                                                      
                                                                                                                                                                                                                          
                                                                                                                                                                                                                                                                                                
                                                                                                                                                                                                                                                                                                                                                                                                                                                                               
                                                                                                                                                                                                                                                                                                
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 
                                                                                                                                                                                                                                                                                                
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                


                                                                                                                                                                                                                  

                                                                                                                                                                                                                                                      
                                                                                                                                                                                                                  
                                                                                                                                                                                                                                                                                               
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  


                                                                                                                                                                                                                        





                                                                                                                                                                                                                                                            
                                                                                                                                                                                                                        
                                                                                                                                                                                                                                                                                               
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   














                                                                                                                                                                                                                                                                                                           
                                                                                                                             











                                                                                                                                                                                                                                                                                                  


















                                                                                                                                                                                                                                                                                                                                                                                     
                                                                                                                                                                                                                                                                                                    







                                                                                                                                                                                                                                                      
                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                 
                                                                                                                                                                                                                                                                                                     







                                                                                                                                                                                                                                                      
                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                           
                                                                                                                                                                                                                                                                                                                                                                                           







                                                                                                                                                                                                                                                      
                                                                                                                                                                                                                                                                                                     


                                                                                                                                                                                





                                                                                                                                                                                                                                                                                                                                                                                                        
                                                                                                                                                                                                                                                                                                    










                                                                                                                                                                                                                                                      

                                                                                                                                                                                                                                                                                                                                                                                                                  


                                                                                                                                                                                                                                                                                                                                                                                                                          













                                                                                                                                                                                                                                                      

                                                                                                                                                                                                                                                                                                                                                                                                                  





                                                                                                                                                                                                                                                                                                                                                                                                                              







                                                                                                                             
                                                                                                                                                                                                                                                                                                              



















































                                                                                                                                                                                                                                                                                                                                                                 
                                           


































                                                                                                                                                                                                                                                                                                

       
                                     
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - 055shape_shifting_container.cc</title>
<meta name="Generator" content="Vim/7.4">
<meta name="plugin-version" content="vim7.4_v2">
<meta name="syntax" content="cpp">
<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
<meta name="colorscheme" content="minimal">
<style type="text/css">
<!--
pre { white-space: pre-wrap; font-family: monospace; color: #aaaaaa; background-color: #080808; }
body { font-size: 12pt; font-family: monospace; color: #aaaaaa; background-color: #080808; }
a { color:#eeeeee; text-decoration: none; }
a:hover { text-decoration: underline; }
* { font-size: 12pt; font-size: 1em; }
.SalientComment { color: #00ffff; }
.CommentedCode { color: #6c6c6c; }
.muRecipe { color: #ff8700; }
.muData { color: #ffff00; }
.LineNr { color: #444444; }
.cSpecial { color: #008000; }
.Delimiter { color: #800080; }
.Normal { color: #aaaaaa; background-color: #080808; padding-bottom: 1px; }
.traceContains { color: #008000; }
.Conceal { color: #4e4e4e; }
.Comment { color: #9090ff; }
.Comment a { color:#0000ee; text-decoration:underline; }
.Constant { color: #00a0a0; }
.Special { color: #c00000; }
.Identifier { color: #c0a020; }
-->
</style>

<script type='text/javascript'>
<!--

/* function to open any folds containing a jumped-to line before jumping to it */
function JumpToLine()
{
  var lineNum;
  lineNum = window.location.hash;
  lineNum = lineNum.substr(1); /* strip off '#' */

  if (lineNum.indexOf('L') == -1) {
    lineNum = 'L'+lineNum;
  }
  lineElem = document.getElementById(lineNum);
  /* Always jump to new location even if the line was hidden inside a fold, or
   * we corrected the raw number to a line ID.
   */
  if (lineElem) {
    lineElem.scrollIntoView(true);
  }
  return true;
}
if ('onhashchange' in window) {
  window.onhashchange = JumpToLine;
}

-->
</script>
</head>
<body onload='JumpToLine();'>
<pre id='vimCodeElement'>
<span id="L1" class="LineNr">  1 </span><span class="SalientComment">//:: Container definitions can contain 'type ingredients'</span>
<span id="L2" class="LineNr">  2 </span>
<span id="L3" class="LineNr">  3 </span><span class="Comment">//: pre-requisite: extend our notion of containers to not necessarily be</span>
<span id="L4" class="LineNr">  4 </span><span class="Comment">//: atomic types</span>
<span id="L5" class="LineNr">  5 </span><span class="Delimiter">:(before &quot;End is_mu_container(type) Special-cases&quot;)</span>
<span id="L6" class="LineNr">  6 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span>
<span id="L7" class="LineNr">  7 </span>  <span class="Identifier">return</span> is_mu_container<span class="Delimiter">(</span>get_base_type<span class="Delimiter">(</span>type<span class="Delimiter">));</span>
<span id="L8" class="LineNr">  8 </span><span class="Delimiter">:(before &quot;End is_mu_exclusive_container(type) Special-cases&quot;)</span>
<span id="L9" class="LineNr">  9 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span>
<span id="L10" class="LineNr"> 10 </span>  <span class="Identifier">return</span> is_mu_exclusive_container<span class="Delimiter">(</span>get_base_type<span class="Delimiter">(</span>type<span class="Delimiter">));</span>
<span id="L11" class="LineNr"> 11 </span><span class="Delimiter">:(after &quot;Update GET base_type in Check&quot;)</span>
<span id="L12" class="LineNr"> 12 </span>base_type = get_base_type<span class="Delimiter">(</span>base_type<span class="Delimiter">);</span>
<span id="L13" class="LineNr"> 13 </span><span class="Delimiter">:(after &quot;Update GET base_type in Run&quot;)</span>
<span id="L14" class="LineNr"> 14 </span>base_type = get_base_type<span class="Delimiter">(</span>base_type<span class="Delimiter">);</span>
<span id="L15" class="LineNr"> 15 </span><span class="Delimiter">:(after &quot;Update PUT base_type in Check&quot;)</span>
<span id="L16" class="LineNr"> 16 </span>base_type = get_base_type<span class="Delimiter">(</span>base_type<span class="Delimiter">);</span>
<span id="L17" class="LineNr"> 17 </span><span class="Delimiter">:(after &quot;Update PUT base_type in Run&quot;)</span>
<span id="L18" class="LineNr"> 18 </span>base_type = get_base_type<span class="Delimiter">(</span>base_type<span class="Delimiter">);</span>
<span id="L19" class="LineNr"> 19 </span><span class="Delimiter">:(after &quot;Update MAYBE_CONVERT base_type in Check&quot;)</span>
<span id="L20" class="LineNr"> 20 </span>base_type = get_base_type<span class="Delimiter">(</span>base_type<span class="Delimiter">);</span>
<span id="L21" class="LineNr"> 21 </span><span class="Delimiter">:(after &quot;Update base_type in size_of(type)&quot;)</span>
<span id="L22" class="LineNr"> 22 </span>base_type = get_base_type<span class="Delimiter">(</span>base_type<span class="Delimiter">);</span>
<span id="L23" class="LineNr"> 23 </span><span class="Delimiter">:(after &quot;Update base_type in element_type&quot;)</span>
<span id="L24" class="LineNr"> 24 </span>base_type = get_base_type<span class="Delimiter">(</span>base_type<span class="Delimiter">);</span>
<span id="L25" class="LineNr"> 25 </span><span class="Delimiter">:(after &quot;Update base_type in compute_container_address_offsets&quot;)</span>
<span id="L26" class="LineNr"> 26 </span>base_type = get_base_type<span class="Delimiter">(</span>base_type<span class="Delimiter">);</span>
<span id="L27" class="LineNr"> 27 </span><span class="Delimiter">:(after &quot;Update base_type in append_container_address_offsets&quot;)</span>
<span id="L28" class="LineNr"> 28 </span>base_type = get_base_type<span class="Delimiter">(</span>base_type<span class="Delimiter">);</span>
<span id="L29" class="LineNr"> 29 </span><span class="Delimiter">:(after &quot;Update element_base_type For Exclusive Container in append_addresses&quot;)</span>
<span id="L30" class="LineNr"> 30 </span>element_base_type = get_base_type<span class="Delimiter">(</span>element_base_type<span class="Delimiter">);</span>
<span id="L31" class="LineNr"> 31 </span><span class="Delimiter">:(after &quot;Update base_type in skip_addresses&quot;)</span>
<span id="L32" class="LineNr"> 32 </span>base_type = get_base_type<span class="Delimiter">(</span>base_type<span class="Delimiter">);</span>
<span id="L33" class="LineNr"> 33 </span><span class="Delimiter">:(replace{} &quot;const type_tree* get_base_type(const type_tree* t)&quot;)</span>
<span id="L34" class="LineNr"> 34 </span><span class="Normal">const</span> type_tree* get_base_type<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* t<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L35" class="LineNr"> 35 </span>  <span class="Normal">const</span> type_tree* result = t<span class="Delimiter">-&gt;</span>atom ? t : t<span class="Delimiter">-&gt;</span>left<span class="Delimiter">;</span>
<span id="L36" class="LineNr"> 36 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!result<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span>
<span id="L37" class="LineNr"> 37 </span>  <span class="Conceal">¦</span> <a href='003trace.cc.html#L168'>raise</a> &lt;&lt; <span class="Constant">&quot;invalid type &quot;</span> &lt;&lt; <a href='028call_return.cc.html#L162'>to_string</a><span class="Delimiter">(</span>t<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; <a href='003trace.cc.html#L197'>end</a><span class="Delimiter">();</span>
<span id="L38" class="LineNr"> 38 </span>  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
<span id="L39" class="LineNr"> 39 </span><span class="Delimiter">}</span>
<span id="L40" class="LineNr"> 40 </span>
<span id="L41" class="LineNr"> 41 </span><span class="Delimiter">:(scenario ill_formed_container)</span>
<span id="L42" class="LineNr"> 42 </span><span class="Special">% Hide_errors = true;</span>
<span id="L43" class="LineNr"> 43 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L44" class="LineNr"> 44 </span>  <span class="Delimiter">{</span><span class="Constant">1</span>: <span class="Delimiter">((</span>foo<span class="Delimiter">)</span> num<span class="Delimiter">)}</span><span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
<span id="L45" class="LineNr"> 45 </span>]
<span id="L46" class="LineNr"> 46 </span><span class="Comment"># no crash</span>
<span id="L47" class="LineNr"> 47 </span>
<span id="L48" class="LineNr"> 48 </span><span class="Delimiter">:(scenario size_of_shape_shifting_container)</span>
<span id="L49" class="LineNr"> 49 </span><span class="muData">container</span> foo:_t [
<span id="L50" class="LineNr"> 50 </span>  <span class="Normal">x</span>:_t
<span id="L51" class="LineNr"> 51 </span>  <span class="Normal">y</span>:num
<span id="L52" class="LineNr"> 52 </span>]
<span id="L53" class="LineNr"> 53 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L54" class="LineNr"> 54 </span>  <span class="Constant">1</span>:foo:num<span class="Special"> &lt;- </span>merge <span class="Constant">12</span><span class="Delimiter">,</span> <span class="Constant">13</span>
<span id="L55" class="LineNr"> 55 </span>  <span class="Constant">3</span>:foo:point<span class="Special"> &lt;- </span>merge <span class="Constant">14</span><span class="Delimiter">,</span> <span class="Constant">15</span><span class="Delimiter">,</span> <span class="Constant">16</span>
<span id="L56" class="LineNr"> 56 </span>]
<span id="L57" class="LineNr"> 57 </span><span class="traceContains">+mem: storing 12 in location 1</span>
<span id="L58" class="LineNr"> 58 </span><span class="traceContains">+mem: storing 13 in location 2</span>
<span id="L59" class="LineNr"> 59 </span><span class="traceContains">+mem: storing 14 in location 3</span>
<span id="L60" class="LineNr"> 60 </span><span class="traceContains">+mem: storing 15 in location 4</span>
<span id="L61" class="LineNr"> 61 </span><span class="traceContains">+mem: storing 16 in location 5</span>
<span id="L62" class="LineNr"> 62 </span>
<span id="L63" class="LineNr"> 63 </span><span class="Delimiter">:(scenario size_of_shape_shifting_container_2)</span>
<span id="L64" class="LineNr"> 64 </span><span class="Comment"># multiple type ingredients</span>
<span id="L65" class="LineNr"> 65 </span><span class="muData">container</span> foo:_a:_b [
<span id="L66" class="LineNr"> 66 </span>  <span class="Normal">x</span>:_a
<span id="L67" class="LineNr"> 67 </span>  <span class="Normal">y</span>:_b
<span id="L68" class="LineNr"> 68 </span>]
<span id="L69" class="LineNr"> 69 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L70" class="LineNr"> 70 </span>  <span class="Constant">1</span>:foo:num:<span class="Normal">bool</span><span class="Special"> &lt;- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">1</span>/<span class="Constant">true</span>
<span id="L71" class="LineNr"> 71 </span>]
<span id="L72" class="LineNr"> 72 </span>$error: <span class="Constant">0</span>
<span id="L73" class="LineNr"> 73 </span>
<span id="L74" class="LineNr"> 74 </span><span class="Delimiter">:(scenario size_of_shape_shifting_container_3)</span>
<span id="L75" class="LineNr"> 75 </span><span class="muData">container</span> foo:_a:_b [
<span id="L76" class="LineNr"> 76 </span>  <span class="Normal">x</span>:_a
<span id="L77" class="LineNr"> 77 </span>  <span class="Normal">y</span>:_b
<span id="L78" class="LineNr"> 78 </span>]
<span id="L79" class="LineNr"> 79 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L80" class="LineNr"> 80 </span>  <span class="Constant">1</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [abc]
<span id="L81" class="LineNr"> 81 </span>  <span class="Comment"># compound types for type ingredients</span>
<span id="L82" class="LineNr"> 82 </span>  <span class="Delimiter">{</span><span class="Constant">2</span>: <span class="Delimiter">(</span>foo number <span class="Delimiter">(</span><a href='043space.cc.html#L82'>address</a> array character<span class="Delimiter">))}</span><span class="Special"> &lt;- </span>merge <span class="Constant">34</span>/x<span class="Delimiter">,</span> <span class="Constant">1</span>:text/y
<span id="L83" class="LineNr"> 83 </span>]
<span id="L84" class="LineNr"> 84 </span>$error: <span class="Constant">0</span>
<span id="L85" class="LineNr"> 85 </span>
<span id="L86" class="LineNr"> 86 </span><span class="Delimiter">:(scenario size_of_shape_shifting_container_4)</span>
<span id="L87" class="LineNr"> 87 </span><span class="muData">container</span> foo:_a:_b [
<span id="L88" class="LineNr"> 88 </span>  <span class="Normal">x</span>:_a
<span id="L89" class="LineNr"> 89 </span>  <span class="Normal">y</span>:_b
<span id="L90" class="LineNr"> 90 </span>]
<span id="L91" class="LineNr"> 91 </span><span class="muData">container</span> bar:_a:_b [
<span id="L92" class="LineNr"> 92 </span>  <span class="Comment"># dilated element</span>
<span id="L93" class="LineNr"> 93 </span>  <span class="Delimiter">{</span>data: <span class="Delimiter">(</span>foo _a <span class="Delimiter">(</span><a href='043space.cc.html#L82'>address</a> _b<span class="Delimiter">))}</span>
<span id="L94" class="LineNr"> 94 </span>]
<span id="L95" class="LineNr"> 95 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L96" class="LineNr"> 96 </span>  <span class="Constant">1</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [abc]
<span id="L97" class="LineNr"> 97 </span>  <span class="Constant">2</span>:bar:num:@:<span class="Normal">char</span><span class="Special"> &lt;- </span>merge <span class="Constant">34</span>/x<span class="Delimiter">,</span> <span class="Constant">1</span>:text/y
<span id="L98" class="LineNr"> 98 </span>]
<span id="L99" class="LineNr"> 99 </span>$error: <span class="Constant">0</span>
<span id="L100" class="LineNr">100 </span>
<span id="L101" class="LineNr">101 </span><span class="Delimiter">:(scenario shape_shifting_container_extend)</span>
<span id="L102" class="LineNr">102 </span><span class="muData">container</span> foo:_a [
<span id="L103" class="LineNr">103 </span>  <span class="Normal">x</span>:_a
<span id="L104" class="LineNr">104 </span>]
<span id="L105" class="LineNr">105 </span><span class="muData">container</span> foo:_a [
<span id="L106" class="LineNr">106 </span>  <span class="Normal">y</span>:_a
<span id="L107" class="LineNr">107 </span>]
<span id="L108" class="LineNr">108 </span>$error: <span class="Constant">0</span>
<span id="L109" class="LineNr">109 </span>
<span id="L110" class="LineNr">110 </span><span class="Delimiter">:(scenario shape_shifting_container_extend_error)</span>
<span id="L111" class="LineNr">111 </span><span class="Special">% Hide_errors = true;</span>
<span id="L112" class="LineNr">112 </span><span class="muData">container</span> foo:_a [
<span id="L113" class="LineNr">113 </span>  <span class="Normal">x</span>:_a
<span id="L114" class="LineNr">114 </span>]
<span id="L115" class="LineNr">115 </span><span class="muData">container</span> foo:_b [
<span id="L116" class="LineNr">116 </span>  <span class="Normal">y</span>:_b
<span id="L117" class="LineNr">117 </span>]
<span id="L118" class="LineNr">118 </span><span class="traceContains">+error: headers of container 'foo' must use identical type ingredients</span>
<span id="L119" class="LineNr">119 </span>
<span id="L120" class="LineNr">120 </span><span class="Delimiter">:(scenario type_ingredient_must_start_with_underscore)</span>
<span id="L121" class="LineNr">121 </span><span class="Special">% Hide_errors = true;</span>
<span id="L122" class="LineNr">122 </span><span class="muData">container</span> foo:t [
<span id="L123" class="LineNr">123 </span>  <span class="Normal">x</span>:num
<span id="L124" class="LineNr">124 </span>]
<span id="L125" class="LineNr">125 </span><span class="traceContains">+error: foo: type ingredient 't' must begin with an underscore</span>
<span id="L126" class="LineNr">126 </span>
<span id="L127" class="LineNr">127 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
<span id="L128" class="LineNr">128 </span><span class="Comment">// We'll use large type ordinals to mean &quot;the following type of the variable&quot;.</span>
<span id="L129" class="LineNr">129 </span><span class="Comment">// For example, if we have a generic type called foo:_elem, the type</span>
<span id="L130" class="LineNr">130 </span><span class="Comment">// ingredient _elem in foo's type_info will have value START_TYPE_INGREDIENTS,</span>
<span id="L131" class="LineNr">131 </span><span class="Comment">// and we'll handle it by looking in the current reagent for the next type</span>
<span id="L132" class="LineNr">132 </span><span class="Comment">// that appears after foo.</span>
<span id="L133" class="LineNr">133 </span><span class="Normal">extern</span> <span class="Normal">const</span> <span class="Normal">int</span> START_TYPE_INGREDIENTS = <span class="Constant">2000</span><span class="Delimiter">;</span>
<span id="L134" class="LineNr">134 </span><span class="Delimiter">:(before &quot;End Commandline Parsing&quot;)</span>  <span class="Comment">// after loading .mu files</span>
<span id="L135" class="LineNr">135 </span>assert<span class="Delimiter">(</span>Next_type_ordinal &lt; START_TYPE_INGREDIENTS<span class="Delimiter">);</span>
<span id="L136" class="LineNr">136 </span>
<span id="L137" class="LineNr">137 </span><span class="Delimiter">:(before &quot;End type_info Fields&quot;)</span>
<span id="L138" class="LineNr">138 </span>map&lt;string<span class="Delimiter">,</span> type_ordinal&gt; type_ingredient_names<span class="Delimiter">;</span>
<span id="L139" class="LineNr">139 </span>
<span id="L140" class="LineNr">140 </span><span class="Comment">//: Suppress unknown type checks in shape-shifting containers.</span>
<span id="L141" class="LineNr">141 </span>
<span id="L142" class="LineNr">142 </span><span class="Delimiter">:(before &quot;Check Container Field Types(info)&quot;)</span>
<span id="L143" class="LineNr">143 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!info<span class="Delimiter">.</span>type_ingredient_names<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
<span id="L144" class="LineNr">144 </span>
<span id="L145" class="LineNr">145 </span><span class="Delimiter">:(before &quot;End container Name Refinements&quot;)</span>
<span id="L146" class="LineNr">146 </span><span class="Normal">if</span> <span class="Delimiter">(</span>name<span class="Delimiter">.</span>find<span class="Delimiter">(</span><span class="Constant">':'</span><span class="Delimiter">)</span> != string::npos<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L147" class="LineNr">147 </span>  <a href='003trace.cc.html#L161'>trace</a><span class="Delimiter">(</span><span class="Constant">&quot;parse&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;container has type ingredients; parsing&quot;</span> &lt;&lt; <a href='003trace.cc.html#L197'>end</a><span class="Delimiter">();</span>
<span id="L148" class="LineNr">148 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!read_type_ingredients<span class="Delimiter">(</span>name<span class="Delimiter">,</span> command<span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L149" class="LineNr">149 </span>  <span class="Conceal">¦</span> <span class="Comment">// error; skip rest of the container definition and continue</span>
<span id="L150" class="LineNr">150 </span>  <span class="Conceal">¦</span> <a href='016dilated_reagent.cc.html#L57'>slurp_balanced_bracket</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span>
<span id="L151" class="LineNr">151 </span>  <span class="Conceal">¦</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L152" class="LineNr">152 </span>  <span class="Delimiter">}</span>
<span id="L153" class="LineNr">153 </span><span class="Delimiter">}</span>
<span id="L154" class="LineNr">154 </span>
<span id="L155" class="LineNr">155 </span><span class="Delimiter">:(code)</span>
<span id="L156" class="LineNr">156 </span><span class="Normal">bool</span> read_type_ingredients<span class="Delimiter">(</span>string&amp; name<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; command<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L157" class="LineNr">157 </span>  string save_name = name<span class="Delimiter">;</span>
<span id="L158" class="LineNr">158 </span>  istringstream in<span class="Delimiter">(</span>save_name<span class="Delimiter">);</span>
<span id="L159" class="LineNr">159 </span>  name = slurp_until<span class="Delimiter">(</span>in<span class="Delimiter">,</span> <span class="Constant">':'</span><span class="Delimiter">);</span>
<span id="L160" class="LineNr">160 </span>  map&lt;string<span class="Delimiter">,</span> type_ordinal&gt; type_ingredient_names<span class="Delimiter">;</span>
<span id="L161" class="LineNr">161 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!slurp_type_ingredients<span class="Delimiter">(</span>in<span class="Delimiter">,</span> type_ingredient_names<span class="Delimiter">,</span> name<span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L162" class="LineNr">162 </span>  <span class="Conceal">¦</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L163" class="LineNr">163 </span>  <span class="Delimiter">}</span>
<span id="L164" class="LineNr">164 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> name<span class="Delimiter">)</span>
<span id="L165" class="LineNr">165 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> &amp;&amp; contains_key<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> name<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
<span id="L166" class="LineNr">166 </span>  <span class="Conceal">¦</span> <span class="Normal">const</span> type_info&amp; previous_info = get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> name<span class="Delimiter">));</span>
<span id="L167" class="LineNr">167 </span>  <span class="Conceal">¦</span> <span class="Comment">// we've already seen this container; make sure type ingredients match</span>
<span id="L168" class="LineNr">168 </span>  <span class="Conceal">¦</span> <span class="Normal">if</span> <span class="Delimiter">(</span>!type_ingredients_match<span class="Delimiter">(</span>type_ingredient_names<span class="Delimiter">,</span> previous_info<span class="Delimiter">.</span>type_ingredient_names<span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L169" class="LineNr">169 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <a href='003trace.cc.html#L168'>raise</a> &lt;&lt; <span class="Constant">&quot;headers of &quot;</span> &lt;&lt; command &lt;&lt; <span class="Constant">&quot; '&quot;</span> &lt;&lt; name &lt;&lt; <span class="Constant">&quot;' must use identical type ingredients</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; <a href='003trace.cc.html#L197'>end</a><span class="Delimiter">();</span>
<span id="L170" class="LineNr">170 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L171" class="LineNr">171 </span>  <span class="Conceal">¦</span> <span class="Delimiter">}</span>
<span id="L172" class="LineNr">172 </span>  <span class="Conceal">¦</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L173" class="LineNr">173 </span>  <span class="Delimiter">}</span>
<span id="L174" class="LineNr">174 </span>  <span class="Comment">// we haven't seen this container before</span>
<span id="L175" class="LineNr">175 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> name<span class="Delimiter">)</span> || get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> name<span class="Delimiter">)</span> == <span class="Constant">0</span><span class="Delimiter">)</span>
<span id="L176" class="LineNr">176 </span>  <span class="Conceal">¦</span> <a href='001help.cc.html#L221'>put</a><span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> name<span class="Delimiter">,</span> Next_type_ordinal++<span class="Delimiter">);</span>
<span id="L177" class="LineNr">177 </span>  type_info&amp; info = <a href='001help.cc.html#L228'>get_or_insert</a><span class="Delimiter">(</span>Type<span class="Delimiter">,</span> get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> name<span class="Delimiter">));</span>
<span id="L178" class="LineNr">178 </span>  info<span class="Delimiter">.</span>type_ingredient_names<span class="Delimiter">.</span>swap<span class="Delimiter">(</span>type_ingredient_names<span class="Delimiter">);</span>
<span id="L179" class="LineNr">179 </span>  <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L180" class="LineNr">180 </span><span class="Delimiter">}</span>
<span id="L181" class="LineNr">181 </span>
<span id="L182" class="LineNr">182 </span><span class="Normal">bool</span> slurp_type_ingredients<span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">,</span> map&lt;string<span class="Delimiter">,</span> type_ordinal&gt;&amp; out<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; container_name<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L183" class="LineNr">183 </span>  <span class="Normal">int</span> next_type_ordinal = START_TYPE_INGREDIENTS<span class="Delimiter">;</span>
<span id="L184" class="LineNr">184 </span>  <span class="Normal">while</span> <span class="Delimiter">(</span><a href='001help.cc.html#L238'>has_data</a><span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L185" class="LineNr">185 </span>  <span class="Conceal">¦</span> string curr = slurp_until<span class="Delimiter">(</span>in<span class="Delimiter">,</span> <span class="Constant">':'</span><span class="Delimiter">);</span>
<span id="L186" class="LineNr">186 </span>  <span class="Conceal">¦</span> <span class="Normal">if</span> <span class="Delimiter">(</span>curr<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
<span id="L187" class="LineNr">187 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <a href='003trace.cc.html#L168'>raise</a> &lt;&lt; container_name &lt;&lt; <span class="Constant">&quot;: empty type ingredients not permitted</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; <a href='003trace.cc.html#L197'>end</a><span class="Delimiter">();</span>
<span id="L188" class="LineNr">188 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L189" class="LineNr">189 </span>  <span class="Conceal">¦</span> <span class="Delimiter">}</span>
<span id="L190" class="LineNr">190 </span>  <span class="Conceal">¦</span> <span class="Normal">if</span> <span class="Delimiter">(</span>!starts_with<span class="Delimiter">(</span>curr<span class="Delimiter">,</span> <span class="Constant">&quot;_&quot;</span><span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L191" class="LineNr">191 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <a href='003trace.cc.html#L168'>raise</a> &lt;&lt; container_name &lt;&lt; <span class="Constant">&quot;: type ingredient '&quot;</span> &lt;&lt; curr &lt;&lt; <span class="Constant">&quot;' must begin with an underscore</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; <a href='003trace.cc.html#L197'>end</a><span class="Delimiter">();</span>
<span id="L192" class="LineNr">192 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L193" class="LineNr">193 </span>  <span class="Conceal">¦</span> <span class="Delimiter">}</span>
<span id="L194" class="LineNr">194 </span>  <span class="Conceal">¦</span> <span class="Normal">if</span> <span class="Delimiter">(</span>out<span class="Delimiter">.</span>find<span class="Delimiter">(</span>curr<span class="Delimiter">)</span> != out<span class="Delimiter">.</span><a href='003trace.cc.html#L197'>end</a><span class="Delimiter">())</span> <span class="Delimiter">{</span>
<span id="L195" class="LineNr">195 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <a href='003trace.cc.html#L168'>raise</a> &lt;&lt; container_name &lt;&lt; <span class="Constant">&quot;: can't repeat type ingredient name'&quot;</span> &lt;&lt; curr &lt;&lt; <span class="Constant">&quot;' in a single container definition</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L196" class="LineNr">196 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L197" class="LineNr">197 </span>  <span class="Conceal">¦</span> <span class="Delimiter">}</span>
<span id="L198" class="LineNr">198 </span>  <span class="Conceal">¦</span> <a href='001help.cc.html#L221'>put</a><span class="Delimiter">(</span>out<span class="Delimiter">,</span> curr<span class="Delimiter">,</span> next_type_ordinal++<span class="Delimiter">);</span>
<span id="L199" class="LineNr">199 </span>  <span class="Delimiter">}</span>
<span id="L200" class="LineNr">200 </span>  <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L201" class="LineNr">201 </span><span class="Delimiter">}</span>
<span id="L202" class="LineNr">202 </span>
<span id="L203" class="LineNr">203 </span><span class="Normal">bool</span> type_ingredients_match<span class="Delimiter">(</span><span class="Normal">const</span> map&lt;string<span class="Delimiter">,</span> type_ordinal&gt;&amp; a<span class="Delimiter">,</span> <span class="Normal">const</span> map&lt;string<span class="Delimiter">,</span> type_ordinal&gt;&amp; b<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L204" class="LineNr">204 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>a<span class="Delimiter">)</span> != <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>b<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L205" class="LineNr">205 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;string<span class="Delimiter">,</span> type_ordinal&gt;::const_iterator p = a<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != a<span class="Delimiter">.</span><a href='003trace.cc.html#L197'>end</a><span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L206" class="LineNr">206 </span>  <span class="Conceal">¦</span> <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>b<span class="Delimiter">,</span> p<span class="Delimiter">-&gt;</span>first<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L207" class="LineNr">207 </span>  <span class="Conceal">¦</span> <span class="Normal">if</span> <span class="Delimiter">(</span>p<span class="Delimiter">-&gt;</span>second != get<span class="Delimiter">(</span>b<span class="Delimiter">,</span> p<span class="Delimiter">-&gt;</span>first<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L208" class="LineNr">208 </span>  <span class="Delimiter">}</span>
<span id="L209" class="LineNr">209 </span>  <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L210" class="LineNr">210 </span><span class="Delimiter">}</span>
<span id="L211" class="LineNr">211 </span>
<span id="L212" class="LineNr">212 </span><span class="Delimiter">:(before &quot;End <a href='030container.cc.html#L661'>insert_container</a> Special-cases&quot;)</span>
<span id="L213" class="LineNr">213 </span><span class="Comment">// check for use of type ingredients</span>
<span id="L214" class="LineNr">214 </span><span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>is_type_ingredient_name<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L215" class="LineNr">215 </span>  type<span class="Delimiter">-&gt;</span>value = get<span class="Delimiter">(</span>info<span class="Delimiter">.</span>type_ingredient_names<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">);</span>
<span id="L216" class="LineNr">216 </span><span class="Delimiter">}</span>
<span id="L217" class="LineNr">217 </span><span class="Delimiter">:(code)</span>
<span id="L218" class="LineNr">218 </span><span class="Normal">bool</span> is_type_ingredient_name<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L219" class="LineNr">219 </span>  <span class="Identifier">return</span> <a href='001help.cc.html#L77'>starts_with</a><span class="Delimiter">(</span>type<span class="Delimiter">,</span> <span class="Constant">&quot;_&quot;</span><span class="Delimiter">);</span>
<span id="L220" class="LineNr">220 </span><span class="Delimiter">}</span>
<span id="L221" class="LineNr">221 </span>
<span id="L222" class="LineNr">222 </span><span class="Delimiter">:(before &quot;End Container Type Checks&quot;)</span>
<span id="L223" class="LineNr">223 </span><span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>value &gt;= START_TYPE_INGREDIENTS
<span id="L224" class="LineNr">224 </span>  <span class="Conceal">¦</span> &amp;&amp; <span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>value - START_TYPE_INGREDIENTS<span class="Delimiter">)</span> &lt; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">).</span>type_ingredient_names<span class="Delimiter">))</span>
<span id="L225" class="LineNr">225 </span>  <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L226" class="LineNr">226 </span>
<span id="L227" class="LineNr">227 </span><span class="Delimiter">:(scenario size_of_shape_shifting_exclusive_container)</span>
<span id="L228" class="LineNr">228 </span><span class="muData">exclusive-container</span> foo:_t [
<span id="L229" class="LineNr">229 </span>  <span class="Normal">x</span>:_t
<span id="L230" class="LineNr">230 </span>  <span class="Normal">y</span>:num
<span id="L231" class="LineNr">231 </span>]
<span id="L232" class="LineNr">232 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L233" class="LineNr">233 </span>  <span class="Constant">1</span>:foo:num<span class="Special"> &lt;- </span>merge <span class="Constant">0</span>/x<span class="Delimiter">,</span> <span class="Constant">34</span>
<span id="L234" class="LineNr">234 </span>  <span class="Constant">3</span>:foo:point<span class="Special"> &lt;- </span>merge <span class="Constant">0</span>/x<span class="Delimiter">,</span> <span class="Constant">15</span><span class="Delimiter">,</span> <span class="Constant">16</span>
<span id="L235" class="LineNr">235 </span>  <span class="Constant">6</span>:foo:point<span class="Special"> &lt;- </span>merge <span class="Constant">1</span>/y<span class="Delimiter">,</span> <span class="Constant">23</span>
<span id="L236" class="LineNr">236 </span>]
<span id="L237" class="LineNr">237 </span><span class="traceContains">+run: {1: (&quot;foo&quot; &quot;number&quot;)} &lt;- merge {0: &quot;literal&quot;, &quot;x&quot;: ()}, {34: &quot;literal&quot;}</span>
<span id="L238" class="LineNr">238 </span><span class="traceContains">+mem: storing 0 in location 1</span>
<span id="L239" class="LineNr">239 </span><span class="traceContains">+mem: storing 34 in location 2</span>
<span id="L240" class="LineNr">240 </span><span class="traceContains">+run: {3: (&quot;foo&quot; &quot;point&quot;)} &lt;- merge {0: &quot;literal&quot;, &quot;x&quot;: ()}, {15: &quot;literal&quot;}, {16: &quot;literal&quot;}</span>
<span id="L241" class="LineNr">241 </span><span class="traceContains">+mem: storing 0 in location 3</span>
<span id="L242" class="LineNr">242 </span><span class="traceContains">+mem: storing 15 in location 4</span>
<span id="L243" class="LineNr">243 </span><span class="traceContains">+mem: storing 16 in location 5</span>
<span id="L244" class="LineNr">244 </span><span class="traceContains">+run: {6: (&quot;foo&quot; &quot;point&quot;)} &lt;- merge {1: &quot;literal&quot;, &quot;y&quot;: ()}, {23: &quot;literal&quot;}</span>
<span id="L245" class="LineNr">245 </span><span class="traceContains">+mem: storing 1 in location 6</span>
<span id="L246" class="LineNr">246 </span><span class="traceContains">+mem: storing 23 in location 7</span>
<span id="L247" class="LineNr">247 </span><span class="traceContains">+run: return</span>
<span id="L248" class="LineNr">248 </span><span class="Comment"># no other stores</span>
<span id="L249" class="LineNr">249 </span><span class="Special">% CHECK_EQ(trace_count_prefix(&quot;mem&quot;, &quot;storing&quot;), 7);</span>
<span id="L250" class="LineNr">250 </span>
<span id="L251" class="LineNr">251 </span><span class="Delimiter">:(before &quot;End variant_type Special-cases&quot;)</span>
<span id="L252" class="LineNr">252 </span><span class="Normal">if</span> <span class="Delimiter">(</span>contains_type_ingredient<span class="Delimiter">(</span>element<span class="Delimiter">))</span>
<span id="L253" class="LineNr">253 </span>  replace_type_ingredients<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">,</span> info<span class="Delimiter">,</span> <span class="Constant">&quot; while computing variant type of exclusive-container&quot;</span><span class="Delimiter">);</span>
<span id="L254" class="LineNr">254 </span>
<span id="L255" class="LineNr">255 </span><span class="Delimiter">:(scenario get_on_shape_shifting_container)</span>
<span id="L256" class="LineNr">256 </span><span class="muData">container</span> foo:_t [
<span id="L257" class="LineNr">257 </span>  <span class="Normal">x</span>:_t
<span id="L258" class="LineNr">258 </span>  <span class="Normal">y</span>:num
<span id="L259" class="LineNr">259 </span>]
<span id="L260" class="LineNr">260 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L261" class="LineNr">261 </span>  <span class="Constant">1</span>:foo:point<span class="Special"> &lt;- </span>merge <span class="Constant">14</span><span class="Delimiter">,</span> <span class="Constant">15</span><span class="Delimiter">,</span> <span class="Constant">16</span>
<span id="L262" class="LineNr">262 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>get <span class="Constant">1</span>:foo:point<span class="Delimiter">,</span> <span class="Constant">y:offset</span>
<span id="L263" class="LineNr">263 </span>]
<span id="L264" class="LineNr">264 </span><span class="traceContains">+mem: storing 16 in location 2</span>
<span id="L265" class="LineNr">265 </span>
<span id="L266" class="LineNr">266 </span><span class="Delimiter">:(scenario get_on_shape_shifting_container_2)</span>
<span id="L267" class="LineNr">267 </span><span class="muData">container</span> foo:_t [
<span id="L268" class="LineNr">268 </span>  <span class="Normal">x</span>:_t
<span id="L269" class="LineNr">269 </span>  <span class="Normal">y</span>:num
<span id="L270" class="LineNr">270 </span>]
<span id="L271" class="LineNr">271 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L272" class="LineNr">272 </span>  <span class="Constant">1</span>:foo:point<span class="Special"> &lt;- </span>merge <span class="Constant">14</span><span class="Delimiter">,</span> <span class="Constant">15</span><span class="Delimiter">,</span> <span class="Constant">16</span>
<span id="L273" class="LineNr">273 </span>  <span class="Constant">2</span>:point<span class="Special"> &lt;- </span>get <span class="Constant">1</span>:foo:point<span class="Delimiter">,</span> <span class="Constant">x:offset</span>
<span id="L274" class="LineNr">274 </span>]
<span id="L275" class="LineNr">275 </span><span class="traceContains">+mem: storing 14 in location 2</span>
<span id="L276" class="LineNr">276 </span><span class="traceContains">+mem: storing 15 in location 3</span>
<span id="L277" class="LineNr">277 </span>
<span id="L278" class="LineNr">278 </span><span class="Delimiter">:(scenario get_on_shape_shifting_container_3)</span>
<span id="L279" class="LineNr">279 </span><span class="muData">container</span> foo:_t [
<span id="L280" class="LineNr">280 </span>  <span class="Normal">x</span>:_t
<span id="L281" class="LineNr">281 </span>  <span class="Normal">y</span>:num
<span id="L282" class="LineNr">282 </span>]
<span id="L283" class="LineNr">283 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L284" class="LineNr">284 </span>  <span class="Constant">1</span>:foo:&amp;:point<span class="Special"> &lt;- </span>merge <span class="Constant">34</span>/unsafe<span class="Delimiter">,</span> <span class="Constant">48</span>
<span id="L285" class="LineNr">285 </span>  <span class="Constant">3</span>:&amp;:point<span class="Special"> &lt;- </span>get <span class="Constant">1</span>:foo:&amp;:point<span class="Delimiter">,</span> <span class="Constant">x:offset</span>
<span id="L286" class="LineNr">286 </span>]
<span id="L287" class="LineNr">287 </span><span class="traceContains">+mem: storing 34 in location 3</span>
<span id="L288" class="LineNr">288 </span>
<span id="L289" class="LineNr">289 </span><span class="Delimiter">:(scenario get_on_shape_shifting_container_inside_container)</span>
<span id="L290" class="LineNr">290 </span><span class="muData">container</span> foo:_t [
<span id="L291" class="LineNr">291 </span>  <span class="Normal">x</span>:_t
<span id="L292" class="LineNr">292 </span>  <span class="Normal">y</span>:num
<span id="L293" class="LineNr">293 </span>]
<span id="L294" class="LineNr">294 </span><span class="muData">container</span> bar [
<span id="L295" class="LineNr">295 </span>  <span class="Normal">x</span>:foo:point
<span id="L296" class="LineNr">296 </span>  <span class="Normal">y</span>:num
<span id="L297" class="LineNr">297 </span>]
<span id="L298" class="LineNr">298 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L299" class="LineNr">299 </span>  <span class="Constant">1</span>:bar<span class="Special"> &lt;- </span>merge <span class="Constant">14</span><span class="Delimiter">,</span> <span class="Constant">15</span><span class="Delimiter">,</span> <span class="Constant">16</span><span class="Delimiter">,</span> <span class="Constant">17</span>
<span id="L300" class="LineNr">300 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>get <span class="Constant">1</span>:bar<span class="Delimiter">,</span> <span class="Constant">1:offset</span>
<span id="L301" class="LineNr">301 </span>]
<span id="L302" class="LineNr">302 </span><span class="traceContains">+mem: storing 17 in location 2</span>
<span id="L303" class="LineNr">303 </span>
<span id="L304" class="LineNr">304 </span><span class="Delimiter">:(scenario get_on_complex_shape_shifting_container)</span>
<span id="L305" class="LineNr">305 </span><span class="muData">container</span> foo:_a:_b [
<span id="L306" class="LineNr">306 </span>  <span class="Normal">x</span>:_a
<span id="L307" class="LineNr">307 </span>  <span class="Normal">y</span>:_b
<span id="L308" class="LineNr">308 </span>]
<span id="L309" class="LineNr">309 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L310" class="LineNr">310 </span>  <span class="Constant">1</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [abc]
<span id="L311" class="LineNr">311 </span>  <span class="Delimiter">{</span><span class="Constant">2</span>: <span class="Delimiter">(</span>foo number <span class="Delimiter">(</span><a href='043space.cc.html#L82'>address</a> array character<span class="Delimiter">))}</span><span class="Special"> &lt;- </span>merge <span class="Constant">34</span>/x<span class="Delimiter">,</span> <span class="Constant">1</span>:text/y
<span id="L312" class="LineNr">312 </span>  <span class="Constant">3</span>:text<span class="Special"> &lt;- </span>get <span class="Delimiter">{</span><span class="Constant">2</span>: <span class="Delimiter">(</span>foo number <span class="Delimiter">(</span><a href='043space.cc.html#L82'>address</a> array character<span class="Delimiter">))},</span> <span class="Constant">y:offset</span>
<span id="L313" class="LineNr">313 </span>  <span class="Constant">4</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal <span class="Constant">1</span>:text<span class="Delimiter">,</span> <span class="Constant">3</span>:text
<span id="L314" class="LineNr">314 </span>]
<span id="L315" class="LineNr">315 </span><span class="traceContains">+mem: storing 1 in location 4</span>
<span id="L316" class="LineNr">316 </span>
<span id="L317" class="LineNr">317 </span><span class="Delimiter">:(before &quot;End <a href='030container.cc.html#L429'>element_type</a> Special-cases&quot;)</span>
<span id="L318" class="LineNr">318 </span>replace_type_ingredients<span class="Delimiter">(</span>element<span class="Delimiter">,</span> type<span class="Delimiter">,</span> info<span class="Delimiter">,</span> <span class="Constant">&quot; while computing element type of container&quot;</span><span class="Delimiter">);</span>
<span id="L319" class="LineNr">319 </span><span class="Delimiter">:(before &quot;Compute Container Size(element, full_type)&quot;)</span>
<span id="L320" class="LineNr">320 </span>replace_type_ingredients<span class="Delimiter">(</span>element<span class="Delimiter">,</span> full_type<span class="Delimiter">,</span> container_info<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span>
<span id="L321" class="LineNr">321 </span><span class="Delimiter">:(before &quot;Compute Exclusive Container Size(element, full_type)&quot;)</span>
<span id="L322" class="LineNr">322 </span>replace_type_ingredients<span class="Delimiter">(</span>element<span class="Delimiter">,</span> full_type<span class="Delimiter">,</span> exclusive_container_info<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span>
<span id="L323" class="LineNr">323 </span><span class="Delimiter">:(before &quot;Compute Container Address Offset(element)&quot;)</span>
<span id="L324" class="LineNr">324 </span>replace_type_ingredients<span class="Delimiter">(</span>element<span class="Delimiter">,</span> type<span class="Delimiter">,</span> info<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span>
<span id="L325" class="LineNr">325 </span><span class="Normal">if</span> <span class="Delimiter">(</span>contains_type_ingredient<span class="Delimiter">(</span>element<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span>  <span class="Comment">// error raised elsewhere</span>
<span id="L326" class="LineNr">326 </span>
<span id="L327" class="LineNr">327 </span><span class="Delimiter">:(after &quot;Compute size_of Container&quot;)</span>
<span id="L328" class="LineNr">328 </span>assert<span class="Delimiter">(</span>!contains_type_ingredient<span class="Delimiter">(</span>type<span class="Delimiter">));</span>
<span id="L329" class="LineNr">329 </span><span class="Delimiter">:(after &quot;Compute size_of Exclusive Container&quot;)</span>
<span id="L330" class="LineNr">330 </span>assert<span class="Delimiter">(</span>!contains_type_ingredient<span class="Delimiter">(</span>type<span class="Delimiter">));</span>
<span id="L331" class="LineNr">331 </span>
<span id="L332" class="LineNr">332 </span><span class="Delimiter">:(code)</span>
<span id="L333" class="LineNr">333 </span><span class="Normal">bool</span> contains_type_ingredient<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L334" class="LineNr">334 </span>  <span class="Identifier">return</span> contains_type_ingredient<span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
<span id="L335" class="LineNr">335 </span><span class="Delimiter">}</span>
<span id="L336" class="LineNr">336 </span>
<span id="L337" class="LineNr">337 </span><span class="Normal">bool</span> contains_type_ingredient<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L338" class="LineNr">338 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L339" class="LineNr">339 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Identifier">return</span> type<span class="Delimiter">-&gt;</span>value &gt;= START_TYPE_INGREDIENTS<span class="Delimiter">;</span>
<span id="L340" class="LineNr">340 </span>  <span class="Identifier">return</span> contains_type_ingredient<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">)</span> || contains_type_ingredient<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">);</span>
<span id="L341" class="LineNr">341 </span><span class="Delimiter">}</span>
<span id="L342" class="LineNr">342 </span>
<span id="L343" class="LineNr">343 </span><span class="Normal">void</span> replace_type_ingredients<span class="Delimiter">(</span>reagent&amp; element<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree* caller_type<span class="Delimiter">,</span> <span class="Normal">const</span> type_info&amp; info<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; location_for_error_messages<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L344" class="LineNr">344 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>contains_type_ingredient<span class="Delimiter">(</span>element<span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L345" class="LineNr">345 </span>  <span class="Conceal">¦</span> <span class="Normal">if</span> <span class="Delimiter">(</span>!caller_type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">)</span>
<span id="L346" class="LineNr">346 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <a href='003trace.cc.html#L168'>raise</a> &lt;&lt; <span class="Constant">&quot;illegal type &quot;</span> &lt;&lt; names_to_string<span class="Delimiter">(</span>caller_type<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; seems to be missing a type ingredient or three&quot;</span> &lt;&lt; location_for_error_messages &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; <a href='003trace.cc.html#L197'>end</a><span class="Delimiter">();</span>
<span id="L347" class="LineNr">347 </span>  <span class="Conceal">¦</span> replace_type_ingredients<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">,</span> caller_type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">,</span> info<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span>
<span id="L348" class="LineNr">348 </span>  <span class="Delimiter">}</span>
<span id="L349" class="LineNr">349 </span><span class="Delimiter">}</span>
<span id="L350" class="LineNr">350 </span>
<span id="L351" class="LineNr">351 </span><span class="Comment">// replace all type_ingredients in element_type with corresponding elements of callsite_type</span>
<span id="L352" class="LineNr">352 </span><span class="Normal">void</span> replace_type_ingredients<span class="Delimiter">(</span>type_tree* <a href='030container.cc.html#L429'>element_type</a><span class="Delimiter">,</span> <span class="Normal">const</span> type_tree* callsite_type<span class="Delimiter">,</span> <span class="Normal">const</span> type_info&amp; container_info<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; location_for_error_messages<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L353" class="LineNr">353 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!callsite_type<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>  <span class="Comment">// error but it's already been raised above</span>
<span id="L354" class="LineNr">354 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!element_type<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L355" class="LineNr">355 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!element_type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L356" class="LineNr">356 </span>  <span class="Conceal">¦</span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='030container.cc.html#L429'>element_type</a><span class="Delimiter">-&gt;</span>right == <span class="Constant">NULL</span> &amp;&amp; is_type_ingredient<span class="Delimiter">(</span><a href='030container.cc.html#L429'>element_type</a><span class="Delimiter">-&gt;</span>left<span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L357" class="LineNr">357 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Normal">int</span> type_ingredient_index = to_type_ingredient_index<span class="Delimiter">(</span><a href='030container.cc.html#L429'>element_type</a><span class="Delimiter">-&gt;</span>left<span class="Delimiter">);</span>
<span id="L358" class="LineNr">358 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Normal">if</span> <span class="Delimiter">(</span>corresponding<span class="Delimiter">(</span>callsite_type<span class="Delimiter">,</span> type_ingredient_index<span class="Delimiter">,</span> is_final_type_ingredient<span class="Delimiter">(</span>type_ingredient_index<span class="Delimiter">,</span> container_info<span class="Delimiter">))-&gt;</span>right<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L359" class="LineNr">359 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Comment">// replacing type ingredient at end of list, and replacement is a non-degenerate compound type -- (a b) but not (a)</span>
<span id="L360" class="LineNr">360 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> replace_type_ingredient_at<span class="Delimiter">(</span>type_ingredient_index<span class="Delimiter">,</span> <a href='030container.cc.html#L429'>element_type</a><span class="Delimiter">,</span> callsite_type<span class="Delimiter">,</span> container_info<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span>
<span id="L361" class="LineNr">361 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L362" class="LineNr">362 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Delimiter">}</span>
<span id="L363" class="LineNr">363 </span>  <span class="Conceal">¦</span> <span class="Delimiter">}</span>
<span id="L364" class="LineNr">364 </span>  <span class="Conceal">¦</span> replace_type_ingredients<span class="Delimiter">(</span><a href='030container.cc.html#L429'>element_type</a><span class="Delimiter">-&gt;</span>left<span class="Delimiter">,</span> callsite_type<span class="Delimiter">,</span> container_info<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span>
<span id="L365" class="LineNr">365 </span>  <span class="Conceal">¦</span> replace_type_ingredients<span class="Delimiter">(</span><a href='030container.cc.html#L429'>element_type</a><span class="Delimiter">-&gt;</span>right<span class="Delimiter">,</span> callsite_type<span class="Delimiter">,</span> container_info<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span>
<span id="L366" class="LineNr">366 </span>  <span class="Conceal">¦</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L367" class="LineNr">367 </span>  <span class="Delimiter">}</span>
<span id="L368" class="LineNr">368 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_type_ingredient<span class="Delimiter">(</span><a href='030container.cc.html#L429'>element_type</a><span class="Delimiter">))</span>
<span id="L369" class="LineNr">369 </span>  <span class="Conceal">¦</span> replace_type_ingredient_at<span class="Delimiter">(</span>to_type_ingredient_index<span class="Delimiter">(</span><a href='030container.cc.html#L429'>element_type</a><span class="Delimiter">),</span> <a href='030container.cc.html#L429'>element_type</a><span class="Delimiter">,</span> callsite_type<span class="Delimiter">,</span> container_info<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span>
<span id="L370" class="LineNr">370 </span><span class="Delimiter">}</span>
<span id="L371" class="LineNr">371 </span>
<span id="L372" class="LineNr">372 </span><span class="Normal">const</span> type_tree* corresponding<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">,</span> <span class="Normal">int</span> index<span class="Delimiter">,</span> <span class="Normal">bool</span> <span class="Normal">final</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L373" class="LineNr">373 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">const</span> type_tree* curr = type<span class="Delimiter">;</span>  curr<span class="Delimiter">;</span>  curr = curr<span class="Delimiter">-&gt;</span>right<span class="Delimiter">,</span> --index<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L374" class="LineNr">374 </span>  <span class="Conceal">¦</span> <a href='003trace.cc.html#L171'>assert_for_now</a><span class="Delimiter">(</span>!curr<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
<span id="L375" class="LineNr">375 </span>  <span class="Conceal">¦</span> <span class="Normal">if</span> <span class="Delimiter">(</span>index == <span class="Constant">0</span><span class="Delimiter">)</span>
<span id="L376" class="LineNr">376 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Identifier">return</span> <span class="Normal">final</span> ? curr : curr<span class="Delimiter">-&gt;</span>left<span class="Delimiter">;</span>
<span id="L377" class="LineNr">377 </span>  <span class="Delimiter">}</span>
<span id="L378" class="LineNr">378 </span>  <a href='003trace.cc.html#L171'>assert_for_now</a><span class="Delimiter">(</span><span class="Constant">false</span><span class="Delimiter">);</span>
<span id="L379" class="LineNr">379 </span><span class="Delimiter">}</span>
<span id="L380" class="LineNr">380 </span>
<span id="L381" class="LineNr">381 </span><span class="Normal">bool</span> is_type_ingredient<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L382" class="LineNr">382 </span>  <span class="Identifier">return</span> type<span class="Delimiter">-&gt;</span>atom &amp;&amp; type<span class="Delimiter">-&gt;</span>value &gt;= START_TYPE_INGREDIENTS<span class="Delimiter">;</span>
<span id="L383" class="LineNr">383 </span><span class="Delimiter">}</span>
<span id="L384" class="LineNr">384 </span>
<span id="L385" class="LineNr">385 </span><span class="Normal">int</span> to_type_ingredient_index<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L386" class="LineNr">386 </span>  assert<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
<span id="L387" class="LineNr">387 </span>  <span class="Identifier">return</span> type<span class="Delimiter">-&gt;</span>value-START_TYPE_INGREDIENTS<span class="Delimiter">;</span>
<span id="L388" class="LineNr">388 </span><span class="Delimiter">}</span>
<span id="L389" class="LineNr">389 </span>
<span id="L390" class="LineNr">390 </span><span class="Normal">void</span> replace_type_ingredient_at<span class="Delimiter">(</span><span class="Normal">const</span> <span class="Normal">int</span> type_ingredient_index<span class="Delimiter">,</span> type_tree* <a href='030container.cc.html#L429'>element_type</a><span class="Delimiter">,</span> <span class="Normal">const</span> type_tree* callsite_type<span class="Delimiter">,</span> <span class="Normal">const</span> type_info&amp; container_info<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; location_for_error_messages<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L391" class="LineNr">391 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!has_nth_type<span class="Delimiter">(</span>callsite_type<span class="Delimiter">,</span> type_ingredient_index<span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L392" class="LineNr">392 </span>  <span class="Conceal">¦</span> <a href='003trace.cc.html#L168'>raise</a> &lt;&lt; <span class="Constant">&quot;illegal type &quot;</span> &lt;&lt; names_to_string<span class="Delimiter">(</span>callsite_type<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; seems to be missing a type ingredient or three&quot;</span> &lt;&lt; location_for_error_messages &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; <a href='003trace.cc.html#L197'>end</a><span class="Delimiter">();</span>
<span id="L393" class="LineNr">393 </span>  <span class="Conceal">¦</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L394" class="LineNr">394 </span>  <span class="Delimiter">}</span>
<span id="L395" class="LineNr">395 </span>  *element_type = *nth_type_ingredient<span class="Delimiter">(</span>callsite_type<span class="Delimiter">,</span> type_ingredient_index<span class="Delimiter">,</span> container_info<span class="Delimiter">);</span>
<span id="L396" class="LineNr">396 </span><span class="Delimiter">}</span>
<span id="L397" class="LineNr">397 </span>
<span id="L398" class="LineNr">398 </span><span class="Normal">const</span> type_tree* nth_type_ingredient<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* callsite_type<span class="Delimiter">,</span> <span class="Normal">int</span> type_ingredient_index<span class="Delimiter">,</span> <span class="Normal">const</span> type_info&amp; container_info<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L399" class="LineNr">399 </span>  <span class="Normal">bool</span> <span class="Normal">final</span> = is_final_type_ingredient<span class="Delimiter">(</span>type_ingredient_index<span class="Delimiter">,</span> container_info<span class="Delimiter">);</span>
<span id="L400" class="LineNr">400 </span>  <span class="Normal">const</span> type_tree* curr = callsite_type<span class="Delimiter">;</span>
<span id="L401" class="LineNr">401 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; type_ingredient_index<span class="Delimiter">;</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L402" class="LineNr">402 </span>  <span class="Conceal">¦</span> assert<span class="Delimiter">(</span>curr<span class="Delimiter">);</span>
<span id="L403" class="LineNr">403 </span>  <span class="Conceal">¦</span> assert<span class="Delimiter">(</span>!curr<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
<span id="L404" class="LineNr">404 </span><span class="CommentedCode">//?     cerr &lt;&lt; &quot;type ingredient &quot; &lt;&lt; i &lt;&lt; &quot; is &quot; &lt;&lt; to_string(curr-&gt;left) &lt;&lt; '\n';</span>
<span id="L405" class="LineNr">405 </span>  <span class="Conceal">¦</span> curr = curr<span class="Delimiter">-&gt;</span>right<span class="Delimiter">;</span>
<span id="L406" class="LineNr">406 </span>  <span class="Delimiter">}</span>
<span id="L407" class="LineNr">407 </span>  assert<span class="Delimiter">(</span>curr<span class="Delimiter">);</span>
<span id="L408" class="LineNr">408 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>curr<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Identifier">return</span> curr<span class="Delimiter">;</span>
<span id="L409" class="LineNr">409 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!<span class="Normal">final</span><span class="Delimiter">)</span> <span class="Identifier">return</span> curr<span class="Delimiter">-&gt;</span>left<span class="Delimiter">;</span>
<span id="L410" class="LineNr">410 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!curr<span class="Delimiter">-&gt;</span>right<span class="Delimiter">)</span> <span class="Identifier">return</span> curr<span class="Delimiter">-&gt;</span>left<span class="Delimiter">;</span>
<span id="L411" class="LineNr">411 </span>  <span class="Identifier">return</span> curr<span class="Delimiter">;</span>
<span id="L412" class="LineNr">412 </span><span class="Delimiter">}</span>
<span id="L413" class="LineNr">413 </span>
<span id="L414" class="LineNr">414 </span><span class="Normal">bool</span> is_final_type_ingredient<span class="Delimiter">(</span><span class="Normal">int</span> type_ingredient_index<span class="Delimiter">,</span> <span class="Normal">const</span> type_info&amp; container_info<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L415" class="LineNr">415 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;string<span class="Delimiter">,</span> type_ordinal&gt;::const_iterator p = container_info<span class="Delimiter">.</span>type_ingredient_names<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>
<span id="L416" class="LineNr">416 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Conceal">¦</span>p != container_info<span class="Delimiter">.</span>type_ingredient_names<span class="Delimiter">.</span><a href='003trace.cc.html#L197'>end</a><span class="Delimiter">();</span>
<span id="L417" class="LineNr">417 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Conceal">¦</span>++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L418" class="LineNr">418 </span>  <span class="Conceal">¦</span> <span class="Normal">if</span> <span class="Delimiter">(</span>p<span class="Delimiter">-&gt;</span>second &gt; START_TYPE_INGREDIENTS+type_ingredient_index<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L419" class="LineNr">419 </span>  <span class="Delimiter">}</span>
<span id="L420" class="LineNr">420 </span>  <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L421" class="LineNr">421 </span><span class="Delimiter">}</span>
<span id="L422" class="LineNr">422 </span>
<span id="L423" class="LineNr">423 </span><span class="Delimiter">:(before &quot;End Unit Tests&quot;)</span>
<span id="L424" class="LineNr">424 </span><span class="Normal">void</span> test_replace_type_ingredients_entire<span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L425" class="LineNr">425 </span>  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo:_elem [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L426" class="LineNr">426 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Constant">&quot;  x:_elem</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L427" class="LineNr">427 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Constant">&quot;  y:num</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L428" class="LineNr">428 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
<span id="L429" class="LineNr">429 </span>  reagent callsite<span class="Delimiter">(</span><span class="Constant">&quot;x:foo:point&quot;</span><span class="Delimiter">);</span>
<span id="L430" class="LineNr">430 </span>  reagent element = <a href='030container.cc.html#L429'>element_type</a><span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
<span id="L431" class="LineNr">431 </span>  <a href='002test.cc.html#L31'>CHECK_EQ</a><span class="Delimiter">(</span><a href='028call_return.cc.html#L162'>to_string</a><span class="Delimiter">(</span>element<span class="Delimiter">),</span> <span class="Constant">&quot;{x: </span><span class="cSpecial">\&quot;</span><span class="Constant">point</span><span class="cSpecial">\&quot;</span><span class="Constant">}&quot;</span><span class="Delimiter">);</span>
<span id="L432" class="LineNr">432 </span><span class="Delimiter">}</span>
<span id="L433" class="LineNr">433 </span>
<span id="L434" class="LineNr">434 </span><span class="Normal">void</span> test_replace_type_ingredients_tail<span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L435" class="LineNr">435 </span>  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo:_elem [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L436" class="LineNr">436 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Constant">&quot;  x:_elem</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L437" class="LineNr">437 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L438" class="LineNr">438 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Constant">&quot;container bar:_elem [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L439" class="LineNr">439 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Constant">&quot;  x:foo:_elem</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L440" class="LineNr">440 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
<span id="L441" class="LineNr">441 </span>  reagent callsite<span class="Delimiter">(</span><span class="Constant">&quot;x:bar:point&quot;</span><span class="Delimiter">);</span>
<span id="L442" class="LineNr">442 </span>  reagent element = <a href='030container.cc.html#L429'>element_type</a><span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
<span id="L443" class="LineNr">443 </span>  <a href='002test.cc.html#L31'>CHECK_EQ</a><span class="Delimiter">(</span><a href='028call_return.cc.html#L162'>to_string</a><span class="Delimiter">(</span>element<span class="Delimiter">),</span> <span class="Constant">&quot;{x: (</span><span class="cSpecial">\&quot;</span><span class="Constant">foo</span><span class="cSpecial">\&quot;</span><span class="Constant"> </span><span class="cSpecial">\&quot;</span><span class="Constant">point</span><span class="cSpecial">\&quot;</span><span class="Constant">)}&quot;</span><span class="Delimiter">);</span>
<span id="L444" class="LineNr">444 </span><span class="Delimiter">}</span>
<span id="L445" class="LineNr">445 </span>
<span id="L446" class="LineNr">446 </span><span class="Normal">void</span> test_replace_type_ingredients_head_tail_multiple<span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L447" class="LineNr">447 </span>  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo:_elem [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L448" class="LineNr">448 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Constant">&quot;  x:_elem</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L449" class="LineNr">449 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L450" class="LineNr">450 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Constant">&quot;container bar:_elem [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L451" class="LineNr">451 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Constant">&quot;  x:foo:_elem</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L452" class="LineNr">452 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
<span id="L453" class="LineNr">453 </span>  reagent callsite<span class="Delimiter">(</span><span class="Constant">&quot;x:bar:<a href='043space.cc.html#L82'>address</a>:array:character&quot;</span><span class="Delimiter">);</span>
<span id="L454" class="LineNr">454 </span>  reagent element = <a href='030container.cc.html#L429'>element_type</a><span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
<span id="L455" class="LineNr">455 </span>  <a href='002test.cc.html#L31'>CHECK_EQ</a><span class="Delimiter">(</span><a href='028call_return.cc.html#L162'>to_string</a><span class="Delimiter">(</span>element<span class="Delimiter">),</span> <span class="Constant">&quot;{x: (</span><span class="cSpecial">\&quot;</span><span class="Constant">foo</span><span class="cSpecial">\&quot;</span><span class="Constant"> </span><span class="cSpecial">\&quot;</span><span class="Constant"><a href='043space.cc.html#L82'>address</a></span><span class="cSpecial">\&quot;</span><span class="Constant"> </span><span class="cSpecial">\&quot;</span><span class="Constant">array</span><span class="cSpecial">\&quot;</span><span class="Constant"> </span><span class="cSpecial">\&quot;</span><span class="Constant">character</span><span class="cSpecial">\&quot;</span><span class="Constant">)}&quot;</span><span class="Delimiter">);</span>
<span id="L456" class="LineNr">456 </span><span class="Delimiter">}</span>
<span id="L457" class="LineNr">457 </span>
<span id="L458" class="LineNr">458 </span><span class="Normal">void</span> test_replace_type_ingredients_head_middle<span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L459" class="LineNr">459 </span>  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo:_elem [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L460" class="LineNr">460 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Constant">&quot;  x:_elem</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L461" class="LineNr">461 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L462" class="LineNr">462 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Constant">&quot;container bar:_elem [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L463" class="LineNr">463 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Constant">&quot;  x:foo:_elem:num</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L464" class="LineNr">464 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
<span id="L465" class="LineNr">465 </span>  reagent callsite<span class="Delimiter">(</span><span class="Constant">&quot;x:bar:address&quot;</span><span class="Delimiter">);</span>
<span id="L466" class="LineNr">466 </span>  reagent element = <a href='030container.cc.html#L429'>element_type</a><span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
<span id="L467" class="LineNr">467 </span>  <a href='002test.cc.html#L31'>CHECK_EQ</a><span class="Delimiter">(</span><a href='028call_return.cc.html#L162'>to_string</a><span class="Delimiter">(</span>element<span class="Delimiter">),</span> <span class="Constant">&quot;{x: (</span><span class="cSpecial">\&quot;</span><span class="Constant">foo</span><span class="cSpecial">\&quot;</span><span class="Constant"> </span><span class="cSpecial">\&quot;</span><span class="Constant"><a href='043space.cc.html#L82'>address</a></span><span class="cSpecial">\&quot;</span><span class="Constant"> </span><span class="cSpecial">\&quot;</span><span class="Constant">number</span><span class="cSpecial">\&quot;</span><span class="Constant">)}&quot;</span><span class="Delimiter">);</span>
<span id="L468" class="LineNr">468 </span><span class="Delimiter">}</span>
<span id="L469" class="LineNr">469 </span>
<span id="L470" class="LineNr">470 </span><span class="Normal">void</span> test_replace_last_type_ingredient_with_multiple<span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L471" class="LineNr">471 </span>  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo:_a:_b [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L472" class="LineNr">472 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Constant">&quot;  x:_a</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L473" class="LineNr">473 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Constant">&quot;  y:_b</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L474" class="LineNr">474 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
<span id="L475" class="LineNr">475 </span>  reagent callsite<span class="Delimiter">(</span><span class="Constant">&quot;{f: (foo number (address array character))}&quot;</span><span class="Delimiter">);</span>
<span id="L476" class="LineNr">476 </span>  reagent element1 = <a href='030container.cc.html#L429'>element_type</a><span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
<span id="L477" class="LineNr">477 </span>  <a href='002test.cc.html#L31'>CHECK_EQ</a><span class="Delimiter">(</span><a href='028call_return.cc.html#L162'>to_string</a><span class="Delimiter">(</span>element1<span class="Delimiter">),</span> <span class="Constant">&quot;{x: </span><span class="cSpecial">\&quot;</span><span class="Constant">number</span><span class="cSpecial">\&quot;</span><span class="Constant">}&quot;</span><span class="Delimiter">);</span>
<span id="L478" class="LineNr">478 </span>  reagent element2 = <a href='030container.cc.html#L429'>element_type</a><span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L479" class="LineNr">479 </span>  <a href='002test.cc.html#L31'>CHECK_EQ</a><span class="Delimiter">(</span><a href='028call_return.cc.html#L162'>to_string</a><span class="Delimiter">(</span>element2<span class="Delimiter">),</span> <span class="Constant">&quot;{y: (</span><span class="cSpecial">\&quot;</span><span class="Constant"><a href='043space.cc.html#L82'>address</a></span><span class="cSpecial">\&quot;</span><span class="Constant"> </span><span class="cSpecial">\&quot;</span><span class="Constant">array</span><span class="cSpecial">\&quot;</span><span class="Constant"> </span><span class="cSpecial">\&quot;</span><span class="Constant">character</span><span class="cSpecial">\&quot;</span><span class="Constant">)}&quot;</span><span class="Delimiter">);</span>
<span id="L480" class="LineNr">480 </span><span class="Delimiter">}</span>
<span id="L481" class="LineNr">481 </span>
<span id="L482" class="LineNr">482 </span><span class="Normal">void</span> test_replace_last_type_ingredient_inside_compound<span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L483" class="LineNr">483 </span>  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo:_a:_b [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L484" class="LineNr">484 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Constant">&quot;  {x: (bar _a (address _b))}</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L485" class="LineNr">485 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
<span id="L486" class="LineNr">486 </span>  reagent callsite<span class="Delimiter">(</span><span class="Constant">&quot;f:foo:number:array:character&quot;</span><span class="Delimiter">);</span>
<span id="L487" class="LineNr">487 </span>  reagent element = <a href='030container.cc.html#L429'>element_type</a><span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
<span id="L488" class="LineNr">488 </span>  <a href='002test.cc.html#L31'>CHECK_EQ</a><span class="Delimiter">(</span>names_to_string_without_quotes<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">),</span> <span class="Constant">&quot;(bar number (address array character))&quot;</span><span class="Delimiter">);</span>
<span id="L489" class="LineNr">489 </span><span class="Delimiter">}</span>
<span id="L490" class="LineNr">490 </span>
<span id="L491" class="LineNr">491 </span><span class="Normal">void</span> test_replace_middle_type_ingredient_with_multiple<span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L492" class="LineNr">492 </span>  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo:_a:_b:_c [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L493" class="LineNr">493 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Constant">&quot;  x:_a</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L494" class="LineNr">494 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Constant">&quot;  y:_b</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L495" class="LineNr">495 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Constant">&quot;  z:_c</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L496" class="LineNr">496 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
<span id="L497" class="LineNr">497 </span>  reagent callsite<span class="Delimiter">(</span><span class="Constant">&quot;{f: (foo number (address array character) boolean)}&quot;</span><span class="Delimiter">);</span>
<span id="L498" class="LineNr">498 </span>  reagent element1 = <a href='030container.cc.html#L429'>element_type</a><span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
<span id="L499" class="LineNr">499 </span>  <a href='002test.cc.html#L31'>CHECK_EQ</a><span class="Delimiter">(</span><a href='028call_return.cc.html#L162'>to_string</a><span class="Delimiter">(</span>element1<span class="Delimiter">),</span> <span class="Constant">&quot;{x: </span><span class="cSpecial">\&quot;</span><span class="Constant">number</span><span class="cSpecial">\&quot;</span><span class="Constant">}&quot;</span><span class="Delimiter">);</span>
<span id="L500" class="LineNr">500 </span>  reagent element2 = <a href='030container.cc.html#L429'>element_type</a><span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L501" class="LineNr">501 </span>  <a href='002test.cc.html#L31'>CHECK_EQ</a><span class="Delimiter">(</span><a href='028call_return.cc.html#L162'>to_string</a><span class="Delimiter">(</span>element2<span class="Delimiter">),</span> <span class="Constant">&quot;{y: (</span><span class="cSpecial">\&quot;</span><span class="Constant"><a href='043space.cc.html#L82'>address</a></span><span class="cSpecial">\&quot;</span><span class="Constant"> </span><span class="cSpecial">\&quot;</span><span class="Constant">array</span><span class="cSpecial">\&quot;</span><span class="Constant"> </span><span class="cSpecial">\&quot;</span><span class="Constant">character</span><span class="cSpecial">\&quot;</span><span class="Constant">)}&quot;</span><span class="Delimiter">);</span>
<span id="L502" class="LineNr">502 </span>  reagent element3 = <a href='030container.cc.html#L429'>element_type</a><span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span>
<span id="L503" class="LineNr">503 </span>  <a href='002test.cc.html#L31'>CHECK_EQ</a><span class="Delimiter">(</span><a href='028call_return.cc.html#L162'>to_string</a><span class="Delimiter">(</span>element3<span class="Delimiter">),</span> <span class="Constant">&quot;{z: </span><span class="cSpecial">\&quot;</span><span class="Constant">boolean</span><span class="cSpecial">\&quot;</span><span class="Constant">}&quot;</span><span class="Delimiter">);</span>
<span id="L504" class="LineNr">504 </span><span class="Delimiter">}</span>
<span id="L505" class="LineNr">505 </span>
<span id="L506" class="LineNr">506 </span><span class="Normal">void</span> test_replace_middle_type_ingredient_with_multiple2<span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L507" class="LineNr">507 </span>  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo:_key:_value [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L508" class="LineNr">508 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Constant">&quot;  key:_key</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L509" class="LineNr">509 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Constant">&quot;  value:_value</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L510" class="LineNr">510 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
<span id="L511" class="LineNr">511 </span>  reagent callsite<span class="Delimiter">(</span><span class="Constant">&quot;{f: (foo (address array character) number)}&quot;</span><span class="Delimiter">);</span>
<span id="L512" class="LineNr">512 </span>  reagent element = <a href='030container.cc.html#L429'>element_type</a><span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
<span id="L513" class="LineNr">513 </span>  <a href='002test.cc.html#L31'>CHECK_EQ</a><span class="Delimiter">(</span><a href='028call_return.cc.html#L162'>to_string</a><span class="Delimiter">(</span>element<span class="Delimiter">),</span> <span class="Constant">&quot;{key: (</span><span class="cSpecial">\&quot;</span><span class="Constant"><a href='043space.cc.html#L82'>address</a></span><span class="cSpecial">\&quot;</span><span class="Constant"> </span><span class="cSpecial">\&quot;</span><span class="Constant">array</span><span class="cSpecial">\&quot;</span><span class="Constant"> </span><span class="cSpecial">\&quot;</span><span class="Constant">character</span><span class="cSpecial">\&quot;</span><span class="Constant">)}&quot;</span><span class="Delimiter">);</span>
<span id="L514" class="LineNr">514 </span><span class="Delimiter">}</span>
<span id="L515" class="LineNr">515 </span>
<span id="L516" class="LineNr">516 </span><span class="Normal">void</span> test_replace_middle_type_ingredient_with_multiple3<span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L517" class="LineNr">517 </span>  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo_table:_key:_value [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L518" class="LineNr">518 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Constant">&quot;  data:&amp;:@:foo_table_row:_key:_value</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L519" class="LineNr">519 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L520" class="LineNr">520 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Constant">&quot;</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L521" class="LineNr">521 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Constant">&quot;container foo_table_row:_key:_value [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L522" class="LineNr">522 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Constant">&quot;  key:_key</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L523" class="LineNr">523 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Constant">&quot;  value:_value</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L524" class="LineNr">524 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
<span id="L525" class="LineNr">525 </span>  reagent callsite<span class="Delimiter">(</span><span class="Constant">&quot;{f: (foo_table (address array character) number)}&quot;</span><span class="Delimiter">);</span>
<span id="L526" class="LineNr">526 </span>  reagent element = <a href='030container.cc.html#L429'>element_type</a><span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
<span id="L527" class="LineNr">527 </span>  <a href='002test.cc.html#L31'>CHECK_EQ</a><span class="Delimiter">(</span><a href='028call_return.cc.html#L162'>to_string</a><span class="Delimiter">(</span>element<span class="Delimiter">),</span> <span class="Constant">&quot;{data: (</span><span class="cSpecial">\&quot;</span><span class="Constant"><a href='043space.cc.html#L82'>address</a></span><span class="cSpecial">\&quot;</span><span class="Constant"> </span><span class="cSpecial">\&quot;</span><span class="Constant">array</span><span class="cSpecial">\&quot;</span><span class="Constant"> </span><span class="cSpecial">\&quot;</span><span class="Constant">foo_table_row</span><span class="cSpecial">\&quot;</span><span class="Constant"> (</span><span class="cSpecial">\&quot;</span><span class="Constant"><a href='043space.cc.html#L82'>address</a></span><span class="cSpecial">\&quot;</span><span class="Constant"> </span><span class="cSpecial">\&quot;</span><span class="Constant">array</span><span class="cSpecial">\&quot;</span><span class="Constant"> </span><span class="cSpecial">\&quot;</span><span class="Constant">character</span><span class="cSpecial">\&quot;</span><span class="Constant">) </span><span class="cSpecial">\&quot;</span><span class="Constant">number</span><span class="cSpecial">\&quot;</span><span class="Constant">)}&quot;</span><span class="Delimiter">);</span>
<span id="L528" class="LineNr">528 </span><span class="Delimiter">}</span>
<span id="L529" class="LineNr">529 </span>
<span id="L530" class="LineNr">530 </span><span class="Delimiter">:(code)</span>
<span id="L531" class="LineNr">531 </span><span class="Normal">bool</span> has_nth_type<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* base<span class="Delimiter">,</span> <span class="Normal">int</span> n<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L532" class="LineNr">532 </span>  assert<span class="Delimiter">(</span>n &gt;= <span class="Constant">0</span><span class="Delimiter">);</span>
<span id="L533" class="LineNr">533 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!base<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L534" class="LineNr">534 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>n == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L535" class="LineNr">535 </span>  <span class="Identifier">return</span> has_nth_type<span class="Delimiter">(</span>base<span class="Delimiter">-&gt;</span>right<span class="Delimiter">,</span> n-<span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L536" class="LineNr">536 </span><span class="Delimiter">}</span>
<span id="L537" class="LineNr">537 </span>
<span id="L538" class="LineNr">538 </span><span class="Delimiter">:(scenario get_on_shape_shifting_container_error)</span>
<span id="L539" class="LineNr">539 </span><span class="Special">% Hide_errors = true;</span>
<span id="L540" class="LineNr">540 </span><span class="muData">container</span> foo:_t [
<span id="L541" class="LineNr">541 </span>  <span class="Normal">x</span>:_t
<span id="L542" class="LineNr">542 </span>  <span class="Normal">y</span>:num
<span id="L543" class="LineNr">543 </span>]
<span id="L544" class="LineNr">544 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L545" class="LineNr">545 </span>  <span class="Constant">10</span>:foo:point<span class="Special"> &lt;- </span>merge <span class="Constant">14</span><span class="Delimiter">,</span> <span class="Constant">15</span><span class="Delimiter">,</span> <span class="Constant">16</span>
<span id="L546" class="LineNr">546 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>get <span class="Constant">10</span>:foo<span class="Delimiter">,</span> <span class="Constant">1:offset</span>
<span id="L547" class="LineNr">547 </span>]
<span id="L548" class="LineNr">548 </span><span class="traceContains">+error: illegal type &quot;foo&quot; seems to be missing a type ingredient or three in '1:num &lt;- get 10:foo, 1:offset'</span>
<span id="L549" class="LineNr">549 </span>
<span id="L550" class="LineNr">550 </span><span class="SalientComment">//:: fix up previous layers</span>
<span id="L551" class="LineNr">551 </span>
<span id="L552" class="LineNr">552 </span><span class="Comment">//: We have two transforms in previous layers -- for computing sizes and</span>
<span id="L553" class="LineNr">553 </span><span class="Comment">//: offsets containing addresses for containers and exclusive containers --</span>
<span id="L554" class="LineNr">554 </span><span class="Comment">//: that we need to teach about type ingredients.</span>
<span id="L555" class="LineNr">555 </span>
<span id="L556" class="LineNr">556 </span><span class="Delimiter">:(before &quot;End compute_container_sizes Non-atom Special-cases&quot;)</span>
<span id="L557" class="LineNr">557 </span><span class="Normal">const</span> type_tree* root = get_base_type<span class="Delimiter">(</span>type<span class="Delimiter">);</span>
<span id="L558" class="LineNr">558 </span><span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> root<span class="Delimiter">-&gt;</span>value<span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L559" class="LineNr">559 </span>  type_info&amp; info = get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> root<span class="Delimiter">-&gt;</span>value<span class="Delimiter">);</span>
<span id="L560" class="LineNr">560 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>info<span class="Delimiter">.</span>kind == <a href='010vm.cc.html#L173'>CONTAINER</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L561" class="LineNr">561 </span>  <span class="Conceal">¦</span> compute_container_sizes<span class="Delimiter">(</span>info<span class="Delimiter">,</span> type<span class="Delimiter">,</span> pending_metadata<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span>
<span id="L562" class="LineNr">562 </span>  <span class="Conceal">¦</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L563" class="LineNr">563 </span>  <span class="Delimiter">}</span>
<span id="L564" class="LineNr">564 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>info<span class="Delimiter">.</span>kind == <a href='010vm.cc.html#L174'>EXCLUSIVE_CONTAINER</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L565" class="LineNr">565 </span>  <span class="Conceal">¦</span> <a href='033exclusive_container.cc.html#L44'>compute_exclusive_container_sizes</a><span class="Delimiter">(</span>info<span class="Delimiter">,</span> type<span class="Delimiter">,</span> pending_metadata<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span>
<span id="L566" class="LineNr">566 </span>  <span class="Conceal">¦</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L567" class="LineNr">567 </span>  <span class="Delimiter">}</span>
<span id="L568" class="LineNr">568 </span><span class="Delimiter">}</span>  <span class="Comment">// otherwise error raised elsewhere</span>
<span id="L569" class="LineNr">569 </span>
<span id="L570" class="LineNr">570 </span><span class="Delimiter">:(before &quot;End Unit Tests&quot;)</span>
<span id="L571" class="LineNr">571 </span><span class="Normal">void</span> test_container_sizes_shape_shifting_container<span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L572" class="LineNr">572 </span>  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo:_t [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L573" class="LineNr">573 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Constant">&quot;  x:num</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L574" class="LineNr">574 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Constant">&quot;  y:_t</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L575" class="LineNr">575 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
<span id="L576" class="LineNr">576 </span>  reagent r<span class="Delimiter">(</span><span class="Constant">&quot;x:foo:point&quot;</span><span class="Delimiter">);</span>
<span id="L577" class="LineNr">577 </span>  compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
<span id="L578" class="LineNr">578 </span>  <a href='002test.cc.html#L31'>CHECK_EQ</a><span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>size<span class="Delimiter">,</span> <span class="Constant">3</span><span class="Delimiter">);</span>
<span id="L579" class="LineNr">579 </span><span class="Delimiter">}</span>
<span id="L580" class="LineNr">580 </span>
<span id="L581" class="LineNr">581 </span><span class="Normal">void</span> test_container_sizes_shape_shifting_exclusive_container<span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L582" class="LineNr">582 </span>  run<span class="Delimiter">(</span><span class="Constant">&quot;exclusive-container foo:_t [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L583" class="LineNr">583 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Constant">&quot;  x:num</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L584" class="LineNr">584 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Constant">&quot;  y:_t</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L585" class="LineNr">585 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
<span id="L586" class="LineNr">586 </span>  reagent r<span class="Delimiter">(</span><span class="Constant">&quot;x:foo:point&quot;</span><span class="Delimiter">);</span>
<span id="L587" class="LineNr">587 </span>  compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
<span id="L588" class="LineNr">588 </span>  <a href='002test.cc.html#L31'>CHECK_EQ</a><span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>size<span class="Delimiter">,</span> <span class="Constant">3</span><span class="Delimiter">);</span>
<span id="L589" class="LineNr">589 </span>  reagent r2<span class="Delimiter">(</span><span class="Constant">&quot;x:foo:num&quot;</span><span class="Delimiter">);</span>
<span id="L590" class="LineNr">590 </span>  compute_container_sizes<span class="Delimiter">(</span>r2<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
<span id="L591" class="LineNr">591 </span>  <a href='002test.cc.html#L31'>CHECK_EQ</a><span class="Delimiter">(</span>r2<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>size<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span>
<span id="L592" class="LineNr">592 </span><span class="Delimiter">}</span>
<span id="L593" class="LineNr">593 </span>
<span id="L594" class="LineNr">594 </span><span class="Normal">void</span> test_container_sizes_compound_type_ingredient<span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L595" class="LineNr">595 </span>  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo:_t [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L596" class="LineNr">596 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Constant">&quot;  x:num</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L597" class="LineNr">597 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Constant">&quot;  y:_t</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L598" class="LineNr">598 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
<span id="L599" class="LineNr">599 </span>  reagent r<span class="Delimiter">(</span><span class="Constant">&quot;x:foo:&amp;:point&quot;</span><span class="Delimiter">);</span>
<span id="L600" class="LineNr">600 </span>  compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
<span id="L601" class="LineNr">601 </span>  <a href='002test.cc.html#L31'>CHECK_EQ</a><span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>size<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span>
<span id="L602" class="LineNr">602 </span>  <span class="Comment">// scan also pre-computes metadata for type ingredient</span>
<span id="L603" class="LineNr">603 </span>  reagent point<span class="Delimiter">(</span><span class="Constant">&quot;x:point&quot;</span><span class="Delimiter">);</span>
<span id="L604" class="LineNr">604 </span>  <a href='002test.cc.html#L24'>CHECK</a><span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> point<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
<span id="L605" class="LineNr">605 </span>  <a href='002test.cc.html#L31'>CHECK_EQ</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> point<span class="Delimiter">.</span>type<span class="Delimiter">).</span>size<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span>
<span id="L606" class="LineNr">606 </span><span class="Delimiter">}</span>
<span id="L607" class="LineNr">607 </span>
<span id="L608" class="LineNr">608 </span><span class="Normal">void</span> test_container_sizes_recursive_shape_shifting_container<span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L609" class="LineNr">609 </span>  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo:_t [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L610" class="LineNr">610 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Constant">&quot;  x:num</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L611" class="LineNr">611 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Constant">&quot;  y:&amp;:foo:_t</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L612" class="LineNr">612 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
<span id="L613" class="LineNr">613 </span>  reagent r2<span class="Delimiter">(</span><span class="Constant">&quot;x:foo:num&quot;</span><span class="Delimiter">);</span>
<span id="L614" class="LineNr">614 </span>  compute_container_sizes<span class="Delimiter">(</span>r2<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
<span id="L615" class="LineNr">615 </span>  <a href='002test.cc.html#L31'>CHECK_EQ</a><span class="Delimiter">(</span>r2<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>size<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span>
<span id="L616" class="LineNr">616 </span><span class="Delimiter">}</span>
<span id="L617" class="LineNr">617 </span>
<span id="L618" class="LineNr">618 </span><span class="Delimiter">:(before &quot;End compute_container_address_offsets Non-atom Special-cases&quot;)</span>
<span id="L619" class="LineNr">619 </span><span class="Normal">const</span> type_tree* root = get_base_type<span class="Delimiter">(</span>type<span class="Delimiter">);</span>
<span id="L620" class="LineNr">620 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> root<span class="Delimiter">-&gt;</span>value<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span>  <span class="Comment">// error raised elsewhere</span>
<span id="L621" class="LineNr">621 </span>type_info&amp; info = get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> root<span class="Delimiter">-&gt;</span>value<span class="Delimiter">);</span>
<span id="L622" class="LineNr">622 </span><span class="Normal">if</span> <span class="Delimiter">(</span>info<span class="Delimiter">.</span>kind == <a href='010vm.cc.html#L173'>CONTAINER</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L623" class="LineNr">623 </span>  compute_container_address_offsets<span class="Delimiter">(</span>info<span class="Delimiter">,</span> type<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span>
<span id="L624" class="LineNr">624 </span>  <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L625" class="LineNr">625 </span><span class="Delimiter">}</span>
<span id="L626" class="LineNr">626 </span><span class="Normal">if</span> <span class="Delimiter">(</span>info<span class="Delimiter">.</span>kind == <a href='010vm.cc.html#L174'>EXCLUSIVE_CONTAINER</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L627" class="LineNr">627 </span>  <a href='036refcount.cc.html#L364'>compute_exclusive_container_address_offsets</a><span class="Delimiter">(</span>info<span class="Delimiter">,</span> type<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span>
<span id="L628" class="LineNr">628 </span>  <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L629" class="LineNr">629 </span><span class="Delimiter">}</span>
<span id="L630" class="LineNr">630 </span>
<span id="L631" class="LineNr">631 </span><span class="Delimiter">:(before &quot;End Unit Tests&quot;)</span>
<span id="L632" class="LineNr">632 </span><span class="Normal">void</span> test_container_address_offsets_in_shape_shifting_container<span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L633" class="LineNr">633 </span>  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo:_t [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L634" class="LineNr">634 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Constant">&quot;  x:num</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L635" class="LineNr">635 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Constant">&quot;  y:_t</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L636" class="LineNr">636 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
<span id="L637" class="LineNr">637 </span>  reagent r<span class="Delimiter">(</span><span class="Constant">&quot;x:foo:&amp;:num&quot;</span><span class="Delimiter">);</span>
<span id="L638" class="LineNr">638 </span>  compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
<span id="L639" class="LineNr">639 </span>  compute_container_address_offsets<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
<span id="L640" class="LineNr">640 </span>  <a href='002test.cc.html#L31'>CHECK_EQ</a><span class="Delimiter">(</span><a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span><a href='043space.cc.html#L82'>address</a><span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L641" class="LineNr">641 </span>  <a href='002test.cc.html#L24'>CHECK</a><span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span><a href='043space.cc.html#L82'>address</a><span class="Delimiter">,</span> set&lt;tag_condition_info&gt;<span class="Delimiter">()));</span>
<span id="L642" class="LineNr">642 </span>  set&lt;address_element_info&gt;&amp; offset_info = get<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span><a href='043space.cc.html#L82'>address</a><span class="Delimiter">,</span> set&lt;tag_condition_info&gt;<span class="Delimiter">());</span>
<span id="L643" class="LineNr">643 </span>  <a href='002test.cc.html#L31'>CHECK_EQ</a><span class="Delimiter">(</span><a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>offset_info<span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L644" class="LineNr">644 </span>  <a href='002test.cc.html#L31'>CHECK_EQ</a><span class="Delimiter">(</span>offset_info<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>offset<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>  <span class="Comment">//</span>
<span id="L645" class="LineNr">645 </span>  <a href='002test.cc.html#L24'>CHECK</a><span class="Delimiter">(</span>offset_info<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span><a href='030container.cc.html#L238'>payload_type</a><span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
<span id="L646" class="LineNr">646 </span>  <a href='002test.cc.html#L31'>CHECK_EQ</a><span class="Delimiter">(</span>offset_info<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span><a href='030container.cc.html#L238'>payload_type</a><span class="Delimiter">-&gt;</span>name<span class="Delimiter">,</span> <span class="Constant">&quot;number&quot;</span><span class="Delimiter">);</span>
<span id="L647" class="LineNr">647 </span><span class="Delimiter">}</span>
<span id="L648" class="LineNr">648 </span>
<span id="L649" class="LineNr">649 </span><span class="Normal">void</span> test_container_address_offsets_in_nested_shape_shifting_container<span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L650" class="LineNr">650 </span>  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo:_t [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L651" class="LineNr">651 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Constant">&quot;  x:num</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L652" class="LineNr">652 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Constant">&quot;  y:_t</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L653" class="LineNr">653 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L654" class="LineNr">654 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Constant">&quot;container bar:_t [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L655" class="LineNr">655 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Constant">&quot;  x:_t</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L656" class="LineNr">656 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Constant">&quot;  y:foo:_t</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L657" class="LineNr">657 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
<span id="L658" class="LineNr">658 </span>  reagent r<span class="Delimiter">(</span><span class="Constant">&quot;x:bar:&amp;:num&quot;</span><span class="Delimiter">);</span>
<span id="L659" class="LineNr">659 </span>  <a href='003trace.cc.html#L158'>CLEAR_TRACE</a><span class="Delimiter">;</span>
<span id="L660" class="LineNr">660 </span>  compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
<span id="L661" class="LineNr">661 </span>  compute_container_address_offsets<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
<span id="L662" class="LineNr">662 </span>  <a href='002test.cc.html#L31'>CHECK_EQ</a><span class="Delimiter">(</span><a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span><a href='043space.cc.html#L82'>address</a><span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L663" class="LineNr">663 </span>  <a href='002test.cc.html#L24'>CHECK</a><span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span><a href='043space.cc.html#L82'>address</a><span class="Delimiter">,</span> set&lt;tag_condition_info&gt;<span class="Delimiter">()));</span>
<span id="L664" class="LineNr">664 </span>  set&lt;address_element_info&gt;&amp; offset_info = get<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span><a href='043space.cc.html#L82'>address</a><span class="Delimiter">,</span> set&lt;tag_condition_info&gt;<span class="Delimiter">());</span>
<span id="L665" class="LineNr">665 </span>  <a href='002test.cc.html#L31'>CHECK_EQ</a><span class="Delimiter">(</span><a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>offset_info<span class="Delimiter">),</span> <span class="Constant">2</span><span class="Delimiter">);</span>
<span id="L666" class="LineNr">666 </span>  <a href='002test.cc.html#L31'>CHECK_EQ</a><span class="Delimiter">(</span>offset_info<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span>offset<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>  <span class="Comment">//</span>
<span id="L667" class="LineNr">667 </span>  <a href='002test.cc.html#L24'>CHECK</a><span class="Delimiter">(</span>offset_info<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span><a href='030container.cc.html#L238'>payload_type</a><span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
<span id="L668" class="LineNr">668 </span>  <a href='002test.cc.html#L31'>CHECK_EQ</a><span class="Delimiter">(</span>offset_info<span class="Delimiter">.</span>begin<span class="Delimiter">()-&gt;</span><a href='030container.cc.html#L238'>payload_type</a><span class="Delimiter">-&gt;</span>name<span class="Delimiter">,</span> <span class="Constant">&quot;number&quot;</span><span class="Delimiter">);</span>
<span id="L669" class="LineNr">669 </span>  <a href='002test.cc.html#L31'>CHECK_EQ</a><span class="Delimiter">((</span>++offset_info<span class="Delimiter">.</span>begin<span class="Delimiter">())-&gt;</span>offset<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span>  <span class="Comment">//</span>
<span id="L670" class="LineNr">670 </span>  <a href='002test.cc.html#L24'>CHECK</a><span class="Delimiter">((</span>++offset_info<span class="Delimiter">.</span>begin<span class="Delimiter">())-&gt;</span><a href='030container.cc.html#L238'>payload_type</a><span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
<span id="L671" class="LineNr">671 </span>  <a href='002test.cc.html#L31'>CHECK_EQ</a><span class="Delimiter">((</span>++offset_info<span class="Delimiter">.</span>begin<span class="Delimiter">())-&gt;</span><a href='030container.cc.html#L238'>payload_type</a><span class="Delimiter">-&gt;</span>name<span class="Delimiter">,</span> <span class="Constant">&quot;number&quot;</span><span class="Delimiter">);</span>
<span id="L672" class="LineNr">672 </span><span class="Delimiter">}</span>
<span id="L673" class="LineNr">673 </span>
<span id="L674" class="LineNr">674 </span><span class="Delimiter">:(scenario typos_in_container_definitions)</span>
<span id="L675" class="LineNr">675 </span><span class="Special">% Hide_errors = true;</span>
<span id="L676" class="LineNr">676 </span><span class="muData">container</span> foo:_t [
<span id="L677" class="LineNr">677 </span>  <span class="Normal">x</span>:adress:_t  <span class="Comment"># typo</span>
<span id="L678" class="LineNr">678 </span>]
<span id="L679" class="LineNr">679 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L680" class="LineNr">680 </span>  local-scope
<span id="L681" class="LineNr">681 </span>  <span class="Normal">x</span>:<a href='043space.cc.html#L82'>address</a>:foo:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Delimiter">{(</span>foo num<span class="Delimiter">)</span>: type<span class="Delimiter">}</span>
<span id="L682" class="LineNr">682 </span>]
<span id="L683" class="LineNr">683 </span><span class="Comment"># no crash</span>
<span id="L684" class="LineNr">684 </span>
<span id="L685" class="LineNr">685 </span><span class="Delimiter">:(scenario typos_in_recipes)</span>
<span id="L686" class="LineNr">686 </span><span class="Special">% Hide_errors = true;</span>
<span id="L687" class="LineNr">687 </span><span class="muRecipe">def</span> foo [
<span id="L688" class="LineNr">688 </span>  local-scope
<span id="L689" class="LineNr">689 </span>  <span class="Normal">x</span>:adress:array:number<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>  <span class="Comment"># typo</span>
<span id="L690" class="LineNr">690 </span>]
<span id="L691" class="LineNr">691 </span><span class="Comment"># shouldn't crash</span>
<span id="L692" class="LineNr">692 </span>
<span id="L693" class="LineNr">693 </span><span class="SalientComment">//:: 'merge' on shape-shifting containers</span>
<span id="L694" class="LineNr">694 </span>
<span id="L695" class="LineNr">695 </span><span class="Delimiter">:(scenario merge_check_shape_shifting_container_containing_exclusive_container)</span>
<span id="L696" class="LineNr">696 </span><span class="muData">container</span> foo:_elem [
<span id="L697" class="LineNr">697 </span>  <span class="Normal">x</span>:num
<span id="L698" class="LineNr">698 </span>  <span class="Normal">y</span>:_elem
<span id="L699" class="LineNr">699 </span>]
<span id="L700" class="LineNr">700 </span><span class="muData">exclusive-container</span> bar [
<span id="L701" class="LineNr">701 </span>  <span class="Normal">x</span>:num
<span id="L702" class="LineNr">702 </span>  <span class="Normal">y</span>:num
<span id="L703" class="LineNr">703 </span>]
<span id="L704" class="LineNr">704 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L705" class="LineNr">705 </span>  <span class="Constant">1</span>:foo:bar<span class="Special"> &lt;- </span>merge <span class="Constant">23</span><span class="Delimiter">,</span> <span class="Constant">1</span>/y<span class="Delimiter">,</span> <span class="Constant">34</span>
<span id="L706" class="LineNr">706 </span>]
<span id="L707" class="LineNr">707 </span><span class="traceContains">+mem: storing 23 in location 1</span>
<span id="L708" class="LineNr">708 </span><span class="traceContains">+mem: storing 1 in location 2</span>
<span id="L709" class="LineNr">709 </span><span class="traceContains">+mem: storing 34 in location 3</span>
<span id="L710" class="LineNr">710 </span>$error: <span class="Constant">0</span>
<span id="L711" class="LineNr">711 </span>
<span id="L712" class="LineNr">712 </span><span class="Delimiter">:(scenario merge_check_shape_shifting_container_containing_exclusive_container_2)</span>
<span id="L713" class="LineNr">713 </span><span class="Special">% Hide_errors = true;</span>
<span id="L714" class="LineNr">714 </span><span class="muData">container</span> foo:_elem [
<span id="L715" class="LineNr">715 </span>  <span class="Normal">x</span>:num
<span id="L716" class="LineNr">716 </span>  <span class="Normal">y</span>:_elem
<span id="L717" class="LineNr">717 </span>]
<span id="L718" class="LineNr">718 </span><span class="muData">exclusive-container</span> bar [
<span id="L719" class="LineNr">719 </span>  <span class="Normal">x</span>:num
<span id="L720" class="LineNr">720 </span>  <span class="Normal">y</span>:num
<span id="L721" class="LineNr">721 </span>]
<span id="L722" class="LineNr">722 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L723" class="LineNr">723 </span>  <span class="Constant">1</span>:foo:bar<span class="Special"> &lt;- </span>merge <span class="Constant">23</span><span class="Delimiter">,</span> <span class="Constant">1</span>/y<span class="Delimiter">,</span> <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">35</span>
<span id="L724" class="LineNr">724 </span>]
<span id="L725" class="LineNr">725 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: too many ingredients in '1:foo:bar &lt;- merge 23, 1/y, 34, 35'</span>
<span id="L726" class="LineNr">726 </span>
<span id="L727" class="LineNr">727 </span><span class="Delimiter">:(scenario merge_check_shape_shifting_exclusive_container_containing_container)</span>
<span id="L728" class="LineNr">728 </span><span class="muData">exclusive-container</span> foo:_elem [
<span id="L729" class="LineNr">729 </span>  <span class="Normal">x</span>:num
<span id="L730" class="LineNr">730 </span>  <span class="Normal">y</span>:_elem
<span id="L731" class="LineNr">731 </span>]
<span id="L732" class="LineNr">732 </span><span class="muData">container</span> bar [
<span id="L733" class="LineNr">733 </span>  <span class="Normal">x</span>:num
<span id="L734" class="LineNr">734 </span>  <span class="Normal">y</span>:num
<span id="L735" class="LineNr">735 </span>]
<span id="L736" class="LineNr">736 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L737" class="LineNr">737 </span>  <span class="Constant">1</span>:foo:bar<span class="Special"> &lt;- </span>merge <span class="Constant">1</span>/y<span class="Delimiter">,</span> <span class="Constant">23</span><span class="Delimiter">,</span> <span class="Constant">34</span>
<span id="L738" class="LineNr">738 </span>]
<span id="L739" class="LineNr">739 </span><span class="traceContains">+mem: storing 1 in location 1</span>
<span id="L740" class="LineNr">740 </span><span class="traceContains">+mem: storing 23 in location 2</span>
<span id="L741" class="LineNr">741 </span><span class="traceContains">+mem: storing 34 in location 3</span>
<span id="L742" class="LineNr">742 </span>$error: <span class="Constant">0</span>
<span id="L743" class="LineNr">743 </span>
<span id="L744" class="LineNr">744 </span><span class="Delimiter">:(scenario merge_check_shape_shifting_exclusive_container_containing_container_2)</span>
<span id="L745" class="LineNr">745 </span><span class="muData">exclusive-container</span> foo:_elem [
<span id="L746" class="LineNr">746 </span>  <span class="Normal">x</span>:num
<span id="L747" class="LineNr">747 </span>  <span class="Normal">y</span>:_elem
<span id="L748" class="LineNr">748 </span>]
<span id="L749" class="LineNr">749 </span><span class="muData">container</span> bar [
<span id="L750" class="LineNr">750 </span>  <span class="Normal">x</span>:num
<span id="L751" class="LineNr">751 </span>  <span class="Normal">y</span>:num
<span id="L752" class="LineNr">752 </span>]
<span id="L753" class="LineNr">753 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L754" class="LineNr">754 </span>  <span class="Constant">1</span>:foo:bar<span class="Special"> &lt;- </span>merge <span class="Constant">0</span>/x<span class="Delimiter">,</span> <span class="Constant">23</span>
<span id="L755" class="LineNr">755 </span>]
<span id="L756" class="LineNr">756 </span>$error: <span class="Constant">0</span>
<span id="L757" class="LineNr">757 </span>
<span id="L758" class="LineNr">758 </span><span class="Delimiter">:(scenario merge_check_shape_shifting_exclusive_container_containing_container_3)</span>
<span id="L759" class="LineNr">759 </span><span class="Special">% Hide_errors = true;</span>
<span id="L760" class="LineNr">760 </span><span class="muData">exclusive-container</span> foo:_elem [
<span id="L761" class="LineNr">761 </span>  <span class="Normal">x</span>:num
<span id="L762" class="LineNr">762 </span>  <span class="Normal">y</span>:_elem
<span id="L763" class="LineNr">763 </span>]
<span id="L764" class="LineNr">764 </span><span class="muData">container</span> bar [
<span id="L765" class="LineNr">765 </span>  <span class="Normal">x</span>:num
<span id="L766" class="LineNr">766 </span>  <span class="Normal">y</span>:num
<span id="L767" class="LineNr">767 </span>]
<span id="L768" class="LineNr">768 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L769" class="LineNr">769 </span>  <span class="Constant">1</span>:foo:bar<span class="Special"> &lt;- </span>merge <span class="Constant">1</span>/y<span class="Delimiter">,</span> <span class="Constant">23</span>
<span id="L770" class="LineNr">770 </span>]
<span id="L771" class="LineNr">771 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: too few ingredients in '1:foo:bar &lt;- merge 1/y, 23'</span>
</pre>
</body>
</html>
<!-- vim: set foldmethod=manual : -->