29template <
typename THandle,
typename TStruct, int16_t size,
40 THandle
Allocate(std::shared_ptr<TStruct> toSet);
44 std::shared_ptr<TStruct>
Get(THandle handle);
45 void Free(THandle handle);
49 std::array<std::shared_ptr<TStruct>, size> m_structures;
50 std::array<wpi::util::mutex, size> m_handleMutexes;
54template <
typename THandle,
typename TStruct, int16_t size,
58 std::shared_ptr<TStruct> toSet) {
60 std::scoped_lock lock(m_allocateMutex);
61 for (int16_t i = 0; i < size; i++) {
62 if (m_structures[i] ==
nullptr) {
65 std::scoped_lock lock(m_handleMutexes[i]);
66 m_structures[i] = toSet;
73template <
typename THandle,
typename TStruct, int16_t size,
75std::shared_ptr<TStruct>
83 std::scoped_lock lock(m_handleMutexes[
index]);
86 return m_structures[
index];
89template <
typename THandle,
typename TStruct, int16_t size,
99 std::scoped_lock allocateLock(m_allocateMutex);
100 std::scoped_lock handleLock(m_handleMutexes[
index]);
101 m_structures[
index].reset();
104template <
typename THandle,
typename TStruct, int16_t size,
109 std::scoped_lock allocateLock(m_allocateMutex);
110 for (
int i = 0; i < size; i++) {
111 std::scoped_lock handleLock(m_handleMutexes[i]);
112 m_structures[i].reset();
@ index
Definition base.h:690
virtual void ResetHandles()
int16_t m_version
Definition HandlesInternal.hpp:37
The LimitedClassedHandleResource class is a way to track handles.
Definition LimitedClassedHandleResource.hpp:31
void Free(THandle handle)
Definition LimitedClassedHandleResource.hpp:91
LimitedClassedHandleResource & operator=(const LimitedClassedHandleResource &)=delete
friend class LimitedClassedHandleResourceTest
Definition LimitedClassedHandleResource.hpp:32
LimitedClassedHandleResource()=default
LimitedClassedHandleResource(const LimitedClassedHandleResource &)=delete
int16_t GetIndex(THandle handle)
Definition LimitedClassedHandleResource.hpp:41
THandle Allocate(std::shared_ptr< TStruct > toSet)
Definition LimitedClassedHandleResource.hpp:57
void ResetHandles() override
Definition LimitedClassedHandleResource.hpp:107
std::shared_ptr< TStruct > Get(THandle handle)
Definition LimitedClassedHandleResource.hpp:76
#define HAL_kInvalidHandle
Definition Types.h:15
WPILib Hardware Abstraction Layer (HAL) namespace.
Definition Types.hpp:9
HAL_HandleEnum
Enum of HAL handle types.
Definition HandlesInternal.hpp:45
int16_t getHandleTypedIndex(HAL_Handle handle, HAL_HandleEnum enumType, int16_t version)
Get if the handle is a correct type and version.
Definition HandlesInternal.hpp:135
HAL_Handle createHandle(int16_t index, HAL_HandleEnum handleType, int16_t version)
Create a handle for a specific index, type and version.
::std::mutex mutex
Definition mutex.hpp:17