15 #include "HAL/Errors.h"
16 #include "HAL/Types.h"
17 #include "HAL/cpp/make_unique.h"
18 #include "HAL/cpp/priority_mutex.h"
19 #include "HAL/handles/HandlesInternal.h"
36 template <
typename THandle,
typename TStruct, int16_t size,
37 HAL_HandleEnum enumValue>
39 friend class IndexedClassedHandleResourceTest;
47 THandle Allocate(int16_t index, std::shared_ptr<TStruct> toSet,
49 std::shared_ptr<TStruct> Get(THandle handle);
50 void Free(THandle handle);
54 std::unique_ptr<std::shared_ptr<TStruct>[]> m_structures;
55 std::unique_ptr<hal::priority_mutex[]> m_handleMutexes;
58 template <
typename THandle,
typename TStruct, int16_t size,
59 HAL_HandleEnum enumValue>
62 m_structures = std::make_unique<std::shared_ptr<TStruct>[]>(size);
63 m_handleMutexes = std::make_unique<hal::priority_mutex[]>(size);
66 template <
typename THandle,
typename TStruct, int16_t size,
67 HAL_HandleEnum enumValue>
69 IndexedClassedHandleResource<THandle, TStruct, size, enumValue>::Allocate(
70 int16_t index, std::shared_ptr<TStruct> toSet, int32_t* status) {
72 if (index < 0 || index >= size) {
73 *status = RESOURCE_OUT_OF_RANGE;
74 return HAL_kInvalidHandle;
76 std::lock_guard<hal::priority_mutex> sync(m_handleMutexes[index]);
78 if (m_structures[index] !=
nullptr) {
79 *status = RESOURCE_IS_ALLOCATED;
80 return HAL_kInvalidHandle;
82 m_structures[index] = toSet;
83 return static_cast<THandle
>(hal::createHandle(index, enumValue));
86 template <
typename THandle,
typename TStruct, int16_t size,
87 HAL_HandleEnum enumValue>
88 std::shared_ptr<TStruct> IndexedClassedHandleResource<
89 THandle, TStruct, size, enumValue>::Get(THandle handle) {
91 int16_t index = getHandleTypedIndex(handle, enumValue);
92 if (index < 0 || index >= size) {
95 std::lock_guard<hal::priority_mutex> sync(m_handleMutexes[index]);
98 return m_structures[index];
101 template <
typename THandle,
typename TStruct, int16_t size,
102 HAL_HandleEnum enumValue>
103 void IndexedClassedHandleResource<THandle, TStruct, size, enumValue>::Free(
106 int16_t index = getHandleTypedIndex(handle, enumValue);
107 if (index < 0 || index >= size)
return;
109 std::lock_guard<hal::priority_mutex> sync(m_handleMutexes[index]);
110 m_structures[index].reset();
The IndexedClassedHandleResource class is a way to track handles.
Definition: IndexedClassedHandleResource.h:38