40class diagram_filter_factory;
56template <
typename ElementT,
typename DiagramT>
59template <
typename ElementT,
typename DiagramT>
61 const DiagramT &d,
const std::string &full_name);
127 filter_mode_t
mode()
const;
130 virtual void reset();
134 filter_mode_t
mode_{filter_mode_t::basic};
139 filter_t type, std::vector<std::unique_ptr<filter_visitor>> filters);
170 void reset()
override;
173 template <
typename E>
177 [&d, &
element](
const auto &f) { return f->match(d, element); });
185 std::vector<std::unique_ptr<filter_visitor>>
filters_;
190 filter_t type, std::vector<std::unique_ptr<filter_visitor>> filters);
221 void reset()
override;
224 template <
typename E>
228 [&d, &
element](
const auto &f) { return f->match(d, element); });
231 std::vector<std::unique_ptr<filter_visitor>>
filters_;
240 filter_t type, std::vector<common::namespace_or_regex> namespaces);
275 filter_t type, std::vector<config::element_filter_t> elements);
319 filter_t type, std::vector<config::method_type> method_types);
357 std::vector<common::string_or_regex>
roots_;
389template <
typename DiagramT,
typename ElementT,
390 typename ConfigEntryT = std::string,
417 if (!check_diagram_type<DiagramT>(d.
type()))
423 const auto &cd =
dynamic_cast<const DiagramT &
>(d);
428 const auto &fn = e.full_name(
false);
429 auto element_ref = detail::get<ElementT>(cd, fn);
431 if (!element_ref.has_value())
437 [&e](
const auto &te) {
438 std::string tes = te.get().full_name(false);
439 std::string es = e.full_name(false);
449 template <
typename C,
typename D>
451 const std::vector<relationship_t> &relationships)
const
453 bool added_new_element{
false};
455 for (
const auto &from_el : from) {
459 for (
const auto &rel : from_el.get().relationships()) {
462 for (
const auto &to_el : to) {
463 if (rel.destination() ==
465 const auto &to_add =
forward_ ? to_el : from_el;
467 added_new_element =
true;
474 return added_new_element;
483 auto parent = detail::get<ElementT, DiagramT>(
486 while (parent.has_value()) {
487 parents.emplace(parent.value());
488 parent = detail::get<ElementT, DiagramT>(
489 cd, parent.value().path().to_string());
496 void init(
const DiagramT &cd)
const
506 for (
const auto &root_pattern :
roots_) {
507 if constexpr (std::is_same_v<ConfigEntryT,
509 auto root_refs = cd.template find<ElementT>(root_pattern);
511 for (
auto &root : root_refs) {
512 if (root.has_value())
517 auto root_ref = detail::get<ElementT>(cd, root_pattern);
518 if (root_ref.has_value()) {
525 while (keep_looking) {
526 keep_looking =
false;
560 filter_t type, std::vector<relationship_t> relationships);
616 const diagram &d,
unsigned idx)
const;
619 const diagram &d,
unsigned idx)
const;
625 template <
typename NestedTraitT>
628 std::set<eid_t> &effective_context,
629 std::set<eid_t> ¤t_iteration_context)
const
632 for (
const auto &p : nt) {
633 if (
auto *pkg =
dynamic_cast<package *
>(p.get());
636 current_iteration_context);
639 for (
const relationship &rel : p.get()->relationships()) {
659 for (
const auto &element_id : effective_context) {
660 if (rel.destination() == element_id)
661 current_iteration_context.emplace(
669 for (
const auto element_id : effective_context) {
670 const auto &maybe_element = d.
get(element_id);
676 maybe_element.value().relationships()) {
697 if (rel.destination() == p.get()->id())
698 current_iteration_context.emplace(
706 for (
const auto &p : nt) {
707 auto *pkg =
dynamic_cast<package *
>(p.get());
712 current_iteration_context);
714 for (
const relationship &rel : p.get()->relationships()) {
734 for (
const auto &element_id : effective_context) {
735 if (rel.destination() == element_id)
736 current_iteration_context.emplace(p.get()->id());
743 for (
const auto element_id : effective_context) {
744 const auto &maybe_element = d.
get(element_id);
750 maybe_element.value().relationships()) {
769 if (rel.destination() == p.get()->id())
770 current_iteration_context.emplace(p.get()->id());
777 template <
typename DiagramT>
780 std::set<eid_t> &effective_context,
781 std::set<eid_t> ¤t_iteration_context)
const
783 const auto &cd =
dynamic_cast<const DiagramT &
>(d);
786 cd, cd, context_cfg, effective_context, current_iteration_context);
810 std::filesystem::path> {
812 const std::filesystem::path &root);
826 std::vector<std::filesystem::path>
paths_;
835 std::unique_ptr<method_type_filter> mtf);
918 assert(ex.get() != nullptr);
920 return ex->match(diagram_, e);
928 assert(in.get() != nullptr);
930 return in->match(diagram_, e);
936 filter_mode_t
mode()
const;
954 filter_mode_t
mode_{filter_mode_t::basic};
957template <
typename Collection>
960 col.erase(std::remove_if(col.begin(), col.end(),
962 return !filter.should_include(element);
969 std::vector<std::reference_wrapper<T>> &col,
const diagram_filter &filter)
971 col.erase(std::remove_if(col.begin(), col.end(),
973 return !filter.should_include(element.get());
979bool diagram_filter::should_include<std::string>(
const std::string &name)
const;