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);
53 std::array<std::shared_ptr<TStruct>[], size> m_structures;
54 std::array<hal::priority_mutex[], size> m_handleMutexes;
57 template <
typename THandle,
typename TStruct, int16_t size,
58 HAL_HandleEnum enumValue>
61 m_structures = std::make_unique<std::shared_ptr<TStruct>[]>(size);
62 m_handleMutexes = std::make_unique<hal::priority_mutex[]>(size);
65 template <
typename THandle,
typename TStruct, int16_t size,
66 HAL_HandleEnum enumValue>
68 IndexedClassedHandleResource<THandle, TStruct, size, enumValue>::Allocate(
69 int16_t index, std::shared_ptr<TStruct> toSet, int32_t* status) {
71 if (index < 0 || index >= size) {
72 *status = RESOURCE_OUT_OF_RANGE;
73 return HAL_kInvalidHandle;
75 std::lock_guard<hal::priority_mutex> sync(m_handleMutexes[index]);
77 if (m_structures[index] !=
nullptr) {
78 *status = RESOURCE_IS_ALLOCATED;
79 return HAL_kInvalidHandle;
81 m_structures[index] = toSet;
82 return static_cast<THandle
>(hal::createHandle(index, enumValue, m_version));
85 template <
typename THandle,
typename TStruct, int16_t size,
86 HAL_HandleEnum enumValue>
87 std::shared_ptr<TStruct> IndexedClassedHandleResource<
88 THandle, TStruct, size, enumValue>::Get(THandle handle) {
90 int16_t index = getHandleTypedIndex(handle, enumValue, m_version);
91 if (index < 0 || index >= size) {
94 std::lock_guard<hal::priority_mutex> sync(m_handleMutexes[index]);
97 return m_structures[index];
100 template <
typename THandle,
typename TStruct, int16_t size,
101 HAL_HandleEnum enumValue>
102 void IndexedClassedHandleResource<THandle, TStruct, size, enumValue>::Free(
105 int16_t index = getHandleTypedIndex(handle, enumValue, m_version);
106 if (index < 0 || index >= size)
return;
108 std::lock_guard<hal::priority_mutex> sync(m_handleMutexes[index]);
109 m_structures[index].reset();
112 template <
typename THandle,
typename TStruct, int16_t size,
113 HAL_HandleEnum enumValue>
114 void IndexedClassedHandleResource<THandle, TStruct, size,
115 enumValue>::ResetHandles() {
116 for (
int i = 0; i < size; i++) {
117 std::lock_guard<hal::priority_mutex> sync(m_handleMutexes[i]);
118 m_structures[i].reset();
120 HandleBase::ResetHandles();
Definition: HandlesInternal.h:26
The IndexedClassedHandleResource class is a way to track handles.
Definition: IndexedClassedHandleResource.h:38