Added compound element filter allowing additive inclusion filters

This commit is contained in:
Bartek Kryza
2022-03-31 21:50:25 +02:00
parent f33f1ef236
commit a42598357b
5 changed files with 70 additions and 6 deletions

View File

@@ -1,5 +1,5 @@
/** /**
* src/common/model/diagram_filter.h * src/common/model/diagram_filter.cc
* *
* Copyright (c) 2021-2022 Bartek Kryza <bkryza@gmail.com> * Copyright (c) 2021-2022 Bartek Kryza <bkryza@gmail.com>
* *
@@ -61,6 +61,34 @@ bool filter_visitor::is_exclusive() const
filter_t filter_visitor::type() const { return type_; } filter_t filter_visitor::type() const { return type_; }
anyof_filter::anyof_filter(
filter_t type, std::vector<std::unique_ptr<filter_visitor>> filters)
: filter_visitor{type}
, filters_{std::move(filters)}
{
}
std::optional<bool> anyof_filter::match(
const diagram &d, const common::model::element &e) const
{
std::optional<bool> 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( namespace_filter::namespace_filter(
filter_t type, std::vector<namespace_> namespaces) filter_t type, std::vector<namespace_> namespaces)
: filter_visitor{type} : filter_visitor{type}
@@ -301,12 +329,18 @@ void diagram_filter::init_filters(const config::diagram &c)
filter_t::kInclusive, c.include().relationships)); filter_t::kInclusive, c.include().relationships));
inclusive_.emplace_back(std::make_unique<access_filter>( inclusive_.emplace_back(std::make_unique<access_filter>(
filter_t::kInclusive, c.include().access)); filter_t::kInclusive, c.include().access));
inclusive_.emplace_back(std::make_unique<element_filter>(
// Include any of these matches even if one them does not match
std::vector<std::unique_ptr<filter_visitor>> element_filters;
element_filters.emplace_back(std::make_unique<element_filter>(
filter_t::kInclusive, c.include().elements)); filter_t::kInclusive, c.include().elements));
inclusive_.emplace_back(std::make_unique<subclass_filter>( element_filters.emplace_back(std::make_unique<subclass_filter>(
filter_t::kInclusive, c.include().subclasses)); filter_t::kInclusive, c.include().subclasses));
inclusive_.emplace_back(std::make_unique<context_filter>( element_filters.emplace_back(std::make_unique<context_filter>(
filter_t::kInclusive, c.include().context)); filter_t::kInclusive, c.include().context));
inclusive_.emplace_back(std::make_unique<anyof_filter>(
filter_t::kInclusive, std::move(element_filters)));
} }
// Process exclusive filters // Process exclusive filters

View File

@@ -1,5 +1,5 @@
/** /**
* src/common/model/entity_filter.h * src/common/model/diagram_filter.h
* *
* Copyright (c) 2021-2022 Bartek Kryza <bkryza@gmail.com> * Copyright (c) 2021-2022 Bartek Kryza <bkryza@gmail.com>
* *
@@ -55,6 +55,17 @@ private:
filter_t type_; filter_t type_;
}; };
struct anyof_filter : public filter_visitor {
anyof_filter(
filter_t type, std::vector<std::unique_ptr<filter_visitor>> filters);
std::optional<bool> match(
const diagram &d, const common::model::element &e) const override;
private:
std::vector<std::unique_ptr<filter_visitor>> filters_;
};
struct namespace_filter : public filter_visitor { struct namespace_filter : public filter_visitor {
namespace_filter(filter_t type, std::vector<namespace_> namespaces); namespace_filter(filter_t type, std::vector<namespace_> namespaces);

View File

@@ -13,3 +13,5 @@ diagrams:
- clanguml::t00041 - clanguml::t00041
context: context:
- clanguml::t00041::RR - clanguml::t00041::RR
subclasses:
- clanguml::t00041::ns1::N

View File

@@ -32,4 +32,15 @@ struct RR : public R {
struct RRR : public RR { struct RRR : public RR {
}; };
namespace ns1 {
struct N {
};
struct NN : public N {
};
struct NM : public N {
};
}
} // namespace clanguml::t00041 } // namespace clanguml::t00041

View File

@@ -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("E"), "+e"));
REQUIRE_THAT(puml, IsAssociation(_A("RR"), _A("F"), "+f")); 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( save_puml(
"./" + config.output_directory() + "/" + diagram->name + ".puml", puml); "./" + config.output_directory() + "/" + diagram->name + ".puml", puml);
} }