Simplify the destructor of generated C++ components

Similar to the parent commit, avoid creating an array of item refs and pass the item tree instead
to a run-time helper function.
This commit is contained in:
Simon Hausmann 2021-11-01 10:19:17 +01:00
parent 67579ec560
commit 096fbab93d
3 changed files with 21 additions and 23 deletions

View file

@ -113,9 +113,11 @@ public:
float scale_factor() const { return sixtyfps_windowrc_get_scale_factor(&inner); }
void set_scale_factor(float value) const { sixtyfps_windowrc_set_scale_factor(&inner, value); }
void free_graphics_resources(const sixtyfps::Slice<ItemRef> &items) const
template<typename Component, typename ItemTree>
void free_graphics_resources(Component *c, ItemTree items) const
{
cbindgen_private::sixtyfps_windowrc_free_graphics_resources(&inner, &items);
cbindgen_private::sixtyfps_component_free_item_graphics_resources(
vtable::VRef<ComponentVTable> { &Component::static_vtable, c }, items, &inner);
}
void set_focus_item(const ComponentRc &component_rc, uintptr_t item_index)

View file

@ -1097,7 +1097,6 @@ fn generate_component(
let mut repeated_input_branch = vec![];
let mut repeater_layout_code = vec![];
let mut tree_array = vec![];
let mut item_names_and_vt_symbols = vec![];
let mut repeater_count = 0;
#[derive(Default)]
@ -1146,9 +1145,6 @@ fn generate_component(
parent_index,
));
}
let item_field_name = format!("{}{}", state.field_prefix, ident(&item.id));
item_names_and_vt_symbols
.push((item_field_name, item.base_type.as_native().cpp_vtable_getter.clone()));
}
},
|state, sub_component, item_rc| {
@ -1265,23 +1261,8 @@ fn generate_component(
destructor.push("if (!parent) return;".to_owned())
}
if !item_names_and_vt_symbols.is_empty() {
destructor.push("sixtyfps::private_api::ItemRef items[] = {".into());
destructor.push(
item_names_and_vt_symbols
.iter()
.map(|(item_name, vt_symbol)| {
format!(
"{{ {vt}, const_cast<decltype(this->{id})*>(&this->{id}) }}",
id = item_name,
vt = vt_symbol
)
})
.join(","),
);
destructor.push("};".into());
destructor.push("m_window.window_handle().free_graphics_resources(sixtyfps::Slice<sixtyfps::private_api::ItemRef>{items, std::size(items)});".into());
}
destructor
.push("m_window.window_handle().free_graphics_resources(this, item_tree());".into());
component_struct.members.push((
Access::Public,

View file

@ -113,4 +113,19 @@ pub(crate) mod ffi {
window,
)
}
/// Free the backend graphics resources allocated by the component's items.
#[no_mangle]
pub unsafe extern "C" fn sixtyfps_component_free_item_graphics_resources(
component: ComponentRefPin,
item_tree: Slice<ItemTreeNode<u8>>,
window_handle: *const crate::window::ffi::WindowRcOpaque,
) {
let window = &*(window_handle as *const WindowRc);
super::free_component_item_graphics_resources(
core::pin::Pin::new_unchecked(&*(component.as_ptr() as *const u8)),
item_tree.as_slice(),
window,
)
}
}