@@ -10,20 +10,20 @@ namespace MoniLogger
10
10
std::map<std::string, std::list<py::function>> event_to_moniloggers;
11
11
std::map<std::string, std::list<py::function>> pending_moniloggers;
12
12
std::map<std::string, size_t > base_events;
13
- std::map<std::string, std::list<std::string>> composite_events ;
13
+ std::map<std::string, std::list<std::string>> complex_events ;
14
14
std::shared_ptr<py::scoped_interpreter> guard;
15
15
16
16
bool is_event_registered (std::string event_name)
17
17
{
18
18
auto base_event = base_events.find (event_name);
19
- auto composite_event = composite_events .find (event_name);
20
- return composite_event != composite_events .end () || base_event != base_events.end ();
19
+ auto complex_event = complex_events .find (event_name);
20
+ return complex_event != complex_events .end () || base_event != base_events.end ();
21
21
}
22
22
23
23
std::vector<size_t > get_event_ids (std::string event_name)
24
24
{
25
- auto triggering_events = composite_events .find (event_name);
26
- if (triggering_events != composite_events .end ())
25
+ auto triggering_events = complex_events .find (event_name);
26
+ if (triggering_events != complex_events .end ())
27
27
{
28
28
std::vector<size_t > result;
29
29
for (auto triggering_event_name : triggering_events->second )
@@ -48,54 +48,7 @@ namespace MoniLogger
48
48
}
49
49
}
50
50
51
- // /**
52
- // * @brief Registers the event if it was not registered already.
53
- // * @throws std::invalid_argument If the event is registered as a composite event.
54
- // *
55
- // * @param event_name name of the base event to register.
56
- // * @return size_t id already associated to the event, whether the event was
57
- // * already registered or not.
58
- // */
59
- // size_t register_base_event(std::string event_name)
60
- // {
61
- // if (composite_events.find(event_name) == composite_events.end())
62
- // {
63
- // auto id = base_events.find(event_name);
64
- // if (id == base_events.end())
65
- // {
66
- // size_t event_id;
67
- // // If the event is not yet registered
68
- // if (available_event_ids.empty())
69
- // {
70
- // // If no event id is available, compute a fresh one
71
- // event_id = = base_events.size()
72
- // base_events[event_name] = event_id;
73
- // // Add the corresponding list of moniloggers
74
- // registered_moniloggers.emplace_back(std::list<py::function>());
75
-
76
- // } else {
77
- // // Otherwise, use the oldest available id
78
- // event_id = available_event_ids.pop_front();
79
- // base_events[event_name] = event_id;
80
- // // Clear the corresponding list of moniloggers (just in case...)
81
- // registered_moniloggers[id].clear();
82
- // }
83
- // return id;
84
- // }
85
- // } else {
86
- // throw std::invalid_argument(event_name + "is already registered as a composite event.");
87
- // }
88
- // }
89
-
90
- /* *
91
- * @brief Registers the event as a composite event triggered by the provided list of events.
92
- * @throws std::invalid_argument If the event to register already exists, or if any of the
93
- * listed triggering events does not exist.
94
- *
95
- * @param event_name name of the composite event to register.
96
- * @param triggering_events events (base or composite) triggering the composite event to register.
97
- */
98
- void register_composite_event (std::string event_name, std::list<std::string> triggering_events)
51
+ void register_complex_event (std::string event_name, std::list<std::string> triggering_events)
99
52
{
100
53
if (is_event_registered (event_name))
101
54
{
@@ -114,7 +67,7 @@ namespace MoniLogger
114
67
throw std::invalid_argument (" No event named " + triggering_event + " was found." );
115
68
}
116
69
}
117
- composite_events [event_name] = std::list<std::string>(triggering_events);
70
+ complex_events [event_name] = std::list<std::string>(triggering_events);
118
71
119
72
for (auto monilogger : pending_moniloggers[event_name])
120
73
{
@@ -124,38 +77,36 @@ namespace MoniLogger
124
77
}
125
78
}
126
79
127
- void register_composite_events (std::map<std::string, std::list<std::string>> composite_events )
80
+ void register_complex_events (std::map<std::string, std::list<std::string>> complex_events )
128
81
{
129
- for (auto execution_event : composite_events )
82
+ for (auto execution_event : complex_events )
130
83
{
131
- register_composite_event (execution_event.first , execution_event.second );
84
+ register_complex_event (execution_event.first , execution_event.second );
132
85
}
133
86
}
134
87
135
- void register_base_events (std::map<std:: string, size_t > events )
88
+ size_t register_base_event (std::string event_name )
136
89
{
137
- size_t size (0 );
138
- for (auto it = events.begin (); it != events.end (); ++it)
139
- {
140
- size = std::max (size, it->second );
141
- }
142
- size++;
143
-
144
- registered_moniloggers.reserve (size);
145
- for (size_t i = 0 ; i < size; i++)
90
+ const auto i = base_events.find (event_name);
91
+ if (i == base_events.end ())
146
92
{
147
- registered_moniloggers.emplace_back (std::list<py::function>());
148
- }
149
-
150
- base_events = std::map<std::string, size_t >(events);
151
-
152
- for (auto const & [event_name, val] : base_events)
153
- {
154
- for (auto monilogger : pending_moniloggers[event_name])
93
+ const auto j = complex_events.find (event_name);
94
+ if (j != complex_events.end ())
155
95
{
156
- register_monilogger (event_name, monilogger);
96
+ throw std::invalid_argument (" Event " + event_name + " is already registered as a complex event." );
97
+ } else {
98
+ const size_t result = base_events.size ();
99
+ base_events[event_name] = result;
100
+ registered_moniloggers.emplace_back ();
101
+ for (auto monilogger : pending_moniloggers[event_name])
102
+ {
103
+ registered_moniloggers[result].push_back (std::move (monilogger));
104
+ }
105
+ pending_moniloggers.erase (event_name);
106
+ return result;
157
107
}
158
- pending_moniloggers.erase (event_name);
108
+ } else {
109
+ return i->second ;
159
110
}
160
111
}
161
112
@@ -169,13 +120,6 @@ namespace MoniLogger
169
120
return result;
170
121
}
171
122
172
- void clear_events ()
173
- {
174
- base_events.clear ();
175
- composite_events.clear ();
176
- registered_moniloggers.clear ();
177
- }
178
-
179
123
void register_monilogger (std::string event_name, py::function monilogger)
180
124
{
181
125
// Retrieve each base event triggering this event.
@@ -184,18 +128,19 @@ namespace MoniLogger
184
128
{
185
129
// If no base event exists yet, the event name has not been declared yet,
186
130
// add the monilogger to the list of pending moniloggers for that event.
187
- pending_moniloggers[event_name].emplace_back ( monilogger);
131
+ pending_moniloggers[event_name].push_back ( std::move ( monilogger) );
188
132
} else {
189
133
std::list<py::function> event_moniloggers = event_to_moniloggers[event_name];
190
134
// Make sure a monilogger can only be registered once.
191
135
if (std::find (event_moniloggers.begin (), event_moniloggers.end (), monilogger) == event_moniloggers.end ())
192
136
{
193
137
// Add the monilogger to the list of registered moniloggers for this event name.
194
- event_to_moniloggers[event_name].emplace_back ( monilogger);
138
+ event_to_moniloggers[event_name].push_back ( std::move ( monilogger) );
195
139
for (auto id : ids)
196
140
{
197
141
// Add the monilogger to the list of registered moniloggers for each base event.
198
- registered_moniloggers[id].push_back (monilogger);
142
+ // TODO: add to pending moniloggers if the base event does not exist yet.
143
+ registered_moniloggers[id].push_back (std::move (monilogger));
199
144
}
200
145
}
201
146
0 commit comments