Added parents (base classes) diagram filter

This commit is contained in:
Bartek Kryza
2023-03-06 22:32:02 +01:00
parent 8ba0239283
commit 8f99e2fc2f
11 changed files with 158 additions and 0 deletions

View File

@@ -263,6 +263,45 @@ tvl::value_t subclass_filter::match(const diagram &d, const element &e) const
return false;
}
parents_filter::parents_filter(filter_t type, std::vector<std::string> children)
: filter_visitor{type}
, children_{std::move(children)}
{
}
tvl::value_t parents_filter::match(const diagram &d, const element &e) const
{
if (d.type() != diagram_t::kClass)
return {};
if (children_.empty())
return {};
if (!d.complete())
return {};
const auto &cd = dynamic_cast<const class_diagram::model::diagram &>(d);
// First get all parents of element e
clanguml::common::reference_set<class_diagram::model::class_> parents;
for (const auto &child : children_) {
auto child_ref = cd.get_class(child);
if (!child_ref.has_value())
continue;
parents.emplace(child_ref.value());
}
cd.get_parents(parents);
for (const auto &parent : parents) {
if (e == parent.get())
return true;
}
return false;
}
relationship_filter::relationship_filter(
filter_t type, std::vector<relationship_t> relationships)
: filter_visitor{type}
@@ -465,6 +504,9 @@ void diagram_filter::init_filters(const config::diagram &c)
element_filters.emplace_back(std::make_unique<subclass_filter>(
filter_t::kInclusive, c.include().subclasses));
element_filters.emplace_back(std::make_unique<parents_filter>(
filter_t::kInclusive, c.include().parents));
element_filters.emplace_back(std::make_unique<
edge_traversal_filter<class_diagram::model::diagram,
class_diagram::model::class_>>(filter_t::kInclusive,
@@ -545,6 +587,9 @@ void diagram_filter::init_filters(const config::diagram &c)
add_exclusive_filter(std::make_unique<subclass_filter>(
filter_t::kExclusive, c.exclude().subclasses));
add_exclusive_filter(std::make_unique<parents_filter>(
filter_t::kExclusive, c.exclude().parents));
add_exclusive_filter(std::make_unique<edge_traversal_filter<
class_diagram::model::diagram, class_diagram::model::class_>>(
filter_t::kExclusive, relationship_t::kInstantiation,

View File

@@ -135,6 +135,17 @@ private:
std::vector<std::string> roots_;
};
struct parents_filter : public filter_visitor {
parents_filter(filter_t type, std::vector<std::string> roots);
~parents_filter() override = default;
tvl::value_t match(const diagram &d, const element &e) const override;
private:
std::vector<std::string> children_;
};
template <typename DiagramT, typename ElementT,
typename MatchOverrideT = common::model::element>
struct edge_traversal_filter : public filter_visitor {

View File

@@ -69,6 +69,8 @@ struct filter {
std::vector<std::string> subclasses;
std::vector<std::string> parents;
std::vector<std::string> specializations;
std::vector<std::string> dependants;

View File

@@ -275,6 +275,9 @@ template <> struct convert<filter> {
if (node["subclasses"])
rhs.subclasses = node["subclasses"].as<decltype(rhs.subclasses)>();
if (node["parents"])
rhs.parents = node["parents"].as<decltype(rhs.parents)>();
if (node["specializations"])
rhs.specializations =
node["specializations"].as<decltype(rhs.specializations)>();

View File

@@ -69,6 +69,8 @@ YAML::Emitter &operator<<(YAML::Emitter &out, const filter &f)
<< f.specializations;
if (!f.subclasses.empty())
out << YAML::Key << "subclasses" << YAML::Value << f.subclasses;
if (!f.parents.empty())
out << YAML::Key << "parents" << YAML::Value << f.parents;
out << YAML::EndMap;
return out;