|
41 | 41 | #include <string>
|
42 | 42 | #include <unordered_map>
|
43 | 43 | #include <unordered_set>
|
| 44 | +#include <array> |
44 | 45 |
|
45 | 46 | using namespace std;
|
46 | 47 | using namespace DFHack;
|
@@ -140,24 +141,58 @@ static void manageInteractionEvent(color_ostream& out);
|
140 | 141 |
|
141 | 142 | typedef void (*eventManager_t)(color_ostream&);
|
142 | 143 |
|
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 | +} |
161 | 196 |
|
162 | 197 | //job initiated
|
163 | 198 | static int32_t lastJobId = -1;
|
@@ -312,6 +347,7 @@ void DFHack::EventManager::onStateChange(color_ostream& out, state_change_event
|
312 | 347 | }
|
313 | 348 |
|
314 | 349 | void DFHack::EventManager::manageEvents(color_ostream& out) {
|
| 350 | + static const std::array<eventManager_t, EventType::EVENT_MAX> eventManager = compileManagerArray(); |
315 | 351 | if ( !gameLoaded ) {
|
316 | 352 | return;
|
317 | 353 | }
|
|
0 commit comments