Skip to content

Commit 9bf9a79

Browse files
authored
EventManager/Eventful - Generate event arrays (#2097)
* Replaces EventManager.cpp's event array with an auto-gen one * Replaces eventful.cpp's event array with auto-gen one
1 parent 5f3d5bb commit 9bf9a79

File tree

2 files changed

+111
-38
lines changed

2 files changed

+111
-38
lines changed

library/modules/EventManager.cpp

Lines changed: 54 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
#include <string>
4242
#include <unordered_map>
4343
#include <unordered_set>
44+
#include <array>
4445

4546
using namespace std;
4647
using namespace DFHack;
@@ -140,24 +141,58 @@ static void manageInteractionEvent(color_ostream& out);
140141

141142
typedef void (*eventManager_t)(color_ostream&);
142143

143-
static const eventManager_t eventManager[] = {
144-
manageTickEvent,
145-
manageJobInitiatedEvent,
146-
manageJobStartedEvent,
147-
manageJobCompletedEvent,
148-
manageNewUnitActiveEvent,
149-
manageUnitDeathEvent,
150-
manageItemCreationEvent,
151-
manageBuildingEvent,
152-
manageConstructionEvent,
153-
manageSyndromeEvent,
154-
manageInvasionEvent,
155-
manageEquipmentEvent,
156-
manageReportEvent,
157-
manageUnitAttackEvent,
158-
manageUnloadEvent,
159-
manageInteractionEvent,
160-
};
144+
// integrate new events into this function, and no longer worry about syncing the enum list with the `eventManager` array
145+
eventManager_t getManager(EventType::EventType t) {
146+
switch (t) {
147+
case EventType::TICK:
148+
return manageTickEvent;
149+
case EventType::JOB_INITIATED:
150+
return manageJobInitiatedEvent;
151+
case EventType::JOB_STARTED:
152+
return manageJobStartedEvent;
153+
case EventType::JOB_COMPLETED:
154+
return manageJobCompletedEvent;
155+
case EventType::UNIT_NEW_ACTIVE:
156+
return manageNewUnitActiveEvent;
157+
case EventType::UNIT_DEATH:
158+
return manageUnitDeathEvent;
159+
case EventType::ITEM_CREATED:
160+
return manageItemCreationEvent;
161+
case EventType::BUILDING:
162+
return manageBuildingEvent;
163+
case EventType::CONSTRUCTION:
164+
return manageConstructionEvent;
165+
case EventType::SYNDROME:
166+
return manageSyndromeEvent;
167+
case EventType::INVASION:
168+
return manageInvasionEvent;
169+
case EventType::INVENTORY_CHANGE:
170+
return manageEquipmentEvent;
171+
case EventType::REPORT:
172+
return manageReportEvent;
173+
case EventType::UNIT_ATTACK:
174+
return manageUnitAttackEvent;
175+
case EventType::UNLOAD:
176+
return manageUnloadEvent;
177+
case EventType::INTERACTION:
178+
return manageInteractionEvent;
179+
case EventType::EVENT_MAX:
180+
return nullptr;
181+
//default:
182+
//we don't do this... because then the compiler wouldn't error for missing cases in the enum
183+
}
184+
return nullptr;
185+
}
186+
187+
std::array<eventManager_t,EventType::EVENT_MAX> compileManagerArray() {
188+
std::array<eventManager_t, EventType::EVENT_MAX> managers{};
189+
auto t = (EventType::EventType) 0;
190+
while (t < EventType::EVENT_MAX) {
191+
managers[t] = getManager(t);
192+
t = (EventType::EventType) int(t + 1);
193+
}
194+
return managers;
195+
}
161196

162197
//job initiated
163198
static int32_t lastJobId = -1;
@@ -312,6 +347,7 @@ void DFHack::EventManager::onStateChange(color_ostream& out, state_change_event
312347
}
313348

314349
void DFHack::EventManager::manageEvents(color_ostream& out) {
350+
static const std::array<eventManager_t, EventType::EVENT_MAX> eventManager = compileManagerArray();
315351
if ( !gameLoaded ) {
316352
return;
317353
}

plugins/eventful.cpp

Lines changed: 57 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828

2929
#include <string.h>
3030
#include <stdexcept>
31+
#include <array>
3132

3233
using std::vector;
3334
using std::string;
@@ -223,26 +224,61 @@ static void ev_mng_interaction(color_ostream& out, void* ptr) {
223224
std::vector<int> enabledEventManagerEvents(EventManager::EventType::EVENT_MAX,-1);
224225
typedef void (*handler_t) (color_ostream&,void*);
225226

226-
// NOTICE: keep this list synchronized with the EventManager::EventType enum or
227-
// else the wrong event handlers will get called.
228-
static const handler_t eventHandlers[] = {
229-
NULL,
230-
ev_mng_jobInitiated,
231-
ev_mng_jobStarted,
232-
ev_mng_jobCompleted,
233-
ev_mng_unitNewActive,
234-
ev_mng_unitDeath,
235-
ev_mng_itemCreate,
236-
ev_mng_building,
237-
ev_mng_construction,
238-
ev_mng_syndrome,
239-
ev_mng_invasion,
240-
ev_mng_inventory,
241-
ev_mng_report,
242-
ev_mng_unitAttack,
243-
ev_mng_unload,
244-
ev_mng_interaction,
245-
};
227+
using namespace EventManager::EventType;
228+
// integrate new events into this function, and no longer worry about syncing with the enum list
229+
handler_t getManager(EventType t) {
230+
switch (t) {
231+
case TICK:
232+
return nullptr;
233+
case JOB_INITIATED:
234+
return ev_mng_jobInitiated;
235+
case JOB_STARTED:
236+
return ev_mng_jobStarted;
237+
case JOB_COMPLETED:
238+
return ev_mng_jobCompleted;
239+
case UNIT_NEW_ACTIVE:
240+
return ev_mng_unitNewActive;
241+
case UNIT_DEATH:
242+
return ev_mng_unitDeath;
243+
case ITEM_CREATED:
244+
return ev_mng_itemCreate;
245+
case BUILDING:
246+
return ev_mng_building;
247+
case CONSTRUCTION:
248+
return ev_mng_construction;
249+
case SYNDROME:
250+
return ev_mng_syndrome;
251+
case INVASION:
252+
return ev_mng_invasion;
253+
case INVENTORY_CHANGE:
254+
return ev_mng_inventory;
255+
case REPORT:
256+
return ev_mng_report;
257+
case UNIT_ATTACK:
258+
return ev_mng_unitAttack;
259+
case UNLOAD:
260+
return ev_mng_unload;
261+
case INTERACTION:
262+
return ev_mng_interaction;
263+
case EVENT_MAX:
264+
return nullptr;
265+
//default:
266+
//we don't do this... because then the compiler wouldn't error for missing cases in the enum
267+
}
268+
return nullptr;
269+
}
270+
271+
std::array<handler_t,EventManager::EventType::EVENT_MAX> compileEventHandlerArray() {
272+
std::array<handler_t, EventManager::EventType::EVENT_MAX> managers{};
273+
auto t = (EventManager::EventType::EventType) 0;
274+
while (t < EventManager::EventType::EVENT_MAX) {
275+
managers[t] = getManager(t);
276+
t = (EventManager::EventType::EventType) int(t + 1);
277+
}
278+
return managers;
279+
}
280+
static std::array<handler_t,EventManager::EventType::EVENT_MAX> eventHandlers;
281+
246282
static void enableEvent(int evType,int freq)
247283
{
248284
if (freq < 0)
@@ -483,6 +519,7 @@ DFhackCExport command_result plugin_onstatechange(color_ostream &out, state_chan
483519

484520
DFhackCExport command_result plugin_init ( color_ostream &out, std::vector <PluginCommand> &commands)
485521
{
522+
eventHandlers = compileEventHandlerArray();
486523
if (Core::getInstance().isWorldLoaded())
487524
plugin_onstatechange(out, SC_WORLD_LOADED);
488525
enable_hooks(true);

0 commit comments

Comments
 (0)