diff --git a/src/common/model/diagram_filter.cc b/src/common/model/diagram_filter.cc index 0ae25444..6644c17c 100644 --- a/src/common/model/diagram_filter.cc +++ b/src/common/model/diagram_filter.cc @@ -1,5 +1,5 @@ /** - * src/common/model/diagram_filter.h + * src/common/model/diagram_filter.cc * * Copyright (c) 2021-2022 Bartek Kryza * @@ -61,6 +61,34 @@ bool filter_visitor::is_exclusive() const filter_t filter_visitor::type() const { return type_; } +anyof_filter::anyof_filter( + filter_t type, std::vector> filters) + : filter_visitor{type} + , filters_{std::move(filters)} +{ +} + +std::optional anyof_filter::match( + const diagram &d, const common::model::element &e) const +{ + std::optional res{}; + + for (const auto &filter : filters_) { + auto m = filter->match(d, e); + if (m.has_value()) { + if (m.value() == true) { + res = true; + break; + } + else { + res = false; + } + } + } + + return res; +} + namespace_filter::namespace_filter( filter_t type, std::vector namespaces) : filter_visitor{type} @@ -301,12 +329,18 @@ void diagram_filter::init_filters(const config::diagram &c) filter_t::kInclusive, c.include().relationships)); inclusive_.emplace_back(std::make_unique( filter_t::kInclusive, c.include().access)); - inclusive_.emplace_back(std::make_unique( + + // Include any of these matches even if one them does not match + std::vector> element_filters; + element_filters.emplace_back(std::make_unique( filter_t::kInclusive, c.include().elements)); - inclusive_.emplace_back(std::make_unique( + element_filters.emplace_back(std::make_unique( filter_t::kInclusive, c.include().subclasses)); - inclusive_.emplace_back(std::make_unique( + element_filters.emplace_back(std::make_unique( filter_t::kInclusive, c.include().context)); + + inclusive_.emplace_back(std::make_unique( + filter_t::kInclusive, std::move(element_filters))); } // Process exclusive filters diff --git a/src/common/model/diagram_filter.h b/src/common/model/diagram_filter.h index ddc8ac5b..468a9f1d 100644 --- a/src/common/model/diagram_filter.h +++ b/src/common/model/diagram_filter.h @@ -1,5 +1,5 @@ /** - * src/common/model/entity_filter.h + * src/common/model/diagram_filter.h * * Copyright (c) 2021-2022 Bartek Kryza * @@ -55,6 +55,17 @@ private: filter_t type_; }; +struct anyof_filter : public filter_visitor { + anyof_filter( + filter_t type, std::vector> filters); + + std::optional match( + const diagram &d, const common::model::element &e) const override; + +private: + std::vector> filters_; +}; + struct namespace_filter : public filter_visitor { namespace_filter(filter_t type, std::vector namespaces); diff --git a/tests/t00041/.clang-uml b/tests/t00041/.clang-uml index 6f49aac4..2ec91634 100644 --- a/tests/t00041/.clang-uml +++ b/tests/t00041/.clang-uml @@ -12,4 +12,6 @@ diagrams: namespaces: - clanguml::t00041 context: - - clanguml::t00041::RR \ No newline at end of file + - clanguml::t00041::RR + subclasses: + - clanguml::t00041::ns1::N \ No newline at end of file diff --git a/tests/t00041/t00041.cc b/tests/t00041/t00041.cc index 8871f5db..c6099308 100644 --- a/tests/t00041/t00041.cc +++ b/tests/t00041/t00041.cc @@ -32,4 +32,15 @@ struct RR : public R { struct RRR : public RR { }; +namespace ns1 { +struct N { +}; + +struct NN : public N { +}; + +struct NM : public N { +}; +} + } // namespace clanguml::t00041 diff --git a/tests/t00041/test_case.h b/tests/t00041/test_case.h index 979d93fe..a4fbb4b1 100644 --- a/tests/t00041/test_case.h +++ b/tests/t00041/test_case.h @@ -55,6 +55,12 @@ TEST_CASE("t00041", "[test-case][class]") REQUIRE_THAT(puml, IsAssociation(_A("RR"), _A("E"), "+e")); REQUIRE_THAT(puml, IsAssociation(_A("RR"), _A("F"), "+f")); + REQUIRE_THAT(puml, IsClass(_A("ns1::N"))); + REQUIRE_THAT(puml, IsClass(_A("ns1::NN"))); + REQUIRE_THAT(puml, IsClass(_A("ns1::NM"))); + REQUIRE_THAT(puml, IsBaseClass(_A("ns1::N"), _A("ns1::NN"))); + REQUIRE_THAT(puml, IsBaseClass(_A("ns1::N"), _A("ns1::NM"))); + save_puml( "./" + config.output_directory() + "/" + diagram->name + ".puml", puml); }