766{
767 bool effective_context_extended{true};
768
770
771
772 const auto &context_cfg =
context_.at(idx);
773 const auto &context_matches =
774 dynamic_cast<const class_diagram::model::diagram &>(d)
775 .find<class_diagram::model::class_>(context_cfg.pattern);
776
777 for (const auto &maybe_match : context_matches) {
778 if (maybe_match)
779 effective_context.emplace(maybe_match.value().id());
780 }
781
782 const auto &context_enum_matches =
783 dynamic_cast<const class_diagram::model::diagram &>(d)
784 .find<class_diagram::model::enum_>(context_cfg.pattern);
785
786 for (const auto &maybe_match : context_enum_matches) {
787 if (maybe_match)
788 effective_context.emplace(maybe_match.value().id());
789 }
790
791 const auto &context_concept_matches =
792 dynamic_cast<const class_diagram::model::diagram &>(d)
793 .find<class_diagram::model::concept_>(context_cfg.pattern);
794
795 for (const auto &maybe_match : context_concept_matches) {
796 if (maybe_match)
797 effective_context.emplace(maybe_match.value().id());
798 }
799
800
801
802 auto radius_counter = context_cfg.radius;
803 std::set<eid_t> current_iteration_context;
804
805 while (radius_counter > 0 && effective_context_extended) {
806
807
808 radius_counter--;
809 effective_context_extended = false;
810 current_iteration_context.clear();
811
812
813 find_elements_in_direct_relationship<class_diagram::model::class_>(
814 d, context_cfg, effective_context, current_iteration_context);
815
817 d, context_cfg, effective_context, current_iteration_context);
818
819
820 find_elements_in_direct_relationship<class_diagram::model::concept_>(
821 d, context_cfg, effective_context, current_iteration_context);
822
823
824 find_elements_in_direct_relationship<class_diagram::model::enum_>(
825 d, context_cfg, effective_context, current_iteration_context);
826
827 for (auto id : current_iteration_context) {
828 if (effective_context.count(id) == 0) {
829
830 effective_context.emplace(id);
831 effective_context_extended = true;
832 }
833 }
834 }
835}