# t00101 - Test case for strategy design pattern using static polymorphism ## Config ```yaml diagrams: t00101_class: type: class glob: - t00101.cc include: namespaces: - clanguml::t00101 using_namespace: clanguml::t00101 ``` ## Source code File `tests/t00101/t00101.cc` ```cpp #include #include #include #include namespace clanguml { namespace t00101 { // Strategy pattern implementation using static polymorphism with C++20 concepts // Example context: Text processing with different formatting strategies // C++20 concept for Strategy interface using static polymorphism template concept FormattingStrategyConcept = requires(T t, const std::string &text) { { t.format(text) } -> std::same_as; { t.get_name() } -> std::same_as; }; // Template base for concrete strategies (CRTP) template class FormattingStrategyBase { public: std::string format(const std::string &text) { return static_cast(this)->format_impl(text); } std::string get_name() { return static_cast(this)->get_name_impl(); } protected: FormattingStrategyBase() = default; }; // Concrete Strategy for plain text formatting class PlainTextStrategy : public FormattingStrategyBase { public: std::string format_impl(const std::string &text) { return text; } std::string get_name_impl() { return "PlainText"; } }; // Concrete Strategy for markdown formatting class MarkdownStrategy : public FormattingStrategyBase { public: std::string format_impl(const std::string &text) { return "# " + text + "\n"; } std::string get_name_impl() { return "Markdown"; } }; // Context template using static polymorphism and C++20 concepts template class TextProcessor { public: explicit TextProcessor(StrategyType &strategy) : strategy_(strategy) { } std::string process_text(const std::string &text) { return strategy_.format(text); } std::string get_strategy_name() { return strategy_.get_name(); } void set_strategy(StrategyType &new_strategy) { strategy_ = new_strategy; } private: StrategyType &strategy_; }; // Client code demonstrating the Strategy pattern with static polymorphism class DocumentProcessor { public: std::string process_as_plain_text(const std::string &content) { PlainTextStrategy strategy; TextProcessor processor(strategy); return processor.process_text(content); } std::string process_as_markdown(const std::string &content) { MarkdownStrategy strategy; TextProcessor processor(strategy); return processor.process_text(content); } template std::string process_with_custom_strategy( const std::string &content, StrategyType &strategy) { TextProcessor processor(strategy); return processor.process_text(content); } }; // Factory for creating different strategies class StrategyFactory { public: enum class StrategyType { PlainText, Markdown }; static std::unique_ptr create_plain_text_strategy() { return std::make_unique(); } static std::unique_ptr create_markdown_strategy() { return std::make_unique(); } }; } // namespace t00101 } // namespace clanguml ``` ## Generated PlantUML diagrams ![t00101_class](./t00101_class.svg "Test case for strategy design pattern using static polymorphism") ## Generated Mermaid diagrams ![t00101_class](./t00101_class_mermaid.svg "Test case for strategy design pattern using static polymorphism") ## Generated JSON models ```json { "diagram_type": "class", "elements": [ { "display_name": "FormattingStrategyConcept", "id": "17415094877193714719", "name": "FormattingStrategyConcept", "namespace": "clanguml::t00101", "parameters": [ { "name": "t", "type": "T" }, { "name": "text", "type": "const std::string &" } ], "source_location": { "column": 9, "file": "t00101.cc", "line": 15, "translation_unit": "t00101.cc" }, "statements": [ "{t.format(text)} -> std::same_as", "{t.get_name()} -> std::same_as" ], "type": "concept" }, { "bases": [], "display_name": "FormattingStrategyBase", "id": "14112435091745763149", "is_abstract": false, "is_nested": false, "is_struct": false, "is_template": true, "is_union": false, "members": [], "methods": [ { "access": "public", "display_name": "format", "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": "format", "parameters": [ { "name": "text", "type": "const std::string &" } ], "source_location": { "column": 17, "file": "t00101.cc", "line": 23, "translation_unit": "t00101.cc" }, "template_parameters": [], "type": "std::string" }, { "access": "public", "display_name": "get_name", "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": "get_name", "parameters": [], "source_location": { "column": 17, "file": "t00101.cc", "line": 28, "translation_unit": "t00101.cc" }, "template_parameters": [], "type": "std::string" }, { "access": "protected", "display_name": "FormattingStrategyBase", "is_const": false, "is_consteval": false, "is_constexpr": false, "is_constructor": true, "is_copy_assignment": false, "is_coroutine": false, "is_defaulted": true, "is_deleted": false, "is_move_assignment": false, "is_noexcept": false, "is_operator": false, "is_pure_virtual": false, "is_static": false, "is_virtual": false, "name": "FormattingStrategyBase", "parameters": [], "source_location": { "column": 5, "file": "t00101.cc", "line": 34, "translation_unit": "t00101.cc" }, "template_parameters": [], "type": "void" } ], "name": "FormattingStrategyBase", "namespace": "clanguml::t00101", "source_location": { "column": 35, "file": "t00101.cc", "line": 21, "translation_unit": "t00101.cc" }, "template_parameters": [ { "is_variadic": false, "kind": "template_type", "name": "Derived", "template_parameters": [] } ], "type": "class" }, { "bases": [], "display_name": "FormattingStrategyBase", "id": "3017018330506343241", "is_abstract": false, "is_nested": false, "is_struct": false, "is_template": true, "is_union": false, "members": [], "methods": [], "name": "FormattingStrategyBase", "namespace": "clanguml::t00101", "source_location": { "column": 7, "file": "t00101.cc", "line": 38, "translation_unit": "t00101.cc" }, "template_parameters": [ { "is_variadic": false, "kind": "argument", "template_parameters": [], "type": "PlainTextStrategy" } ], "type": "class" }, { "bases": [ { "access": "public", "id": "3017018330506343241", "is_virtual": false } ], "display_name": "PlainTextStrategy", "id": "5704419823270881204", "is_abstract": false, "is_nested": false, "is_struct": false, "is_template": false, "is_union": false, "members": [], "methods": [ { "access": "public", "display_name": "format_impl", "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": "format_impl", "parameters": [ { "name": "text", "type": "const std::string &" } ], "source_location": { "column": 17, "file": "t00101.cc", "line": 40, "translation_unit": "t00101.cc" }, "template_parameters": [], "type": "std::string" }, { "access": "public", "display_name": "get_name_impl", "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": "get_name_impl", "parameters": [], "source_location": { "column": 17, "file": "t00101.cc", "line": 42, "translation_unit": "t00101.cc" }, "template_parameters": [], "type": "std::string" } ], "name": "PlainTextStrategy", "namespace": "clanguml::t00101", "source_location": { "column": 7, "file": "t00101.cc", "line": 38, "translation_unit": "t00101.cc" }, "template_parameters": [], "type": "class" }, { "bases": [], "display_name": "FormattingStrategyBase", "id": "7699995325586521439", "is_abstract": false, "is_nested": false, "is_struct": false, "is_template": true, "is_union": false, "members": [], "methods": [], "name": "FormattingStrategyBase", "namespace": "clanguml::t00101", "source_location": { "column": 7, "file": "t00101.cc", "line": 46, "translation_unit": "t00101.cc" }, "template_parameters": [ { "is_variadic": false, "kind": "argument", "template_parameters": [], "type": "MarkdownStrategy" } ], "type": "class" }, { "bases": [ { "access": "public", "id": "7699995325586521439", "is_virtual": false } ], "display_name": "MarkdownStrategy", "id": "807604561818921537", "is_abstract": false, "is_nested": false, "is_struct": false, "is_template": false, "is_union": false, "members": [], "methods": [ { "access": "public", "display_name": "format_impl", "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": "format_impl", "parameters": [ { "name": "text", "type": "const std::string &" } ], "source_location": { "column": 17, "file": "t00101.cc", "line": 48, "translation_unit": "t00101.cc" }, "template_parameters": [], "type": "std::string" }, { "access": "public", "display_name": "get_name_impl", "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": "get_name_impl", "parameters": [], "source_location": { "column": 17, "file": "t00101.cc", "line": 53, "translation_unit": "t00101.cc" }, "template_parameters": [], "type": "std::string" } ], "name": "MarkdownStrategy", "namespace": "clanguml::t00101", "source_location": { "column": 7, "file": "t00101.cc", "line": 46, "translation_unit": "t00101.cc" }, "template_parameters": [], "type": "class" }, { "bases": [], "display_name": "TextProcessor", "id": "11974992586374228230", "is_abstract": false, "is_nested": false, "is_struct": false, "is_template": true, "is_union": false, "members": [ { "access": "private", "is_static": false, "name": "strategy_", "source_location": { "column": 19, "file": "t00101.cc", "line": 74, "translation_unit": "t00101.cc" }, "type": "StrategyType &" } ], "methods": [ { "access": "public", "display_name": "TextProcessor", "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": "TextProcessor", "parameters": [ { "name": "strategy", "type": "StrategyType &" } ], "source_location": { "column": 14, "file": "t00101.cc", "line": 59, "translation_unit": "t00101.cc" }, "template_parameters": [], "type": "void" }, { "access": "public", "display_name": "process_text", "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": "process_text", "parameters": [ { "name": "text", "type": "const std::string &" } ], "source_location": { "column": 17, "file": "t00101.cc", "line": 64, "translation_unit": "t00101.cc" }, "template_parameters": [], "type": "std::string" }, { "access": "public", "display_name": "get_strategy_name", "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": "get_strategy_name", "parameters": [], "source_location": { "column": 17, "file": "t00101.cc", "line": 69, "translation_unit": "t00101.cc" }, "template_parameters": [], "type": "std::string" }, { "access": "public", "display_name": "set_strategy", "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": "set_strategy", "parameters": [ { "name": "new_strategy", "type": "StrategyType &" } ], "source_location": { "column": 10, "file": "t00101.cc", "line": 71, "translation_unit": "t00101.cc" }, "template_parameters": [], "type": "void" } ], "name": "TextProcessor", "namespace": "clanguml::t00101", "source_location": { "column": 57, "file": "t00101.cc", "line": 57, "translation_unit": "t00101.cc" }, "template_parameters": [ { "is_variadic": false, "kind": "template_type", "name": "StrategyType", "template_parameters": [] } ], "type": "class" }, { "bases": [], "display_name": "DocumentProcessor", "id": "5538239167729960401", "is_abstract": false, "is_nested": false, "is_struct": false, "is_template": false, "is_union": false, "members": [], "methods": [ { "access": "public", "display_name": "process_as_plain_text", "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": "process_as_plain_text", "parameters": [ { "name": "content", "type": "const std::string &" } ], "source_location": { "column": 17, "file": "t00101.cc", "line": 80, "translation_unit": "t00101.cc" }, "template_parameters": [], "type": "std::string" }, { "access": "public", "display_name": "process_as_markdown", "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": "process_as_markdown", "parameters": [ { "name": "content", "type": "const std::string &" } ], "source_location": { "column": 17, "file": "t00101.cc", "line": 87, "translation_unit": "t00101.cc" }, "template_parameters": [], "type": "std::string" }, { "access": "public", "display_name": "process_with_custom_strategy", "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": "process_with_custom_strategy", "parameters": [ { "name": "content", "type": "const std::string &" }, { "name": "strategy", "type": "StrategyType &" } ], "template_parameters": [ { "is_variadic": false, "kind": "template_type", "name": "StrategyType", "template_parameters": [] } ], "type": "std::string" } ], "name": "DocumentProcessor", "namespace": "clanguml::t00101", "source_location": { "column": 7, "file": "t00101.cc", "line": 78, "translation_unit": "t00101.cc" }, "template_parameters": [], "type": "class" }, { "bases": [], "display_name": "StrategyFactory", "id": "12978743466082846464", "is_abstract": false, "is_nested": false, "is_struct": false, "is_template": false, "is_union": false, "members": [], "methods": [ { "access": "public", "display_name": "create_plain_text_strategy", "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": true, "is_virtual": false, "name": "create_plain_text_strategy", "parameters": [], "source_location": { "column": 47, "file": "t00101.cc", "line": 108, "translation_unit": "t00101.cc" }, "template_parameters": [], "type": "std::unique_ptr" }, { "access": "public", "display_name": "create_markdown_strategy", "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": true, "is_virtual": false, "name": "create_markdown_strategy", "parameters": [], "source_location": { "column": 46, "file": "t00101.cc", "line": 113, "translation_unit": "t00101.cc" }, "template_parameters": [], "type": "std::unique_ptr" } ], "name": "StrategyFactory", "namespace": "clanguml::t00101", "source_location": { "column": 7, "file": "t00101.cc", "line": 104, "translation_unit": "t00101.cc" }, "template_parameters": [], "type": "class" }, { "constants": [ "PlainText", "Markdown" ], "display_name": "StrategyFactory::StrategyType", "id": "5068471644211142180", "is_nested": true, "name": "StrategyFactory##StrategyType", "namespace": "clanguml::t00101", "source_location": { "column": 16, "file": "t00101.cc", "line": 106, "translation_unit": "t00101.cc" }, "type": "enum" } ], "name": "t00101_class", "package_type": "namespace", "relationships": [ { "access": "public", "destination": "5704419823270881204", "source": "3017018330506343241", "type": "dependency" }, { "access": "public", "destination": "14112435091745763149", "source": "3017018330506343241", "type": "instantiation" }, { "access": "public", "destination": "3017018330506343241", "source": "5704419823270881204", "type": "extension" }, { "access": "public", "destination": "807604561818921537", "source": "7699995325586521439", "type": "dependency" }, { "access": "public", "destination": "14112435091745763149", "source": "7699995325586521439", "type": "instantiation" }, { "access": "public", "destination": "7699995325586521439", "source": "807604561818921537", "type": "extension" }, { "destination": "17415094877193714719", "label": "StrategyType", "source": "11974992586374228230", "type": "constraint" }, { "access": "public", "destination": "5704419823270881204", "source": "12978743466082846464", "type": "dependency" }, { "access": "public", "destination": "807604561818921537", "source": "12978743466082846464", "type": "dependency" }, { "access": "public", "destination": "12978743466082846464", "source": "5068471644211142180", "type": "containment" } ], "using_namespace": "clanguml::t00101" } ``` ## Generated GraphML models ```xml clanguml::t00101 concept ]]> class ]]> true class ]]> true class false class ]]> true class false class ]]> true class false class false enum dependency public instantiation public extension public dependency public instantiation public extension public constraint StrategyType dependency public dependency public containment public ```