From 4df7e6added53487bda7a40df383d38f481c88bf Mon Sep 17 00:00:00 2001 From: Norman Feske Date: Fri, 5 Nov 2021 15:24:15 +0100 Subject: [PATCH] util/list_model.h: Add update_list_model_from_xml The new 'update_list_model_from_xml' function template simplifies the use of the list model utility by alleviating the need for implementing a custom policy class for each model. Instead, the transformation is done using a few lambda functions given directly as arguments. Issue #4317 --- repos/base/include/util/list_model.h | 55 +++++++++++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-) diff --git a/repos/base/include/util/list_model.h b/repos/base/include/util/list_model.h index 5f950ac6d1..5334f60228 100644 --- a/repos/base/include/util/list_model.h +++ b/repos/base/include/util/list_model.h @@ -24,7 +24,18 @@ #include #include -namespace Genode { template class List_model; } +namespace Genode { + + template class List_model; + + template + static inline void update_list_model_from_xml(List_model &, + Xml_node const &, + CREATE_FN const &, + DESTROY_FN const &, + UPDATE_FN const &); +} template @@ -245,4 +256,46 @@ struct Genode::List_model::Update_policy static bool node_is_element(Xml_node) { return true; } }; + +template +void Genode::update_list_model_from_xml(List_model &model, + Xml_node const &xml, + CREATE_FN const &create, + DESTROY_FN const &destroy, + UPDATE_FN const &update) +{ + struct Model_update_policy : List_model::Update_policy + { + CREATE_FN const &_create_fn; + DESTROY_FN const &_destroy_fn; + UPDATE_FN const &_update_fn; + + Model_update_policy(CREATE_FN const &create_fn, + DESTROY_FN const &destroy_fn, + UPDATE_FN const &update_fn) + : + _create_fn(create_fn), _destroy_fn(destroy_fn), _update_fn(update_fn) + { } + + void destroy_element(NODE &node) { _destroy_fn(node); } + + NODE &create_element(Xml_node xml) { return _create_fn(xml); } + + void update_element(NODE &node, Xml_node xml) { _update_fn(node, xml); } + + static bool element_matches_xml_node(NODE const &node, Xml_node xml) + { + return node.matches(xml); + } + + static bool node_is_element(Xml_node node) + { + return NODE::type_matches(node); + } + + } policy(create, destroy, update); + + model.update_from_xml(policy, xml); +} + #endif /* _INCLUDE__UTIL__LIST_MODEL_H_ */