# t00098 - Test case for decorator design pattern using static polymorphism ## Config ```yaml diagrams: t00098_class: type: class title: Decorator design pattern with templates and concepts glob: - t00098.cc using_namespace: clanguml::t00098 include: namespaces: - clanguml::t00098 ``` ## Source code File `tests/t00098/t00098.cc` ```cpp #include #include #include namespace clanguml { namespace t00098 { template concept Component = requires(const T &t) { { t.operation() } -> std::convertible_to; }; struct ConcreteComponent { std::string operation() const { return "ConcreteComponent"; } }; template class ConcreteDecoratorA { Inner inner_; public: explicit ConcreteDecoratorA(Inner inner) : inner_(std::move(inner)) { } std::string operation() const { return "ConcreteDecoratorA(" + inner_.operation() + ")"; } std::string added_behavior() const { return "Added behavior A"; } }; template class ConcreteDecoratorB { Inner inner_; public: explicit ConcreteDecoratorB(Inner inner) : inner_(std::move(inner)) { } std::string operation() const { return "ConcreteDecoratorB(" + inner_.operation() + ")"; } void additional_method() const { } }; template class Client { C component_; public: explicit Client(C component) : component_(std::move(component)) { } std::string execute() { return component_.operation(); } }; using BAClient = Client>>; struct R { BAClient client; }; int main() { R r{.client = Client{ ConcreteDecoratorB{ConcreteDecoratorA{ConcreteComponent{}}}}}; std::puts(r.client.execute().c_str()); return 0; } } // namespace t00098 } // namespace clanguml ``` ## Generated PlantUML diagrams ![t00098_class](./t00098_class.svg "Test case for decorator design pattern using static polymorphism") ## Generated Mermaid diagrams ![t00098_class](./t00098_class_mermaid.svg "Test case for decorator design pattern using static polymorphism") ## Generated JSON models ```json { "diagram_type": "class", "elements": [ { "display_name": "Component", "id": "8876837216240248889", "name": "Component", "namespace": "clanguml::t00098", "parameters": [ { "name": "t", "type": "const T &" } ], "source_location": { "column": 9, "file": "t00098.cc", "line": 9, "translation_unit": "t00098.cc" }, "statements": [ "{t.operation()} -> std::convertible_to" ], "type": "concept" }, { "bases": [], "display_name": "ConcreteComponent", "id": "16561016950896338451", "is_abstract": false, "is_nested": false, "is_struct": true, "is_template": false, "is_union": false, "members": [], "methods": [ { "access": "public", "display_name": "operation", "is_const": true, "is_consteval": false, "is_constexpr": false, "is_constructor": false, "is_copy_assignment": false, "is_coroutine": false, "is_defaulted": false, "is_deleted": false, "is_move_assignment": false, "is_noexcept": false, "is_operator": false, "is_pure_virtual": false, "is_static": false, "is_virtual": false, "name": "operation", "parameters": [], "source_location": { "column": 17, "file": "t00098.cc", "line": 14, "translation_unit": "t00098.cc" }, "template_parameters": [], "type": "std::string" } ], "name": "ConcreteComponent", "namespace": "clanguml::t00098", "source_location": { "column": 8, "file": "t00098.cc", "line": 13, "translation_unit": "t00098.cc" }, "template_parameters": [], "type": "class" }, { "bases": [], "display_name": "ConcreteDecoratorA", "id": "5213864195876733834", "is_abstract": false, "is_nested": false, "is_struct": false, "is_template": true, "is_union": false, "members": [ { "access": "private", "is_static": false, "name": "inner_", "source_location": { "column": 11, "file": "t00098.cc", "line": 18, "translation_unit": "t00098.cc" }, "type": "Inner" } ], "methods": [ { "access": "public", "display_name": "ConcreteDecoratorA", "is_const": false, "is_consteval": false, "is_constexpr": false, "is_constructor": true, "is_copy_assignment": false, "is_coroutine": false, "is_defaulted": false, "is_deleted": false, "is_move_assignment": false, "is_noexcept": false, "is_operator": false, "is_pure_virtual": false, "is_static": false, "is_virtual": false, "name": "ConcreteDecoratorA", "parameters": [ { "name": "inner", "type": "Inner" } ], "source_location": { "column": 14, "file": "t00098.cc", "line": 21, "translation_unit": "t00098.cc" }, "template_parameters": [], "type": "void" }, { "access": "public", "display_name": "operation", "is_const": true, "is_consteval": false, "is_constexpr": false, "is_constructor": false, "is_copy_assignment": false, "is_coroutine": false, "is_defaulted": false, "is_deleted": false, "is_move_assignment": false, "is_noexcept": false, "is_operator": false, "is_pure_virtual": false, "is_static": false, "is_virtual": false, "name": "operation", "parameters": [], "source_location": { "column": 17, "file": "t00098.cc", "line": 26, "translation_unit": "t00098.cc" }, "template_parameters": [], "type": "std::string" }, { "access": "public", "display_name": "added_behavior", "is_const": true, "is_consteval": false, "is_constexpr": false, "is_constructor": false, "is_copy_assignment": false, "is_coroutine": false, "is_defaulted": false, "is_deleted": false, "is_move_assignment": false, "is_noexcept": false, "is_operator": false, "is_pure_virtual": false, "is_static": false, "is_virtual": false, "name": "added_behavior", "parameters": [], "source_location": { "column": 17, "file": "t00098.cc", "line": 31, "translation_unit": "t00098.cc" }, "template_parameters": [], "type": "std::string" } ], "name": "ConcreteDecoratorA", "namespace": "clanguml::t00098", "source_location": { "column": 34, "file": "t00098.cc", "line": 17, "translation_unit": "t00098.cc" }, "template_parameters": [ { "is_variadic": false, "kind": "template_type", "name": "Inner", "template_parameters": [] } ], "type": "class" }, { "bases": [], "display_name": "ConcreteDecoratorB", "id": "5066890982799846966", "is_abstract": false, "is_nested": false, "is_struct": false, "is_template": true, "is_union": false, "members": [ { "access": "private", "is_static": false, "name": "inner_", "source_location": { "column": 11, "file": "t00098.cc", "line": 35, "translation_unit": "t00098.cc" }, "type": "Inner" } ], "methods": [ { "access": "public", "display_name": "ConcreteDecoratorB", "is_const": false, "is_consteval": false, "is_constexpr": false, "is_constructor": true, "is_copy_assignment": false, "is_coroutine": false, "is_defaulted": false, "is_deleted": false, "is_move_assignment": false, "is_noexcept": false, "is_operator": false, "is_pure_virtual": false, "is_static": false, "is_virtual": false, "name": "ConcreteDecoratorB", "parameters": [ { "name": "inner", "type": "Inner" } ], "source_location": { "column": 14, "file": "t00098.cc", "line": 38, "translation_unit": "t00098.cc" }, "template_parameters": [], "type": "void" }, { "access": "public", "display_name": "operation", "is_const": true, "is_consteval": false, "is_constexpr": false, "is_constructor": false, "is_copy_assignment": false, "is_coroutine": false, "is_defaulted": false, "is_deleted": false, "is_move_assignment": false, "is_noexcept": false, "is_operator": false, "is_pure_virtual": false, "is_static": false, "is_virtual": false, "name": "operation", "parameters": [], "source_location": { "column": 17, "file": "t00098.cc", "line": 43, "translation_unit": "t00098.cc" }, "template_parameters": [], "type": "std::string" }, { "access": "public", "display_name": "additional_method", "is_const": true, "is_consteval": false, "is_constexpr": false, "is_constructor": false, "is_copy_assignment": false, "is_coroutine": false, "is_defaulted": false, "is_deleted": false, "is_move_assignment": false, "is_noexcept": false, "is_operator": false, "is_pure_virtual": false, "is_static": false, "is_virtual": false, "name": "additional_method", "parameters": [], "source_location": { "column": 10, "file": "t00098.cc", "line": 48, "translation_unit": "t00098.cc" }, "template_parameters": [], "type": "void" } ], "name": "ConcreteDecoratorB", "namespace": "clanguml::t00098", "source_location": { "column": 34, "file": "t00098.cc", "line": 34, "translation_unit": "t00098.cc" }, "template_parameters": [ { "is_variadic": false, "kind": "template_type", "name": "Inner", "template_parameters": [] } ], "type": "class" }, { "bases": [], "display_name": "Client", "id": "15308488410191553172", "is_abstract": false, "is_nested": false, "is_struct": false, "is_template": true, "is_union": false, "members": [ { "access": "private", "is_static": false, "name": "component_", "source_location": { "column": 7, "file": "t00098.cc", "line": 52, "translation_unit": "t00098.cc" }, "type": "C" } ], "methods": [ { "access": "public", "display_name": "Client", "is_const": false, "is_consteval": false, "is_constexpr": false, "is_constructor": true, "is_copy_assignment": false, "is_coroutine": false, "is_defaulted": false, "is_deleted": false, "is_move_assignment": false, "is_noexcept": false, "is_operator": false, "is_pure_virtual": false, "is_static": false, "is_virtual": false, "name": "Client", "parameters": [ { "name": "component", "type": "C" } ], "source_location": { "column": 14, "file": "t00098.cc", "line": 55, "translation_unit": "t00098.cc" }, "template_parameters": [], "type": "void" }, { "access": "public", "display_name": "execute", "is_const": false, "is_consteval": false, "is_constexpr": false, "is_constructor": false, "is_copy_assignment": false, "is_coroutine": false, "is_defaulted": false, "is_deleted": false, "is_move_assignment": false, "is_noexcept": false, "is_operator": false, "is_pure_virtual": false, "is_static": false, "is_virtual": false, "name": "execute", "parameters": [], "source_location": { "column": 17, "file": "t00098.cc", "line": 60, "translation_unit": "t00098.cc" }, "template_parameters": [], "type": "std::string" } ], "name": "Client", "namespace": "clanguml::t00098", "source_location": { "column": 30, "file": "t00098.cc", "line": 51, "translation_unit": "t00098.cc" }, "template_parameters": [ { "is_variadic": false, "kind": "template_type", "name": "C", "template_parameters": [] } ], "type": "class" }, { "bases": [], "display_name": "ConcreteDecoratorA", "id": "8905995241130596975", "is_abstract": false, "is_nested": false, "is_struct": false, "is_template": true, "is_union": false, "members": [], "methods": [], "name": "ConcreteDecoratorA", "namespace": "clanguml::t00098", "source_location": { "column": 14, "file": "t00098.cc", "line": 67, "translation_unit": "t00098.cc" }, "template_parameters": [ { "is_variadic": false, "kind": "argument", "template_parameters": [], "type": "ConcreteComponent" } ], "type": "class" }, { "bases": [], "display_name": "ConcreteDecoratorB>", "id": "3285186541502255684", "is_abstract": false, "is_nested": false, "is_struct": false, "is_template": true, "is_union": false, "members": [], "methods": [], "name": "ConcreteDecoratorB", "namespace": "clanguml::t00098", "source_location": { "column": 14, "file": "t00098.cc", "line": 67, "translation_unit": "t00098.cc" }, "template_parameters": [ { "is_variadic": false, "kind": "argument", "template_parameters": [ { "is_variadic": false, "kind": "argument", "template_parameters": [], "type": "clanguml::t00098::ConcreteComponent" } ], "type": "ConcreteDecoratorA" } ], "type": "class" }, { "bases": [], "display_name": "Client>>", "id": "11754703513508804720", "is_abstract": false, "is_nested": false, "is_struct": false, "is_template": true, "is_union": false, "members": [], "methods": [], "name": "Client", "namespace": "clanguml::t00098", "source_location": { "column": 14, "file": "t00098.cc", "line": 67, "translation_unit": "t00098.cc" }, "template_parameters": [ { "is_variadic": false, "kind": "argument", "template_parameters": [ { "is_variadic": false, "kind": "argument", "template_parameters": [ { "is_variadic": false, "kind": "argument", "template_parameters": [], "type": "clanguml::t00098::ConcreteComponent" } ], "type": "clanguml::t00098::ConcreteDecoratorA" } ], "type": "ConcreteDecoratorB" } ], "type": "class" }, { "bases": [], "display_name": "R", "id": "9384409517498194198", "is_abstract": false, "is_nested": false, "is_struct": true, "is_template": false, "is_union": false, "members": [ { "access": "public", "is_static": false, "name": "client", "source_location": { "column": 14, "file": "t00098.cc", "line": 67, "translation_unit": "t00098.cc" }, "type": "BAClient" } ], "methods": [], "name": "R", "namespace": "clanguml::t00098", "source_location": { "column": 8, "file": "t00098.cc", "line": 66, "translation_unit": "t00098.cc" }, "template_parameters": [], "type": "class" } ], "name": "t00098_class", "package_type": "namespace", "relationships": [ { "destination": "8876837216240248889", "label": "Inner", "source": "5213864195876733834", "type": "constraint" }, { "destination": "8876837216240248889", "label": "Inner", "source": "5066890982799846966", "type": "constraint" }, { "destination": "8876837216240248889", "label": "C", "source": "15308488410191553172", "type": "constraint" }, { "access": "public", "destination": "16561016950896338451", "source": "8905995241130596975", "type": "dependency" }, { "access": "public", "destination": "5213864195876733834", "source": "8905995241130596975", "type": "instantiation" }, { "access": "public", "destination": "8905995241130596975", "source": "3285186541502255684", "type": "dependency" }, { "access": "public", "destination": "5066890982799846966", "source": "3285186541502255684", "type": "instantiation" }, { "access": "public", "destination": "3285186541502255684", "source": "11754703513508804720", "type": "dependency" }, { "access": "public", "destination": "15308488410191553172", "source": "11754703513508804720", "type": "instantiation" }, { "access": "public", "destination": "11754703513508804720", "label": "client", "source": "9384409517498194198", "type": "aggregation" } ], "title": "Decorator design pattern with templates and concepts", "using_namespace": "clanguml::t00098" } ``` ## Generated GraphML models ```xml clanguml::t00098 concept ]]> class false class ]]> true class ]]> true class ]]> true class ]]> true class >]]> true class >>]]> true class false constraint Inner constraint Inner constraint C dependency public instantiation public dependency public instantiation public dependency public instantiation public aggregation client public ```