Added compound element filter allowing additive inclusion filters
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -13,3 +13,5 @@ diagrams:
|
|||||||
- clanguml::t00041
|
- clanguml::t00041
|
||||||
context:
|
context:
|
||||||
- clanguml::t00041::RR
|
- clanguml::t00041::RR
|
||||||
|
subclasses:
|
||||||
|
- clanguml::t00041::ns1::N
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user