diff --git a/StructFields.pm b/StructFields.pm index 2d024d088..401da8259 100644 --- a/StructFields.pm +++ b/StructFields.pm @@ -73,6 +73,18 @@ sub get_container_item_type($;%) { } } +sub get_internal_item_type($;$;%) { + my ($tag, $type, %flags) = @_; + my @items = $tag->findnodes($type); + if (@items) { + return get_struct_field_type($items[0], -local => $in_struct_body, %container_flags, %flags); + } elsif ($flags{-void}) { + return $flags{-void}; + } else { + die "Container without $type: $tag\n"; + } +} + sub get_variant_item_type($;%) { my ($tag, %flags) = @_; my ($rawtype) = $tag->getAttribute('raw-type'); @@ -152,6 +164,11 @@ my %custom_container_handlers = ( header_ref("set"); return "std::set<$item >"; }, + 'stl-unordered-set' => sub { + my $item = get_container_item_type($_, -void => 'void*'); + header_ref("unordered_set"); + return "std::unordered_set<$item >"; + }, 'stl-bit-vector' => sub { header_ref("vector"); return "std::vector"; @@ -163,18 +180,16 @@ my %custom_container_handlers = ( return "std::array<$item, $count>"; }, 'stl-map' => sub { - # TODO: implement get_container_key_type? - my $key = 'void*'; - my $item = get_container_item_type($_, -void => 'void*'); + my $key = get_internal_item_type($_, "key-type", -void => 'void*'); + my $value = get_internal_item_type($_, "value-type", -void => 'void*'); header_ref("map"); - return "std::map<$key, $item>"; + return "std::map<$key, $value>"; }, 'stl-unordered-map' => sub { - # TODO: implement get_container_key_type? - my $key = 'void*'; - my $item = get_container_item_type($_, -void => 'void*'); + my $key = get_internal_item_type($_, "key-type", -void => 'void*'); + my $value = get_internal_item_type($_, "value-type", -void => 'void*'); header_ref("unordered_map"); - return "std::unordered_map<$key, $item>"; + return "std::unordered_map<$key, $value>"; }, 'stl-function' => sub { my $item = get_container_item_type($_, -void => 'void'); diff --git a/StructType.pm b/StructType.pm index efa12cb37..8708dd546 100644 --- a/StructType.pm +++ b/StructType.pm @@ -316,7 +316,9 @@ sub render_struct_type { emit 'friend struct ' . fully_qualified_name($types{$backref}, $backref) . ';'; } } + } $tag, "$typename$ispec", -export => 1; + } 1; diff --git a/codegen.pl b/codegen.pl index 874fdedd9..bcada51c5 100755 --- a/codegen.pl +++ b/codegen.pl @@ -36,14 +36,17 @@ BEGIN my $parser = XML::LibXML->new(); my $xslt = XML::LibXSLT->new(); my @transforms = - map { $xslt->parse_stylesheet_file("$script_root/$_"); } + map { [ $_, $xslt->parse_stylesheet_file("$script_root/$_") ]; } ('lower-1.xslt', 'lower-2.xslt'); my @documents; for my $fn (sort { $a cmp $b } bsd_glob "$input_dir/df.*.xml") { local $filename = $fn; my $doc = $parser->parse_file($filename); - $doc = $_->transform($doc) for @transforms; + for my $t (@transforms) { +# print "Applying transform ", $t->[0], " to $filename\n"; + $doc = $t->[1]->transform($doc); + } push @documents, $doc; add_type_to_hash $_ foreach $doc->findnodes('/ld:data-definition/ld:global-type'); diff --git a/data-definition.xsd b/data-definition.xsd index 18271caa8..8b17d0161 100644 --- a/data-definition.xsd +++ b/data-definition.xsd @@ -221,6 +221,7 @@ + @@ -417,10 +418,13 @@ - - - - + + + + + + + diff --git a/df.creature.xml b/df.creature.xml index 54d9667fc..8483c6916 100644 --- a/df.creature.xml +++ b/df.creature.xml @@ -1528,7 +1528,10 @@ - + + + + diff --git a/df.d_interface.xml b/df.d_interface.xml index b2df01bbb..4ebd58a99 100644 --- a/df.d_interface.xml +++ b/df.d_interface.xml @@ -1975,7 +1975,7 @@ - + @@ -1989,11 +1989,14 @@ + - + + + bay12: labor_kitchen_interface_type_filter @@ -2005,9 +2008,15 @@ - + + + + - + + + + @@ -2370,9 +2379,18 @@ - - - + + + + + + + + + + + + diff --git a/df.g_src.ViewBase.xml b/df.g_src.ViewBase.xml index 80b2cb6f2..e5fcc4381 100644 --- a/df.g_src.ViewBase.xml +++ b/df.g_src.ViewBase.xml @@ -139,7 +139,10 @@ - + + + + @@ -185,7 +188,11 @@ - + + + + + @@ -248,7 +255,9 @@ - + + + @@ -256,7 +265,9 @@ - + + + @@ -279,11 +290,27 @@ - + + + + + + + + + - + + + + + + + + + bay12: InterfaceBreakdownTypes, no base type diff --git a/df.g_src.enabler.xml b/df.g_src.enabler.xml index d13189abd..2f204ccc6 100644 --- a/df.g_src.enabler.xml +++ b/df.g_src.enabler.xml @@ -45,7 +45,7 @@ - + diff --git a/df.g_src.music_and_sound_g.xml b/df.g_src.music_and_sound_g.xml index 5a4fb7964..695f339fa 100644 --- a/df.g_src.music_and_sound_g.xml +++ b/df.g_src.music_and_sound_g.xml @@ -28,7 +28,13 @@ -- Unused: Song -- Unused: SoundType -- Skipped: musicsound_info - platform-dependent implementation? - -- Unused: music_datast + + + + + + + -- Unused: loading_music_filest @@ -82,10 +88,19 @@ - - - - + + + + + + + + + + + + + diff --git a/df.g_src.renderer_2d.xml b/df.g_src.renderer_2d.xml index ec8a914a6..ab07ab301 100644 --- a/df.g_src.renderer_2d.xml +++ b/df.g_src.renderer_2d.xml @@ -1,9 +1,14 @@ - + + + + + + diff --git a/df.item.xml b/df.item.xml index 6b60ccead..1641218a1 100644 --- a/df.item.xml +++ b/df.item.xml @@ -2453,7 +2453,10 @@ - + + + + bay12: ArtifactFlagType diff --git a/df.region_midmap.xml b/df.region_midmap.xml index 34eff449d..e1297b550 100644 --- a/df.region_midmap.xml +++ b/df.region_midmap.xml @@ -270,7 +270,12 @@ - + + + + + + diff --git a/df.widgets.unit_list.xml b/df.widgets.unit_list.xml index 3725ec578..d07ac4566 100644 --- a/df.widgets.unit_list.xml +++ b/df.widgets.unit_list.xml @@ -65,7 +65,10 @@ - std::unordered_map<std::string,bool> + + + + @@ -76,8 +79,13 @@ - - + + + + + + + diff --git a/df.world.xml b/df.world.xml index 9fd596fc0..54e6df574 100644 --- a/df.world.xml +++ b/df.world.xml @@ -340,7 +340,14 @@ - + + + + + + + + bay12: PrepareRodStageType diff --git a/lower-1.xslt b/lower-1.xslt index 0ff956bd4..101a8b03a 100644 --- a/lower-1.xslt +++ b/lower-1.xslt @@ -340,7 +340,7 @@ Error: field corresponds to an enum value of - + @@ -352,6 +352,48 @@ Error: field corresponds to an enum value of + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lower-2.xslt b/lower-2.xslt index 941e4d83d..10d31c90e 100644 --- a/lower-2.xslt +++ b/lower-2.xslt @@ -69,6 +69,18 @@ + + + + + + + + + + + +