# t20044 - Test case for template method call expressions with callables ## Config ```yaml add_compile_flags: - -fparse-all-comments diagrams: t20044_sequence: type: sequence glob: - t20044.cc type_aliases: "clanguml::t20044::detail::expected": result_t generate_message_comments: true include: namespaces: - clanguml::t20044 exclude: namespaces: - clanguml::t20044::detail2 using_namespace: clanguml::t20044 from: - function: "clanguml::t20044::tmain()" ``` ## Source code File `tests/t20044/t20044.cc` ```cpp // #include "include/expected.hpp" #include #include #include namespace clanguml { namespace t20044 { enum class error { OK, FAIL }; namespace detail { // Trivial std::expected mock-up just for testing calls through lambda // expressions passed as arguments to methods template class expected { private: std::optional value_; std::optional error_; public: explicit expected(V v) : value_{std::move(v)} { } explicit expected(E e) : error_{std::move(e)} { } const auto &value() const { return *value_; } const auto &error() const { return *error_; } template auto and_then(F &&f) && { if (value_) return f(*value_); return *this; } }; } // namespace detail namespace detail2 { template void run(F &&f) { f(); } } // namespace detail2 using result_t = detail::expected; struct A { auto a() const { } auto a1() const { return result_t{10}; } auto a2(int arg) const { return result_t{arg + 1}; } auto a4(int arg) const { return result_t{arg + 1}; } void a5() { } }; auto a3(int arg) { return result_t{arg + 1}; } struct R { template R(F &&f) { f(); } }; int tmain() { A a; // Call to template constructor with callable parameter and lambda // expression as argument R r([&a]() { a.a(); }); std::function a4_wrapper = &A::a4; std::function a4_wrapper_to_a = std::bind(a4_wrapper, a, std::placeholders::_1); // The message to detail2::run() is skipped due to exclude filter, however // the call to lambda and A::a5() is rendered // TODO: Add some marker to highlight that this is not a direct call detail2::run([&]() { a.a5(); }); return a .a1() // Call to a template method accepting a callable with lambda expression // as argument, fully tracked showing method's activity and .and_then([&](auto &&arg) { return a.a2(arg); }) // TODO: Call to a method accepting a callable with function pointer // as argument .and_then(a3) // TODO: Call to a method accepting a callable with std::function as // argument .and_then(a4_wrapper_to_a) .value(); } } } ``` ## Generated PlantUML diagrams ![t20044_sequence](./t20044_sequence.svg "Test case for template method call expressions with callables") ## Generated Mermaid diagrams ![t20044_sequence](./t20044_sequence_mermaid.svg "Test case for template method call expressions with callables") ## Generated JSON models ```json { "diagram_type": "sequence", "name": "t20044_sequence", "participants": [ { "display_name": "tmain()", "full_name": "clanguml::t20044::tmain()", "id": "252888248193934644", "name": "tmain", "namespace": "clanguml::t20044", "source_location": { "column": 5, "file": "t20044.cc", "line": 68, "translation_unit": "t20044.cc" }, "type": "function" }, { "activities": [ { "display_name": "R((lambda at t20044.cc:74:9) &&)", "full_name": "clanguml::t20044::R::R((lambda at t20044.cc:74:9) &&)", "id": "2121949343931231437", "name": "R", "namespace": "", "source_location": { "column": 27, "file": "t20044.cc", "line": 65, "translation_unit": "t20044.cc" }, "type": "method" } ], "display_name": "R", "full_name": "clanguml::t20044::R", "id": "1556111147598935846", "name": "R", "namespace": "clanguml::t20044", "source_location": { "column": 8, "file": "t20044.cc", "line": 64, "translation_unit": "t20044.cc" }, "type": "class" }, { "activities": [ { "display_name": "operator()() const", "full_name": "clanguml::t20044::tmain()::(lambda t20044.cc:74:9)::operator()() const", "id": "818357152220364831", "name": "operator()", "namespace": "", "type": "method" } ], "display_name": "tmain()::(lambda t20044.cc:74:9)", "full_name": "clanguml::t20044::tmain()::(lambda t20044.cc:74:9)", "id": "731168008522991712", "name": "tmain()::(lambda t20044.cc:74:9)", "namespace": "clanguml::t20044", "source_location": { "column": 9, "file": "t20044.cc", "line": 74, "translation_unit": "t20044.cc" }, "type": "lambda" }, { "activities": [ { "display_name": "a() const", "full_name": "clanguml::t20044::A::a() const", "id": "853950074322224524", "name": "a", "namespace": "", "source_location": { "column": 10, "file": "t20044.cc", "line": 51, "translation_unit": "t20044.cc" }, "type": "method" }, { "display_name": "a5()", "full_name": "clanguml::t20044::A::a5()", "id": "1743691164520385657", "name": "a5", "namespace": "", "source_location": { "column": 10, "file": "t20044.cc", "line": 59, "translation_unit": "t20044.cc" }, "type": "method" }, { "display_name": "a1() const", "full_name": "clanguml::t20044::A::a1() const", "id": "701399225037526851", "name": "a1", "namespace": "", "source_location": { "column": 10, "file": "t20044.cc", "line": 53, "translation_unit": "t20044.cc" }, "type": "method" }, { "display_name": "a2(int) const", "full_name": "clanguml::t20044::A::a2(int) const", "id": "85144570008244024", "name": "a2", "namespace": "", "source_location": { "column": 10, "file": "t20044.cc", "line": 55, "translation_unit": "t20044.cc" }, "type": "method" } ], "display_name": "A", "full_name": "clanguml::t20044::A", "id": "1026615617828083132", "name": "A", "namespace": "clanguml::t20044", "source_location": { "column": 8, "file": "t20044.cc", "line": 50, "translation_unit": "t20044.cc" }, "type": "class" }, { "activities": [ { "display_name": "operator()() const", "full_name": "clanguml::t20044::tmain()::(lambda t20044.cc:84:18)::operator()() const", "id": "436096372302626180", "name": "operator()", "namespace": "", "type": "method" } ], "display_name": "tmain()::(lambda t20044.cc:84:18)", "full_name": "clanguml::t20044::tmain()::(lambda t20044.cc:84:18)", "id": "1462639563075674191", "name": "tmain()::(lambda t20044.cc:84:18)", "namespace": "clanguml::t20044", "source_location": { "column": 18, "file": "t20044.cc", "line": 84, "translation_unit": "t20044.cc" }, "type": "lambda" }, { "activities": [ { "display_name": "expected(int)", "full_name": "clanguml::t20044::detail::expected::expected(int)", "id": "1539466150622485129", "name": "expected", "namespace": "", "source_location": { "column": 14, "file": "t20044.cc", "line": 21, "translation_unit": "t20044.cc" }, "type": "method" }, { "display_name": "and_then((lambda at t20044.cc:90:19) &&)", "full_name": "clanguml::t20044::detail::expected::and_then((lambda at t20044.cc:90:19) &&)", "id": "377073498530267347", "name": "and_then", "namespace": "", "source_location": { "column": 29, "file": "t20044.cc", "line": 34, "translation_unit": "t20044.cc" }, "type": "method" }, { "display_name": "and_then(result_t (&)(int))", "full_name": "clanguml::t20044::detail::expected::and_then(result_t (&)(int))", "id": "1974891758151777473", "name": "and_then", "namespace": "", "source_location": { "column": 29, "file": "t20044.cc", "line": 34, "translation_unit": "t20044.cc" }, "type": "method" }, { "display_name": "and_then(std::function &)", "full_name": "clanguml::t20044::detail::expected::and_then(std::function &)", "id": "1228620055083656606", "name": "and_then", "namespace": "", "source_location": { "column": 29, "file": "t20044.cc", "line": 34, "translation_unit": "t20044.cc" }, "type": "method" }, { "display_name": "value() const", "full_name": "clanguml::t20044::detail::expected::value() const", "id": "954804726969205606", "name": "value", "namespace": "", "source_location": { "column": 17, "file": "t20044.cc", "line": 30, "translation_unit": "t20044.cc" }, "type": "method" } ], "display_name": "result_t", "full_name": "clanguml::t20044::detail::expected", "id": "109801426773060225", "name": "expected", "namespace": "clanguml::t20044::detail", "source_location": { "column": 41, "file": "t20044.cc", "line": 15, "translation_unit": "t20044.cc" }, "type": "class" }, { "activities": [ { "display_name": "operator()(auto &&) const", "full_name": "clanguml::t20044::tmain()::(lambda t20044.cc:90:19)::operator()(auto &&) const", "id": "1768106129901104346", "name": "operator()", "namespace": "", "type": "method" } ], "display_name": "tmain()::(lambda t20044.cc:90:19)", "full_name": "clanguml::t20044::tmain()::(lambda t20044.cc:90:19)", "id": "929315761786829928", "name": "tmain()::(lambda t20044.cc:90:19)", "namespace": "clanguml::t20044", "source_location": { "column": 19, "file": "t20044.cc", "line": 90, "translation_unit": "t20044.cc" }, "type": "lambda" } ], "sequences": [ { "messages": [ { "from": { "activity_id": "252888248193934644", "participant_id": "252888248193934644" }, "name": "R((lambda at t20044.cc:74:9) &&)", "return_type": "void", "scope": "normal", "source_location": { "column": 7, "file": "t20044.cc", "line": 74, "translation_unit": "t20044.cc" }, "to": { "activity_id": "2121949343931231437", "participant_id": "1556111147598935846" }, "type": "message" }, { "from": { "activity_id": "2121949343931231437", "participant_id": "1556111147598935846" }, "name": "operator()() const", "return_type": "void", "scope": "normal", "source_location": { "column": 38, "file": "t20044.cc", "line": 65, "translation_unit": "t20044.cc" }, "to": { "activity_id": "818357152220364831", "participant_id": "731168008522991712" }, "type": "message" }, { "comment": "Call to template constructor with callable parameter and lambda\nexpression as argument", "from": { "activity_id": "818357152220364831", "participant_id": "731168008522991712" }, "name": "a() const", "return_type": "void", "scope": "normal", "source_location": { "column": 18, "file": "t20044.cc", "line": 74, "translation_unit": "t20044.cc" }, "to": { "activity_id": "853950074322224524", "participant_id": "1026615617828083132" }, "type": "message" }, { "from": { "activity_id": "252888248193934644", "participant_id": "252888248193934644" }, "name": "operator()() const", "return_type": "void", "scope": "normal", "source_location": { "column": 18, "file": "t20044.cc", "line": 84, "translation_unit": "t20044.cc" }, "to": { "activity_id": "436096372302626180", "participant_id": "1462639563075674191" }, "type": "message" }, { "comment": "The message to detail2::run() is skipped due to exclude filter, however\nthe call to lambda and A::a5() is rendered\nTODO: Add some marker to highlight that this is not a direct call", "from": { "activity_id": "436096372302626180", "participant_id": "1462639563075674191" }, "name": "a5()", "return_type": "void", "scope": "normal", "source_location": { "column": 26, "file": "t20044.cc", "line": 84, "translation_unit": "t20044.cc" }, "to": { "activity_id": "1743691164520385657", "participant_id": "1026615617828083132" }, "type": "message" }, { "from": { "activity_id": "252888248193934644", "participant_id": "252888248193934644" }, "name": "a1() const", "return_type": "result_t", "scope": "normal", "source_location": { "column": 12, "file": "t20044.cc", "line": 86, "translation_unit": "t20044.cc" }, "to": { "activity_id": "701399225037526851", "participant_id": "1026615617828083132" }, "type": "message" }, { "from": { "activity_id": "701399225037526851", "participant_id": "1026615617828083132" }, "name": "expected(int)", "return_type": "void", "scope": "normal", "source_location": { "column": 30, "file": "t20044.cc", "line": 53, "translation_unit": "t20044.cc" }, "to": { "activity_id": "1539466150622485129", "participant_id": "109801426773060225" }, "type": "message" }, { "from": { "activity_id": "252888248193934644", "participant_id": "252888248193934644" }, "name": "and_then((lambda at t20044.cc:90:19) &&)", "return_type": "result_t", "scope": "normal", "source_location": { "column": 12, "file": "t20044.cc", "line": 86, "translation_unit": "t20044.cc" }, "to": { "activity_id": "377073498530267347", "participant_id": "109801426773060225" }, "type": "message" }, { "activity_id": "377073498530267347", "branches": [ { "messages": [ { "from": { "activity_id": "377073498530267347", "participant_id": "109801426773060225" }, "name": "operator()(auto &&) const", "return_type": "auto", "scope": "normal", "source_location": { "column": 20, "file": "t20044.cc", "line": 37, "translation_unit": "t20044.cc" }, "to": { "activity_id": "1768106129901104346", "participant_id": "929315761786829928" }, "type": "message" }, { "comment": "Call to a template method accepting a callable with lambda expression\nas argument, fully tracked showing method's activity and", "from": { "activity_id": "1768106129901104346", "participant_id": "929315761786829928" }, "name": "a2(int) const", "return_type": "result_t", "scope": "normal", "source_location": { "column": 44, "file": "t20044.cc", "line": 90, "translation_unit": "t20044.cc" }, "to": { "activity_id": "85144570008244024", "participant_id": "1026615617828083132" }, "type": "message" }, { "from": { "activity_id": "85144570008244024", "participant_id": "1026615617828083132" }, "name": "expected(int)", "return_type": "void", "scope": "normal", "source_location": { "column": 37, "file": "t20044.cc", "line": 55, "translation_unit": "t20044.cc" }, "to": { "activity_id": "1539466150622485129", "participant_id": "109801426773060225" }, "type": "message" } ], "type": "consequent" } ], "name": "if", "type": "alt" }, { "from": { "activity_id": "252888248193934644", "participant_id": "252888248193934644" }, "name": "and_then(result_t (&)(int))", "return_type": "result_t", "scope": "normal", "source_location": { "column": 12, "file": "t20044.cc", "line": 86, "translation_unit": "t20044.cc" }, "to": { "activity_id": "1974891758151777473", "participant_id": "109801426773060225" }, "type": "message" }, { "from": { "activity_id": "252888248193934644", "participant_id": "252888248193934644" }, "name": "and_then(std::function &)", "return_type": "result_t", "scope": "normal", "source_location": { "column": 12, "file": "t20044.cc", "line": 86, "translation_unit": "t20044.cc" }, "to": { "activity_id": "1228620055083656606", "participant_id": "109801426773060225" }, "type": "message" }, { "from": { "activity_id": "252888248193934644", "participant_id": "252888248193934644" }, "name": "value() const", "return_type": "int const &", "scope": "normal", "source_location": { "column": 12, "file": "t20044.cc", "line": 86, "translation_unit": "t20044.cc" }, "to": { "activity_id": "954804726969205606", "participant_id": "109801426773060225" }, "type": "message" } ], "start_from": { "id": 252888248193934644, "location": "clanguml::t20044::tmain()" } } ], "using_namespace": "clanguml::t20044" } ```