Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Convert the network models to the new plugin-like mechanism
[simgrid.git] / src / simgrid / module.hpp
1 /* Copyright (c) 2004-2023. The SimGrid Team. All rights reserved.          */
2
3 /* This program is free software; you can redistribute it and/or modify it
4  * under the terms of the license (GNU LGPL) which comes with this package. */
5
6 #ifndef SIMGRID_MODULE_HPP
7 #define SIMGRID_MODULE_HPP
8
9 #include <xbt/base.h>
10
11 #include <functional>
12 #include <string>
13 #include <vector>
14
15 namespace simgrid {
16
17 struct Module {
18   const char* name_;
19   const char* description_;
20   std::function<void()> init;
21   Module(const char* id, const char* desc, std::function<void()> init_fun)
22       : name_(id), description_(desc), init(init_fun)
23   {
24   }
25 };
26
27 class ModuleGroup {
28   std::vector<Module> table_;
29   const std::string kind_; // either 'plugin' or 'CPU model' or whatever. Used in error messages only
30 public:
31   ModuleGroup(std::string kind) : kind_(kind) {}
32
33   ModuleGroup& add(const char* id, const char* desc, std::function<void()> init);
34   Module const& by_name(const std::string& name) const;
35   void help() const;
36   const std::string get_kind() const { return kind_; }
37   std::string existing_values() const;
38 };
39
40 }; // namespace simgrid
41
42 #define SIMGRID_REGISTER_PLUGIN(id, desc, init)                                                                        \
43   static void XBT_ATTRIB_CONSTRUCTOR(800) _XBT_CONCAT3(simgrid_, id, _plugin_register)()                               \
44   {                                                                                                                    \
45     simgrid_plugins().add(_XBT_STRINGIFY(id), (desc), (init));                                                         \
46   }
47
48 /** @brief The list of all available plugins */
49 inline auto& simgrid_plugins() // Function to avoid static initialization order fiasco
50 {
51   static simgrid::ModuleGroup plugins("plugin");
52   return plugins;
53 }
54
55 #define SIMGRID_REGISTER_NETWORK_MODEL(id, desc, init)                                                                 \
56   static void XBT_ATTRIB_CONSTRUCTOR(800) _XBT_CONCAT3(simgrid_, id, _network_model_register)()                        \
57   {                                                                                                                    \
58     simgrid_network_models().add(_XBT_STRINGIFY(id), (desc), (init));                                                  \
59   }
60 /** @brief The list of all available network model (pick one with --cfg=network/model) */
61 inline auto& simgrid_network_models() // Function to avoid static initialization order fiasco
62 {
63   static simgrid::ModuleGroup plugins("network model");
64   return plugins;
65 }
66
67 #endif