Skip to content

Commit 40c9ae5

Browse files
authored
Merge pull request #862 from ab9rf/proper-maps
add support for properly typed maps
2 parents 48077a0 + 00e1c5e commit 40c9ae5

16 files changed

+211
-42
lines changed

StructFields.pm

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,18 @@ sub get_container_item_type($;%) {
7373
}
7474
}
7575

76+
sub get_internal_item_type($;$;%) {
77+
my ($tag, $type, %flags) = @_;
78+
my @items = $tag->findnodes($type);
79+
if (@items) {
80+
return get_struct_field_type($items[0], -local => $in_struct_body, %container_flags, %flags);
81+
} elsif ($flags{-void}) {
82+
return $flags{-void};
83+
} else {
84+
die "Container without $type: $tag\n";
85+
}
86+
}
87+
7688
sub get_variant_item_type($;%) {
7789
my ($tag, %flags) = @_;
7890
my ($rawtype) = $tag->getAttribute('raw-type');
@@ -152,6 +164,11 @@ my %custom_container_handlers = (
152164
header_ref("set");
153165
return "std::set<$item >";
154166
},
167+
'stl-unordered-set' => sub {
168+
my $item = get_container_item_type($_, -void => 'void*');
169+
header_ref("unordered_set");
170+
return "std::unordered_set<$item >";
171+
},
155172
'stl-bit-vector' => sub {
156173
header_ref("vector");
157174
return "std::vector<bool>";
@@ -163,18 +180,16 @@ my %custom_container_handlers = (
163180
return "std::array<$item, $count>";
164181
},
165182
'stl-map' => sub {
166-
# TODO: implement get_container_key_type?
167-
my $key = 'void*';
168-
my $item = get_container_item_type($_, -void => 'void*');
183+
my $key = get_internal_item_type($_, "key-type", -void => 'void*');
184+
my $value = get_internal_item_type($_, "value-type", -void => 'void*');
169185
header_ref("map");
170-
return "std::map<$key, $item>";
186+
return "std::map<$key, $value>";
171187
},
172188
'stl-unordered-map' => sub {
173-
# TODO: implement get_container_key_type?
174-
my $key = 'void*';
175-
my $item = get_container_item_type($_, -void => 'void*');
189+
my $key = get_internal_item_type($_, "key-type", -void => 'void*');
190+
my $value = get_internal_item_type($_, "value-type", -void => 'void*');
176191
header_ref("unordered_map");
177-
return "std::unordered_map<$key, $item>";
192+
return "std::unordered_map<$key, $value>";
178193
},
179194
'stl-function' => sub {
180195
my $item = get_container_item_type($_, -void => 'void');

StructType.pm

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -316,7 +316,9 @@ sub render_struct_type {
316316
emit 'friend struct ' . fully_qualified_name($types{$backref}, $backref) . ';';
317317
}
318318
}
319+
319320
} $tag, "$typename$ispec", -export => 1;
321+
320322
}
321323

322324
1;

codegen.pl

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,17 @@ BEGIN
3636
my $parser = XML::LibXML->new();
3737
my $xslt = XML::LibXSLT->new();
3838
my @transforms =
39-
map { $xslt->parse_stylesheet_file("$script_root/$_"); }
39+
map { [ $_, $xslt->parse_stylesheet_file("$script_root/$_") ]; }
4040
('lower-1.xslt', 'lower-2.xslt');
4141
my @documents;
4242

