13 #include <wpi/Compiler.h>
14 #include <wpi/UidVector.h>
15 #include <wpi/spinlock.h>
17 #include "mockdata/NotifyListener.h"
25 using RawFunctor = void (*)();
31 void Cancel(int32_t uid) {
32 std::lock_guard<wpi::recursive_spinlock> lock(m_mutex);
33 if (m_callbacks) m_callbacks->erase(uid - 1);
37 std::lock_guard<wpi::recursive_spinlock> lock(m_mutex);
44 int32_t DoRegister(RawFunctor callback,
void* param) {
46 if (callback ==
nullptr)
return -1;
47 if (!m_callbacks) m_callbacks = std::make_unique<CallbackVector>();
48 return m_callbacks->emplace_back(param, callback) + 1;
51 LLVM_ATTRIBUTE_ALWAYS_INLINE
void DoReset() {
52 if (m_callbacks) m_callbacks->clear();
56 std::unique_ptr<CallbackVector> m_callbacks;
67 template <
typename CallbackFunction, const
char* (*GetName)()>
70 int32_t Register(CallbackFunction callback,
void* param) {
71 std::lock_guard<wpi::recursive_spinlock> lock(m_mutex);
72 return DoRegister(reinterpret_cast<RawFunctor>(callback), param);
75 template <
typename... U>
76 void Invoke(U&&... u)
const {
77 std::lock_guard<wpi::recursive_spinlock> lock(m_mutex);
79 const char* name = GetName();
80 for (
auto&& cb : *m_callbacks)
81 reinterpret_cast<CallbackFunction
>(cb.callback)(name, cb.param,
82 std::forward<U>(u)...);
86 template <
typename... U>
87 LLVM_ATTRIBUTE_ALWAYS_INLINE
void operator()(U&&... u)
const {
88 return Invoke(std::forward<U>(u)...);
97 #define HAL_SIMCALLBACKREGISTRY_DEFINE_NAME(NAME) \
98 static LLVM_ATTRIBUTE_ALWAYS_INLINE constexpr const char* \
117 #define HAL_SIMCALLBACKREGISTRY_DEFINE_CAPI(TYPE, NS, CAPINAME, DATA, \
119 int32_t NS##_Register##CAPINAME##Callback(int32_t index, TYPE callback, \
121 return DATA[index].LOWERNAME.Register(callback, param); \
124 void NS##_Cancel##CAPINAME##Callback(int32_t index, int32_t uid) { \
125 DATA[index].LOWERNAME.Cancel(uid); \
141 #define HAL_SIMCALLBACKREGISTRY_DEFINE_CAPI_NOINDEX(TYPE, NS, CAPINAME, DATA, \
143 int32_t NS##_Register##CAPINAME##Callback(TYPE callback, void* param) { \
144 return DATA->LOWERNAME.Register(callback, param); \
147 void NS##_Cancel##CAPINAME##Callback(int32_t uid) { \
148 DATA->LOWERNAME.Cancel(uid); \
Definition: SimCallbackRegistry.h:23
Simulation callback registry.
Definition: SimCallbackRegistry.h:68
A recursive spinlock mutex.
Definition: spinlock.h:46
WPILib Hardware Abstraction Layer (HAL) namespace.
Definition: SimDataValue.h:19
Definition: UidVector.h:71