diff --git a/.clanguml-sequence.example b/.clanguml-sequence.example index 45bc4b66..4e7de5b4 100644 --- a/.clanguml-sequence.example +++ b/.clanguml-sequence.example @@ -4,13 +4,19 @@ diagrams: main_sequence_diagram: type: sequence glob: - - t00001/t00001.cc - using_namespace: clanguml::t00001 + - src/main.cc + using_namespace: + - "" start_from: - file: t00001/t00001.cc - line: 20 - classes: - - A - - B - puml: - - 'note top of diagram: Aggregate template' + - usr: "c:@F@main#I#**1C#" + include: + namespace: + - clanguml + exclude: + namespace: + - std + plantuml: + before: + - "' main test sequence diagram" + after: + - "' end" diff --git a/src/config/config.h b/src/config/config.h index 0019c728..ea8913ad 100644 --- a/src/config/config.h +++ b/src/config/config.h @@ -31,6 +31,9 @@ struct source_location { using usr = std::string; using marker = std::string; using file = std::pair; + // std::variant requires unique types, so we cannot add + // marker here, we need sth like boost::mp_unique + // type function using variant = std::variant; }; @@ -100,11 +103,27 @@ template <> struct convert { } }; -template <> struct convert { - static bool decode(const Node &node, source_location::variant &rhs) +template <> struct convert> { + static bool decode( + const Node &node, std::vector &rhs) { - if(node["usr"]) - rhs = node["usr"].as(); + for (auto it = node.begin(); it != node.end(); ++it) { + const YAML::Node &n = *it; + if (n["usr"]) { + rhs.emplace_back(n["usr"].as()); + } + else if (n["marker"]) { + rhs.emplace_back(n["marker"].as()); + } + else if (n["file"] && n["line"]) { + rhs.emplace_back(std::make_pair( + n["file"].as(), n["line"].as())); + } + else { + return false; + } + } + return true; } }; diff --git a/src/puml/sequence_diagram_generator.h b/src/puml/sequence_diagram_generator.h index ab1b8708..cec82abc 100644 --- a/src/puml/sequence_diagram_generator.h +++ b/src/puml/sequence_diagram_generator.h @@ -19,6 +19,7 @@ namespace puml { using diagram_model = clanguml::model::sequence_diagram::diagram; using diagram_config = clanguml::config::sequence_diagram::diagram; +using clanguml::config::source_location; using clanguml::model::sequence_diagram::activity; using clanguml::model::sequence_diagram::message; using clanguml::model::sequence_diagram::message_t; @@ -83,14 +84,22 @@ public: void generate(std::ostream &ostr) const { - auto start_from = "c:@N@clanguml@N@t00001@F@tmain#"; ostr << "@startuml" << std::endl; for (const auto &b : m_config.puml.before) ostr << b << std::endl; - generate_activity(m_model.sequences[start_from], ostr); - + for (const auto &sf : m_config.start_from) { + std::string start_from; + if (std::holds_alternative(sf)) { + start_from = std::get(sf); + } + else { + // TODO: Add support for other sequence start location types + continue; + } + generate_activity(m_model.sequences[start_from], ostr); + } for (const auto &a : m_config.puml.after) ostr << a << std::endl; diff --git a/tests/t00001/.clanguml b/tests/t00001/.clanguml index 7a6cfa1d..543d0dd0 100644 --- a/tests/t00001/.clanguml +++ b/tests/t00001/.clanguml @@ -10,7 +10,7 @@ diagrams: - clanguml::t00001 exclude: namespace: - - std + - clanguml::t00001::detail using_namespace: - clanguml::t00001 start_from: diff --git a/tests/t00001/t00001.cc b/tests/t00001/t00001.cc index b377aaab..bd6497d3 100644 --- a/tests/t00001/t00001.cc +++ b/tests/t00001/t00001.cc @@ -1,13 +1,26 @@ -#include #include #include +#include namespace clanguml { namespace t00001 { +namespace detail { +struct C { + auto add(int x, int y) + { + return x + y; + } +}; +} + class A { public: - int add(int x, int y) { return x + y; } + A() + { + } + + int add(int x, int y) { return m_c.add(x, y); } int add3(int x, int y, int z) { @@ -21,6 +34,9 @@ public: } void log_result(int r) {} + +private: + detail::C m_c{}; }; class B {