diff --git a/src/common/model/filters/diagram_filter.cc b/src/common/model/filters/diagram_filter.cc index 2d209528..21ffe448 100644 --- a/src/common/model/filters/diagram_filter.cc +++ b/src/common/model/filters/diagram_filter.cc @@ -939,8 +939,8 @@ bool context_filter::is_outward(relationship_t r) const return r != relationship_t::kAssociation; } -paths_filter::paths_filter(filter_t type, const std::filesystem::path &root, - const std::vector &p) +paths_filter::paths_filter(filter_t type, const std::vector &p, + const std::filesystem::path &root) : filter_visitor{type} , root_{root} { diff --git a/src/common/model/filters/diagram_filter.h b/src/common/model/filters/diagram_filter.h index 2d881255..424e3556 100644 --- a/src/common/model/filters/diagram_filter.h +++ b/src/common/model/filters/diagram_filter.h @@ -350,8 +350,8 @@ template struct edge_traversal_filter : public filter_visitor { - edge_traversal_filter(filter_t type, relationship_t relationship, - std::vector roots, bool forward = false) + edge_traversal_filter(filter_t type, std::vector roots, + relationship_t relationship, bool forward = false) : filter_visitor{type} , roots_{std::move(roots)} , relationship_{relationship} @@ -682,8 +682,8 @@ private: * a specified file paths. */ struct paths_filter : public filter_visitor { - paths_filter(filter_t type, const std::filesystem::path &root, - const std::vector &p); + paths_filter(filter_t type, const std::vector &p, + const std::filesystem::path &root); ~paths_filter() override = default; diff --git a/src/common/model/filters/diagram_filter_factory.cc b/src/common/model/filters/diagram_filter_factory.cc index c500d38e..8b11283d 100644 --- a/src/common/model/filters/diagram_filter_factory.cc +++ b/src/common/model/filters/diagram_filter_factory.cc @@ -20,30 +20,6 @@ namespace clanguml::common::model { -namespace { -using specializations_filter_t = - edge_traversal_filter; - -using class_dependants_filter_t = - edge_traversal_filter; -using class_dependencies_filter_t = - edge_traversal_filter; - -using package_dependants_filter_t = - edge_traversal_filter; -using package_dependencies_filter_t = - edge_traversal_filter; - -using source_file_dependency_filter_t = - edge_traversal_filter; -} - void basic_diagram_filter_initializer::initialize() { // Process inclusive filters @@ -64,8 +40,8 @@ void basic_diagram_filter_initializer::initialize() filter_t::kInclusive, diagram_config.include().access)); df.add_inclusive_filter(std::make_unique( - filter_t::kInclusive, diagram_config.root_directory(), - diagram_config.include().paths)); + filter_t::kInclusive, diagram_config.include().paths, + diagram_config.root_directory())); df.add_inclusive_filter( std::make_unique(filter_t::kInclusive, @@ -97,18 +73,18 @@ void basic_diagram_filter_initializer::initialize() element_filters.emplace_back( std::make_unique(filter_t::kInclusive, - relationship_t::kInstantiation, - diagram_config.include().specializations)); + diagram_config.include().specializations, + relationship_t::kInstantiation)); element_filters.emplace_back( std::make_unique( - filter_t::kInclusive, relationship_t::kDependency, - diagram_config.include().dependants)); + filter_t::kInclusive, diagram_config.include().dependants, + relationship_t::kDependency)); element_filters.emplace_back( std::make_unique( - filter_t::kInclusive, relationship_t::kDependency, - diagram_config.include().dependencies, true)); + filter_t::kInclusive, diagram_config.include().dependencies, + relationship_t::kDependency, true)); } else if (diagram_config.type() == diagram_t::kSequence) { element_filters.emplace_back(std::make_unique( @@ -117,13 +93,13 @@ void basic_diagram_filter_initializer::initialize() else if (diagram_config.type() == diagram_t::kPackage) { element_filters.emplace_back( std::make_unique( - filter_t::kInclusive, relationship_t::kDependency, - diagram_config.include().dependants)); + filter_t::kInclusive, diagram_config.include().dependants, + relationship_t::kDependency)); element_filters.emplace_back( std::make_unique( - filter_t::kInclusive, relationship_t::kDependency, - diagram_config.include().dependencies, true)); + filter_t::kInclusive, diagram_config.include().dependencies, + relationship_t::kDependency, true)); } else if (diagram_config.type() == diagram_t::kInclude) { std::vector dependants; @@ -147,13 +123,13 @@ void basic_diagram_filter_initializer::initialize() element_filters.emplace_back( std::make_unique( - filter_t::kInclusive, relationship_t::kAssociation, - dependants, false)); + filter_t::kInclusive, dependants, + relationship_t::kAssociation, false)); element_filters.emplace_back( std::make_unique( - filter_t::kInclusive, relationship_t::kAssociation, - dependencies, true)); + filter_t::kInclusive, dependencies, + relationship_t::kAssociation, true)); } element_filters.emplace_back(std::make_unique( @@ -175,8 +151,8 @@ void basic_diagram_filter_initializer::initialize() filter_t::kExclusive, diagram_config.exclude().module_access)); df.add_exclusive_filter(std::make_unique( - filter_t::kExclusive, diagram_config.root_directory(), - diagram_config.exclude().paths)); + filter_t::kExclusive, diagram_config.exclude().paths, + diagram_config.root_directory())); df.add_exclusive_filter(std::make_unique( filter_t::kExclusive, diagram_config.exclude().elements)); @@ -209,18 +185,18 @@ void basic_diagram_filter_initializer::initialize() filter_t::kExclusive, diagram_config.exclude().parents)); df.add_exclusive_filter(std::make_unique( - filter_t::kExclusive, relationship_t::kInstantiation, - diagram_config.exclude().specializations)); + filter_t::kExclusive, diagram_config.exclude().specializations, + relationship_t::kInstantiation)); if (diagram_config.type() == diagram_t::kClass) { df.add_exclusive_filter(std::make_unique( - filter_t::kExclusive, relationship_t::kDependency, - diagram_config.exclude().dependants)); + filter_t::kExclusive, diagram_config.exclude().dependants, + relationship_t::kDependency)); df.add_exclusive_filter( std::make_unique( - filter_t::kExclusive, relationship_t::kDependency, - diagram_config.exclude().dependencies, true)); + filter_t::kExclusive, diagram_config.exclude().dependencies, + relationship_t::kDependency, true)); } else if (diagram_config.type() == diagram_t::kSequence) { df.add_exclusive_filter(std::make_unique( @@ -229,13 +205,13 @@ void basic_diagram_filter_initializer::initialize() else if (diagram_config.type() == diagram_t::kPackage) { df.add_exclusive_filter( std::make_unique( - filter_t::kExclusive, relationship_t::kDependency, - diagram_config.exclude().dependencies, true)); + filter_t::kExclusive, diagram_config.exclude().dependencies, + relationship_t::kDependency, true)); df.add_exclusive_filter( std::make_unique( - filter_t::kExclusive, relationship_t::kDependency, - diagram_config.exclude().dependants)); + filter_t::kExclusive, diagram_config.exclude().dependants, + relationship_t::kDependency)); } else if (diagram_config.type() == diagram_t::kInclude) { std::vector dependants; @@ -259,13 +235,13 @@ void basic_diagram_filter_initializer::initialize() df.add_exclusive_filter( std::make_unique( - filter_t::kExclusive, relationship_t::kAssociation, - dependants, false)); + filter_t::kExclusive, dependants, + relationship_t::kAssociation, false)); df.add_exclusive_filter( std::make_unique( - filter_t::kExclusive, relationship_t::kAssociation, - dependencies, true)); + filter_t::kExclusive, dependencies, + relationship_t::kAssociation, true)); } df.add_exclusive_filter(std::make_unique( @@ -308,24 +284,11 @@ advanced_diagram_filter_initializer::build( add_filter( filter_type, filter_config.relationships, result); add_filter(filter_type, filter_config.access, result); + add_filter( + filter_type, filter_config.method_types, result); - if (!filter_config.method_types.empty()) { - result.emplace_back(std::make_unique(filter_type, - std::make_unique( - filter_t::kInclusive, filter_config.access), - std::make_unique( - filter_t::kInclusive, filter_config.method_types))); - } - - if (!filter_config.paths.empty()) { - result.emplace_back(std::make_unique( - filter_type, diagram_config.root_directory(), filter_config.paths)); - } - - if (!filter_config.access.empty()) - result.emplace_back(std::make_unique(filter_type, - std::make_unique( - filter_type, filter_config.access))); + add_filter(filter_type, filter_config.paths, result, + diagram_config.root_directory()); add_filter(filter_type, filter_config.elements, result); add_filter( @@ -333,45 +296,30 @@ advanced_diagram_filter_initializer::build( add_filter(filter_type, filter_config.subclasses, result); add_filter(filter_type, filter_config.parents, result); - add_edge_filter(filter_type, - filter_config.specializations, relationship_t::kInstantiation, false, - result); - add_edge_filter(filter_type, - filter_config.dependants, relationship_t::kDependency, false, result); - add_edge_filter(filter_type, - filter_config.dependencies, relationship_t::kDependency, true, result); + add_filter(filter_type, + filter_config.specializations, result, relationship_t::kInstantiation, + false); + add_filter(filter_type, filter_config.dependants, + result, relationship_t::kDependency, false); + add_filter(filter_type, + filter_config.dependencies, result, relationship_t::kDependency, true); add_filter(filter_type, filter_config.callee_types, result); - add_edge_filter(filter_type, - filter_config.dependants, relationship_t::kDependency, false, result); - add_edge_filter(filter_type, - filter_config.dependencies, relationship_t::kDependency, true, result); + add_filter(filter_type, + filter_config.dependants, result, relationship_t::kDependency, false); + add_filter(filter_type, + filter_config.dependencies, result, relationship_t::kDependency, true); add_filter(filter_type, filter_config.context, result); if (diagram_config.type() == diagram_t::kInclude) { - std::vector dependants; - std::vector dependencies; - - for (auto &&path : filter_config.dependants) { - if (auto p = path.get(); p.has_value()) { - const std::filesystem::path dep_path{*p}; - dependants.emplace_back(dep_path.lexically_normal().string()); - } - } - - for (auto &&path : filter_config.dependencies) { - if (auto p = path.get(); p.has_value()) { - const std::filesystem::path dep_path{*p}; - dependencies.emplace_back(dep_path.lexically_normal().string()); - } - } - - add_edge_filter(filter_type, - dependants, relationship_t::kAssociation, false, result); - add_edge_filter(filter_type, - dependencies, relationship_t::kAssociation, true, result); + add_filter(filter_type, + filter_config.dependants, result, relationship_t::kAssociation, + false); + add_filter(filter_type, + filter_config.dependencies, result, relationship_t::kAssociation, + true); } return result; diff --git a/src/common/model/filters/diagram_filter_factory.h b/src/common/model/filters/diagram_filter_factory.h index 37fab51a..8c13eb4a 100644 --- a/src/common/model/filters/diagram_filter_factory.h +++ b/src/common/model/filters/diagram_filter_factory.h @@ -21,6 +21,27 @@ #include "package_diagram/model/diagram.h" namespace clanguml::common::model { +using specializations_filter_t = + edge_traversal_filter; + +using class_dependants_filter_t = + edge_traversal_filter; +using class_dependencies_filter_t = + edge_traversal_filter; + +using package_dependants_filter_t = + edge_traversal_filter; +using package_dependencies_filter_t = + edge_traversal_filter; + +using source_file_dependency_filter_t = + edge_traversal_filter; class diagram_filter_initializer { public: @@ -54,24 +75,33 @@ private: std::vector> build( filter_t filter_type, const config::filter &filter_config); - template + template void add_filter(const filter_t &filter_type, const std::vector &filter_config, - std::vector> &result) - { - if (!filter_config.empty()) - result.emplace_back( - std::make_unique(filter_type, filter_config)); - } - - template - void add_edge_filter(const filter_t &filter_type, - const std::vector &filter_config, relationship_t rt, bool direction, - std::vector> &result) + std::vector> &result, Args &&...args) { if (!filter_config.empty()) result.emplace_back(std::make_unique( - filter_type, rt, filter_config, direction)); + filter_type, filter_config, std::forward(args)...)); + } + + template <> + void add_filter( + const filter_t &filter_type, + const std::vector &filter_config, + std::vector> &result, + relationship_t &&rt, bool &&direction) + { + std::vector deps; + for (auto &&path : filter_config) { + if (auto p = path.get(); p.has_value()) { + const std::filesystem::path dep_path{*p}; + deps.emplace_back(dep_path.lexically_normal().string()); + } + } + + result.emplace_back(std::make_unique( + filter_type, deps, rt, direction)); } };