/* * listener_array.h * * @date Jan 1, 2013 * @author Andrey Belomutskiy, (c) 2012-2017 */ #ifndef LISTENER_ARRAY_H_ #define LISTENER_ARRAY_H_ #include #include "rusefi_types.h" #include "error_handling.h" // todo: reorder parameters for consistency? typedef void (*IntIntVoidListener)(int value1, int value2, void *arg); // todo: rename 'Arg' to 'Void'? typedef void (*ArgListener)(void *arg); typedef void (*ArgIntListener)(void *arg, int value); // todo: rename this class, that's not just 'callback(int param) anymore template class IntListenerArray { public: IntListenerArray(); void clear(); void registerCallback(VoidInt handler, void *arg); void registerCallback(Void listener); void invokeJustArgCallbacks(); int currentListenersCount; VoidInt callbacks[MAX_INT_LISTENER_COUNT]; void * args[MAX_INT_LISTENER_COUNT]; }; //template //void invokeCallbacks(IntListenerArray *array, int value); // //template //void invokeJustArgCallbacks(IntListenerArray *array); // //template //void invokeArgIntCallbacks(IntListenerArray *array, int value); // //template //void invokeIntIntCallbacks(IntListenerArray *array, int value, int value2); // //template //void invokeIntIntVoidCallbacks(IntListenerArray *array, int value, int value2); //template //void clearCallbacks(IntListenerArray *array); template IntListenerArray::IntListenerArray() { clear(); } template void IntListenerArray::clear() { currentListenersCount = 0; memset(&args, 0, sizeof(args)); memset(&callbacks, 0, sizeof(callbacks)); } template void IntListenerArray::registerCallback(VoidInt handler, void *arg) { efiAssertVoid(currentListenersCount < MAX_INT_LISTENER_COUNT, "Too many callbacks"); int index = currentListenersCount++; callbacks[index] = handler; args[index] = arg; } template void IntListenerArray::registerCallback(Void listener) { registerCallback((VoidInt)listener, NULL); } template void invokeCallbacks(IntListenerArray *array, int value) { for (int i = 0; i < array->currentListenersCount; i++) (array->callbacks[i])(value); } template void IntListenerArray::invokeJustArgCallbacks() { for (int i = 0; i < currentListenersCount; i++) { VoidPtr listener = (VoidPtr)callbacks[i]; void *arg = args[i]; (listener)(arg); } } template void invokeArgIntCallbacks(IntListenerArray *array, int value) { for (int i = 0; i < array->currentListenersCount; i++) { ArgIntListener listener = (ArgIntListener)array->callbacks[i]; void *arg = array->args[i]; (listener)(arg, value); } } template void invokeIntIntCallbacks(IntListenerArray *array, int value, int value2) { for (int i = 0; i < array->currentListenersCount; i++) { VoidIntInt listener = (VoidIntInt)array->callbacks[i]; (listener)(value, value2); } } template void invokeIntIntVoidCallbacks(IntListenerArray *array, int value, int value2) { for (int i = 0; i < array->currentListenersCount; i++) { IntIntVoidListener listener = (IntIntVoidListener)array->callbacks[i]; (listener)(value, value2, array->args[i]); } } template void clearCallbacks(IntListenerArray *array) { array->currentListenersCount = 0; } #endif /* LISTENER_ARRAY_H_ */