4343
for my $fn (sort { $a cmp $b } bsd_glob "$input_dir/df.*.xml") {
4444
local $filename = $fn;
4545
my $doc = $parser->parse_file($filename);
46-
$doc = $_->transform($doc) for @transforms;
46+
for my $t (@transforms) {
47+
# print "Applying transform ", $t->[0], " to $filename\n";
48+
$doc = $t->[1]->transform($doc);
49+
}
4750

4851
push @documents, $doc;
4952
add_type_to_hash $_ foreach $doc->findnodes('/ld:data-definition/ld:global-type');

data-definition.xsd

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,7 @@
221221
<xs:element name="stl-deque" type="StlDequeField" />
222222
<xs:element name="stl-array" type="StlArrayField" />
223223
<xs:element name="stl-set" type="StlSetField" />
224+
<xs:element name="stl-unordered-set" type="StlSetField" />
224225
<xs:element name="stl-map" type="StlMapField" />
225226
<xs:element name="stl-unordered-map" type="StlMapField" />
226227
<xs:element name="stl-fstream" type="OpaqueField" />
@@ -417,10 +418,13 @@
417418
</xs:complexContent>
418419
</xs:complexType>
419420
<xs:complexType name="StlMapField">
420-
<xs:complexContent>
421-
<xs:extension base="ContainerFieldType">
422-
</xs:extension>
423-
</xs:complexContent>
421+
<xs:sequence>
422+
<xs:element name="key-type" minOccurs="1" maxOccurs="1" type="CompoundFieldType"/>
423+
<xs:element name="value-type" minOccurs="1" maxOccurs="1" type="CompoundFieldType"/>
424+
</xs:sequence>
425+
<xs:attributeGroup ref="SharedAttributes" />
426+
<xs:attribute name="name">
427+
</xs:attribute>
424428
</xs:complexType>
425429
<xs:complexType name="StlOptionalField">
426430
<xs:complexContent>

df.creature.xml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1528,7 +1528,10 @@
15281528

15291529
<stl-vector name='action_strings' pointer-type='stl-string' since='v0.40.01'/>
15301530

1531-
<stl-unordered-map name='hist_fig_to_creature_map' type-name='int32_t' comment='unordered_map&lt;int32_t,int32_t&gt;'/>
1531+
<stl-unordered-map name='hist_fig_to_creature_map'>
1532+
<key-type type-name='int32_t'/>
1533+
<value-type type-name='int32_t'/>
1534+
</stl-unordered-map>
15321535

15331536
<virtual-methods>
15341537
<vmethod name='getTile' ret-type='uint8_t'>

df.d_interface.xml

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1975,7 +1975,7 @@
19751975
<enum-item name='OTHER'/>
19761976
</enum-type>
19771977

1978-
<struct-type type-name='labor_kitchen_interface_food_key'>
1978+
<struct-type type-name='labor_kitchen_interface_food_key' custom-methods='true'>
19791979
<enum name='type' type-name='item_type'/>
19801980
<int16_t name='subtype'/>
19811981
<int16_t name='mat'/>
@@ -1989,11 +1989,14 @@
19891989
</struct-type>
19901990

19911991
<struct-type type-name='labor_kitchen_interface_food_entry'>
1992+
<extra-include filename="custom/hash/labor_kitchen_interface_food_key.h"/>
19921993
<compound type-name='labor_kitchen_interface_food_key' name='first'/>
19931994
<compound type-name='labor_kitchen_interface_food_value' name='second'/>
19941995
</struct-type>
19951996

1996-
<struct-type type-name='labor_kitchen_interface_food_sort_entry' inherits-from='sort_entry'/>
1997+
<struct-type type-name='labor_kitchen_interface_food_sort_entry' inherits-from='sort_entry'>
1998+
<extra-include filename="custom/hash/labor_kitchen_interface_food_key.h"/>
1999+
</struct-type>
19972000

19982001
<enum-type type-name='labor_kitchen_interface_type_filter' base-type='int8_t'> bay12: labor_kitchen_interface_type_filter
19992002
<enum-item name='ALL' value='-1'/>
@@ -2005,9 +2008,15 @@
20052008

20062009
<class-type type-name='labor_kitchen_interfacest' inherits-from='widget_container'>
20072010
<enum type-name='kitchen_pref_category_type' name='current_category'/>
2008-
<stl-unordered-map type-name='labor_kitchen_interface_food_value' name='known' comment='std::unordered_map&lt;labor_kitchen_interface_food_key,labor_kitchen_interface_food_value&gt;'/>
2011+
<stl-unordered-map name='known'>
2012+
<key-type type-name='labor_kitchen_interface_food_key'/>
2013+
<value-type type-name='labor_kitchen_interface_food_value'/>
2014+
</stl-unordered-map>
20092015
<stl-vector type-name='labor_kitchen_interface_food_sort_entry' name='sorting_by'/>
2010-
<stl-unordered-map type-name='int8_t' name='ascending_sort' comment='std::unordered_map&lt;std::string,bool&gt;'/>
2016+
<stl-unordered-map name='ascending_sort'>
2017+
<key-type type-name='stl-string'/>
2018+
<value-type type-name='int8_t'/>
2019+
</stl-unordered-map>
20112020
<stl-vector name='filter_func'>
20122021
<stl-function comment='std::function&lt;bool(labor_kitchen_interface_food_entry)&gt;'/>
20132022
</stl-vector>
@@ -2370,9 +2379,18 @@
23702379
<stl-vector pointer-type='organization_entryst' name='organization_entry'/>
23712380
<stl-vector pointer-type='plot_entryst' name='plot_entry'/>
23722381

2373-
<stl-unordered-map type-name='int32_t' name='crimevals' comment='std::unordered_map&lt;unitst *,int32_t&gt;'/>
2374-
<stl-unordered-map type-name='justice_screen_interrogation_list_flag' name='crimeflag' comment='std::unordered_map&lt;unitst *,int32_t&gt;'/>
2375-
<stl-unordered-map type-name='int32_t' name='guardvals' comment='std::unordered_map&lt;unitst *,int32_t&gt;'/>
2382+
<stl-unordered-map name='crimevals'>
2383+
<key-type><pointer type-name='unit'/></key-type>
2384+
<value-type type-name='int32_t'/>
2385+
</stl-unordered-map>
2386+
<stl-unordered-map name='crimeflag'>
2387+
<key-type><pointer type-name='unit'/></key-type>
2388+
<value-type type-name='justice_screen_interrogation_list_flag'/>
2389+
</stl-unordered-map>
2390+
<stl-unordered-map name='guardvals'>
2391+
<key-type><pointer type-name='unit'/></key-type>
2392+
<value-type type-name='int32_t'/>
2393+
</stl-unordered-map>
23762394

23772395
<bool name='do_init'/>
23782396
</class-type>

df.g_src.ViewBase.xml

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,10 @@
139139
</class-type>
140140

141141
<class-type type-name='widget_container' original-name='widgets::container' inherits-from='widget'>
142-
<stl-map name='children_by_name' comment='std::map&lt;std::string,std::shared_ptr&lt;widget&gt;&gt;'/>
142+
<stl-map name='children_by_name'>
143+
<key-type type-name='stl-string'/>
144+
<value-type><stl-shared-ptr type-name='widget'/></value-type>
145+
</stl-map>
143146
<stl-vector name='children'>
144147
<stl-shared-ptr type-name='widget'/>
145148
</stl-vector>
@@ -185,7 +188,11 @@
185188
<pointer type-name='widget' name='selected'/>
186189
<int32_t name='selected_idx' init-value='0'/>
187190
<compound type-name='widget_scroll_rows' name='rows'/>
188-
<stl-map name='select_callback' comment='std::map&lt;size_t, std::function&lt;void(widget *)&gt;&gt;'/>
191+
<stl-map name='select_callback'>
192+
<key-type type-name='size_t'/>
193+
<value-type><stl-function comment='arguments are widget *'/></value-type>
194+
</stl-map>
195+
189196
</class-type>
190197

191198
<class-type type-name='widget_table' original-name='widgets::table' inherits-from='widget_container'>
@@ -248,15 +255,19 @@
248255
<class-type type-name='widget_folder' original-name='widgets::folder' inherits-from='widget'>
249256
<compound type-name='widget' name='open'/>
250257
<bool name='last_visible'/>
251-
<stl-unordered-map name='controlled_set' comment='std::unordered_set&lt;std::shared_ptr&lt;widget&gt;&gt;'/>
258+
<stl-unordered-set name='controlled_set'>
259+
<stl-shared-ptr type-name='widget'/>
260+
</stl-unordered-set>
252261
<bool name='controlled_visible'/>
253262
<compound type-name='widget_text' name='label'/>
254263
<stl-weak-ptr type-name='widget_container'/>
255264
</class-type>
256265

257266
<struct-type type-name='filter_entry'>
258267
<stl-shared-ptr type-name='widget_text' name='label'/>
259-
<stl-unordered-map name='filtered_set' comment='std::unordered_set&lt;std::shared_ptr&lt;widget&gt;&gt;'/>
268+
<stl-unordered-set name='filtered_set'>
269+
<stl-shared-ptr type-name='widget'/>
270+
</stl-unordered-set>
260271
</struct-type>
261272

262273
<class-type type-name='widget_filter' original-name='widgets::filter' inherits-from='widget'>
@@ -279,11 +290,27 @@
279290
</class-type>
280291

281292
<struct-type type-name='widget_menu' original-name='widgets::menu'>
282-
<stl-map name='lines'/>
293+
<stl-map name='lines'>
294+
<key-type type-name='int32_t'/>
295+
<value-type>
296+
<compound>
297+
<stl-string/>
298+
<int8_t comment='placeholder type'/>
299+
</compound>
300+
</value-type>
301+
</stl-map>
283302
<int32_t name='selection'/>
284303
<int32_t name='last_displayheight'/>
285304
<bool name='bleached'/>
286-
<stl-map name='colors'/>
305+
<stl-map name='colors'>
306+
<key-type type-name='int32_t'/>
307+
<value-type>
308+
<compound>
309+
<int32_t/>
310+
<int32_t/>
311+
</compound>
312+
</value-type>
313+
</stl-map>
287314
</struct-type>
288315

289316
<enum-type type-name='interface_breakdown_types'> bay12: InterfaceBreakdownTypes, no base type

df.g_src.enabler.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545
<flag-bit name='convert'/>
4646
</bitfield-type>
4747

48-
<struct-type type-name='texture_fullid'>
48+
<struct-type type-name='texture_fullid' custom-methods='true'>
4949
<int32_t name='texpos'/>
5050
<s-float name='r'/>
5151
<s-float name='g'/>

df.g_src.music_and_sound_g.xml

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,13 @@
2828
-- Unused: Song
2929
-- Unused: SoundType
3030
-- Skipped: musicsound_info - platform-dependent implementation?
31-
-- Unused: music_datast
31+
32+
<struct-type type-name='music_datast'>
33+
<int32_t name='id'/>
34+
<stl-string name='title'/>
35+
<stl-string name='author'/>
36+
</struct-type>
37+
3238
-- Unused: loading_music_filest
3339

3440
<struct-type type-name='musicsoundst'>
@@ -82,10 +88,19 @@
8288
<int32_t name='next_song_id'/>
8389
<int32_t name='next_sound_id'/>
8490

85-
<stl-unordered-map name='loaded_music' comment='unordered_map&lt;std::string, music_datast&gt;'/>
86-
<stl-unordered-map name='music_by_id' comment='unordered_map&lt;int, music_datast&gt;'/>
87-
<stl-unordered-map name='loaded_sounds' comment='unordered_map&lt;std::string, int&gt;'/>
88-
<stl-vector name='loading_files' comment='std::ffuture&lt;loading_music_filest&gt;'/>
91+
<stl-unordered-map name='loaded_music' comment='unordered_map&lt;std::string, music_datast&gt;'>
92+
<key-type type-name='stl-string'/>
93+
<value-type type-name='music_datast'/>
94+
</stl-unordered-map>
95+
<stl-unordered-map name='music_by_id'>
96+
<key-type type-name='int32_t'/>
97+
<value-type type-name='music_datast'/>
98+
</stl-unordered-map>
99+
<stl-unordered-map name='loaded_sounds'>
100+
<key-type type-name='stl-string'/>
101+
<value-type type-name='int32_t'/>
102+
</stl-unordered-map>
103+
<stl-vector name='loading_files' comment='std::future&lt;loading_music_filest&gt;'/>
89104

90105
<pointer name='internal' comment='musicsound_info'/>
91106

df.g_src.renderer_2d.xml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
11
<data-definition>
22
<struct-type type-name='tile_cachest'>
3-
<stl-unordered-map name='tile_cache' comment='unordered_map&lt;texture_fullid, SDL_Texture*\&gt;'/>
3+
<extra-include filename="custom/hash/texture_fullid.h"/>
4+
<stl-unordered-map name='tile_cache'>
5+
<key-type type-name='texture_fullid'/>
6+
<value-type type-name='pointer' comment='SDL_Texture*'/>
7+
</stl-unordered-map>
48
</struct-type>
59

610
<class-type type-name='renderer_2d_base' inherits-from='renderer'>
11+
<extra-include filename="custom/hash/texture_fullid.h"/>
712
<pointer name='window' comment='SDL_Window*'/>
813
<pointer name='sdl_renderer' comment='SDL_Renderer*'/>
914
<pointer name='screen_tex' comment='SDL_Texture*'/>

0 commit comments

Comments
 (0)