From 967be9e750221ab2ab783f95df79bb26d290a45e Mon Sep 17 00:00:00 2001 From: Martial Simon Date: Mon, 15 Sep 2025 01:07:58 +0200 Subject: add: added projects --- tiger-compiler/src/task/task-register.hh | 118 +++++++++++++++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100644 tiger-compiler/src/task/task-register.hh (limited to 'tiger-compiler/src/task/task-register.hh') diff --git a/tiger-compiler/src/task/task-register.hh b/tiger-compiler/src/task/task-register.hh new file mode 100644 index 0000000..6608e02 --- /dev/null +++ b/tiger-compiler/src/task/task-register.hh @@ -0,0 +1,118 @@ +/** + ** \file task/task-register.hh + ** \brief Declare the task::TaskRegister class. + ** + */ + +#pragma once + +#include +#include +#include +#include + +#include + +#include +#include + +namespace task +{ + /** \brief Register Tasks. + + The purpose of the TaskRegister class is to collect tasks + and organize their execution using their dependencies (like 'make'). + For modeling details, see Design Patterns: singleton. + */ + class TaskRegister + { + // Make it non-copyable. + TaskRegister(const TaskRegister&) = delete; + TaskRegister& operator=(const TaskRegister&) = delete; + + /// \name Ctor & dtor. + private: + /// Construct a TaskRegister. + TaskRegister() = default; + + public: + /// Access to the unique TaskRegister. + static TaskRegister& instance(); + + /** \name Tasks registering. + ** \{ */ + /// Register task \a task. + void register_task(const SimpleTask& task); + void register_task(const ArgumentTask& task); + /// Register the task \a task_name for execution. + void enable_task(const std::string& task_name); + + /// Return the number of tasks to execute. + int nb_of_task_to_execute_get(); + /** \} */ + + /// \name Task reordering. + private: + /** \brief Resolve dependencies between tasks. + ** + ** Resolve dependencies on tasks registered for execution. + ** Make a depth first search of implicit tasks graph, + ** check cycles and build an ordered list of tasks. */ + void resolve_dependencies(const Task& task); + + public: + /** \brief Parse \a argv and determine which tasks to execute. + ** + ** Use boost::program_options. */ + char* parse_arg(int argc, char* argv[]); + + /** \name Display TaskRegister content. + ** \{ */ + /// Display registered Tasks. + std::ostream& print_task_list(std::ostream& ostr); + /// Display task graph. + std::ostream& print_task_graph(std::ostream& ostr); + /// Display registered Tasks execution order. + std::ostream& print_task_order(std::ostream& ostr); + + /** \name Using registered Tasks. + ** \{ */ + /// Execute tasks, checking dependencies. + void execute(); + /** \} */ + + /** \name Time management. + ** \{ */ + /// Access to the tasks timer. + const misc::timer& timer_get() const; + /** \} */ + + /// Ordered vector of tasks. + using tasks_list_type = std::vector; + + private: + /// Associate a task name to a task. + using tasks_by_name_type = std::map; + /// Associate a module name to a task module. + using indexed_module_type = + std::map; + + // Common code between the two overload of `register_task'. + indexed_module_type::iterator register_task_(const Task& task); + + /// 'string to task' map. + tasks_by_name_type task_list_; + + /// 'ordered for execution' tasks list. + tasks_list_type task_order_; + + /// Tasks timer. + misc::timer timer_; + + /// Task modules. + indexed_module_type modules_; + }; + +} // namespace task + +#include -- cgit v1.2.3