11#include "wpi/util/Compiler.hpp"
45 if (callback ==
nullptr) {
51 return m_callbacks->emplace_back(param, callback) + 1;
54 LLVM_ATTRIBUTE_ALWAYS_INLINE
void DoReset() {
72template <
typename CallbackFunction, const
char* (*GetName)()>
75 int32_t
Register(CallbackFunction callback,
void* param) {
80 template <
typename... U>
84 const char*
name = GetName();
86 reinterpret_cast<CallbackFunction
>(cb.callback)(
name, cb.param,
87 std::forward<U>(u)...);
92 template <
typename... U>
93 LLVM_ATTRIBUTE_ALWAYS_INLINE
void operator()(U&&... u)
const {
94 return Invoke(std::forward<U>(u)...);
103#define HAL_SIMCALLBACKREGISTRY_DEFINE_NAME(NAME) \
104 static LLVM_ATTRIBUTE_ALWAYS_INLINE constexpr const char* \
105 Get##NAME##Name() { \
123#define HAL_SIMCALLBACKREGISTRY_DEFINE_CAPI(TYPE, NS, CAPINAME, DATA, \
125 int32_t NS##_Register##CAPINAME##Callback(int32_t index, TYPE callback, \
127 return DATA[index].LOWERNAME.Register(callback, param); \
130 void NS##_Cancel##CAPINAME##Callback(int32_t index, int32_t uid) { \
131 DATA[index].LOWERNAME.Cancel(uid); \
147#define HAL_SIMCALLBACKREGISTRY_DEFINE_CAPI_NOINDEX(TYPE, NS, CAPINAME, DATA, \
149 int32_t NS##_Register##CAPINAME##Callback(TYPE callback, void* param) { \
150 return DATA->LOWERNAME.Register(callback, param); \
153 void NS##_Cancel##CAPINAME##Callback(int32_t uid) { \
154 DATA->LOWERNAME.Cancel(uid); \
169#define HAL_SIMCALLBACKREGISTRY_STUB_CAPI(TYPE, NS, CAPINAME) \
170 int32_t NS##_Register##CAPINAME##Callback(int32_t index, TYPE callback, \
175 void NS##_Cancel##CAPINAME##Callback(int32_t index, int32_t uid) {}
188#define HAL_SIMCALLBACKREGISTRY_STUB_CAPI_NOINDEX(TYPE, NS, CAPINAME) \
189 int32_t NS##_Register##CAPINAME##Callback(TYPE callback, void* param) { \
193 void NS##_Cancel##CAPINAME##Callback(int32_t uid) {}
@ name
Definition base.h:690
Simulation callback registry.
Definition SimCallbackRegistry.hpp:73
LLVM_ATTRIBUTE_ALWAYS_INLINE void operator()(U &&... u) const
Definition SimCallbackRegistry.hpp:93
int32_t Register(CallbackFunction callback, void *param)
Definition SimCallbackRegistry.hpp:75
void Invoke(U &&... u) const
Definition SimCallbackRegistry.hpp:81
Definition SimCallbackRegistry.hpp:19
void Reset()
Definition SimCallbackRegistry.hpp:35
void(*)() RawFunctor
Definition SimCallbackRegistry.hpp:21
std::unique_ptr< CallbackVector > m_callbacks
Definition SimCallbackRegistry.hpp:61
wpi::util::UidVector< HalCallbackListener< RawFunctor >, 4 > CallbackVector
Definition SimCallbackRegistry.hpp:24
wpi::util::recursive_spinlock m_mutex
Definition SimCallbackRegistry.hpp:60
int32_t DoRegister(RawFunctor callback, void *param)
Definition SimCallbackRegistry.hpp:43
LLVM_ATTRIBUTE_ALWAYS_INLINE void DoReset()
Definition SimCallbackRegistry.hpp:54
wpi::util::recursive_spinlock & GetMutex()
Definition SimCallbackRegistry.hpp:40
void Cancel(int32_t uid)
Definition SimCallbackRegistry.hpp:28
Vector which provides an integrated freelist for removal and reuse of individual elements.
Definition UidVector.hpp:72
Definition SimCallbackRegistry.hpp:17
WPILib Hardware Abstraction Layer (HAL) namespace.
Definition Types.hpp:9
recursive_spinlock1 recursive_spinlock
Definition spinlock.hpp:141