@@ -397,51 +397,6 @@ class diagram_action_visitor_factory
397397 std::function<void ()> progress_;
398398};
399399
400- template <typename DiagramConfig>
401- auto make_generator (const std::string &name,
402- const std::string &translation_unit,
403- const common::compilation_database_ptr &db, DiagramConfig &diagram,
404- const cli::runtime_config &runtime_config,
405- std::shared_ptr<progress_indicator_base> indicator)
406- {
407- using diagram_model = typename diagram_model_t <DiagramConfig>::type;
408- using diagram_visitor = typename diagram_visitor_t <DiagramConfig>::type;
409-
410- return [name, diagram, indicator, db = std::ref (*db),
411- translation_units = std::vector<std::string>{translation_unit},
412- runtime_config]() mutable -> std::unique_ptr<diagram_model> {
413- try {
414- std::unique_ptr<diagram_model> model;
415- auto progress_fun = [&indicator, &name]() {
416- if (indicator)
417- indicator->increment (name);
418- };
419-
420- model = generate_diagram_model<diagram_model, DiagramConfig,
421- diagram_visitor>(db, name, diagram, translation_units,
422- false , // runtime_config,
423- std::move (progress_fun));
424- return model;
425- }
426- catch (clanguml::generators::clang_tool_exception &e) {
427- if (indicator)
428- indicator->fail (name);
429- throw std::move (e);
430- }
431- catch (std::exception &e) {
432- if (indicator)
433- indicator->fail (name);
434-
435- LOG_ERROR (" Failed to generate diagram '{}': {}" , name, e.what ());
436-
437- throw std::runtime_error (fmt::format (
438- " Failed to generate diagram '{}': {}" , name, e.what ()));
439- }
440-
441- return {};
442- };
443- };
444-
445400/* *
446401 * @brief Specialization of
447402 * [clang::ASTFrontendAction](https://clang.llvm.org/doxygen/classclang_1_1tooling_1_1FrontendActionFactory.html)
@@ -493,6 +448,72 @@ std::unique_ptr<DiagramModel> generate_diagram_model(
493448 return diagram;
494449}
495450
451+ /* *
452+ * @brief Create a generator function for a specific diagram and translation
453+ * unit
454+ *
455+ * This function creates a lambda that will generate a diagram model for a
456+ * single translation unit. The returned lambda can be executed asynchronously
457+ * to build partial diagram models that can later be combined.
458+ *
459+ * @tparam DiagramConfig Type of diagram configuration (e.g., class_diagram,
460+ * sequence_diagram)
461+ * @param name Name of the diagram being generated
462+ * @param translation_unit Path to the translation unit to process
463+ * @param db Shared pointer to the compilation database
464+ * @param diagram Reference to the diagram configuration
465+ * @param runtime_config Runtime configuration including threading and output
466+ * settings
467+ * @param indicator Shared pointer to progress indicator for tracking generation
468+ * progress
469+ * @return Lambda function that returns a unique_ptr to the generated diagram
470+ * model
471+ */
472+ template <typename DiagramConfig>
473+ auto make_generator (const std::string &name,
474+ const std::string &translation_unit,
475+ const common::compilation_database_ptr &db, DiagramConfig &diagram,
476+ const cli::runtime_config &runtime_config,
477+ std::shared_ptr<progress_indicator_base> indicator)
478+ {
479+ using diagram_model = typename diagram_model_t <DiagramConfig>::type;
480+ using diagram_visitor = typename diagram_visitor_t <DiagramConfig>::type;
481+
482+ return [name, diagram, indicator, db = std::ref (*db),
483+ translation_units = std::vector<std::string>{translation_unit},
484+ runtime_config]() mutable -> std::unique_ptr<diagram_model> {
485+ try {
486+ std::unique_ptr<diagram_model> model;
487+ auto progress_fun = [&indicator, &name]() {
488+ if (indicator)
489+ indicator->increment (name);
490+ };
491+
492+ model = generate_diagram_model<diagram_model, DiagramConfig,
493+ diagram_visitor>(db, name, diagram, translation_units, false ,
494+ std::move (progress_fun));
495+
496+ return model;
497+ }
498+ catch (clanguml::generators::clang_tool_exception &e) {
499+ if (indicator)
500+ indicator->fail (name);
501+ throw std::move (e);
502+ }
503+ catch (std::exception &e) {
504+ if (indicator)
505+ indicator->fail (name);
506+
507+ LOG_ERROR (" Failed to generate diagram '{}': {}" , name, e.what ());
508+
509+ throw std::runtime_error (fmt::format (
510+ " Failed to generate diagram '{}': {}" , name, e.what ()));
511+ }
512+
513+ return {};
514+ };
515+ };
516+
496517/* *
497518 * @brief Generate a single diagram
498519 *
0 commit comments