1 #pragma once
2 
3 #include <functional>
4 #include <map>
5 #include <string>
6 #include <iostream>
7 
8 namespace openpower
9 {
10 namespace util
11 {
12 
13 using ProcedureName = std::string;
14 using ProcedureFunction = std::function<void()>;
15 using ProcedureMap = std::map<ProcedureName, ProcedureFunction>;
16 
17 /**
18  * This macro can be used in each procedure cpp file to make it
19  * available to the openpower-proc-control executable.
20  */
21 #define REGISTER_PROCEDURE(name, func) \
22   namespace func##_ns \
23   { \
24     openpower::util::Registration r{ \
25         std::move(name), std::move(func)}; \
26   }
27 
28 
29 /**
30  * Used to register procedures.  Each procedure function can then
31  * be found in a map via its name.
32  */
33 class Registration
34 {
35     public:
36 
37         /**
38          *  Adds the procedure name and function to the internal
39          *  procedure map.
40          *
41          *  @param[in] name - the procedure name
42          *  @param[in] function - the function to run
43          */
44         Registration(ProcedureName&& name,
45                      ProcedureFunction&& function)
46         {
47             procedures.emplace(std::move(name), std::move(function));
48         }
49 
50         /**
51          * Returns the map of procedures
52          */
53         static const ProcedureMap& getProcedures()
54         {
55             return procedures;
56         }
57 
58     private:
59 
60         static ProcedureMap procedures;
61 };
62 
63 }
64 }
65