15 #include "HAL/Types.h"
16 #include "HAL/cpp/priority_mutex.h"
17 #include "HAL/handles/HandlesInternal.h"
35 template <
typename THandle,
typename TStruct, HAL_HandleEnum enumValue>
37 friend class UnlimitedHandleResourceTest;
44 THandle Allocate(std::shared_ptr<TStruct> structure);
45 std::shared_ptr<TStruct> Get(THandle handle);
46 void Free(THandle handle);
47 void ResetHandles()
override;
50 std::vector<std::shared_ptr<TStruct>> m_structures;
54 template <
typename THandle,
typename TStruct, HAL_HandleEnum enumValue>
56 std::shared_ptr<TStruct> structure) {
57 std::lock_guard<hal::priority_mutex> sync(m_handleMutex);
59 for (i = 0; i < m_structures.size(); i++) {
60 if (m_structures[i] ==
nullptr) {
61 m_structures[i] = structure;
62 return static_cast<THandle
>(createHandle(i, enumValue, m_version));
65 if (i >= INT16_MAX)
return HAL_kInvalidHandle;
67 m_structures.push_back(structure);
68 return static_cast<THandle
>(
69 createHandle(static_cast<int16_t>(i), enumValue, m_version));
72 template <
typename THandle,
typename TStruct, HAL_HandleEnum enumValue>
73 std::shared_ptr<TStruct>
74 UnlimitedHandleResource<THandle, TStruct, enumValue>::Get(THandle handle) {
75 int16_t index = getHandleTypedIndex(handle, enumValue, m_version);
76 std::lock_guard<hal::priority_mutex> sync(m_handleMutex);
77 if (index < 0 || index >= static_cast<int16_t>(m_structures.size()))
79 return m_structures[index];
82 template <
typename THandle,
typename TStruct, HAL_HandleEnum enumValue>
83 void UnlimitedHandleResource<THandle, TStruct, enumValue>::Free(
85 int16_t index = getHandleTypedIndex(handle, enumValue, m_version);
86 std::lock_guard<hal::priority_mutex> sync(m_handleMutex);
87 if (index < 0 || index >= static_cast<int16_t>(m_structures.size()))
return;
88 m_structures[index].reset();
91 template <
typename THandle,
typename TStruct, HAL_HandleEnum enumValue>
92 void UnlimitedHandleResource<THandle, TStruct, enumValue>::ResetHandles() {
94 std::lock_guard<hal::priority_mutex> lock(m_handleMutex);
95 for (
size_t i = 0; i < m_structures.size(); i++) {
96 m_structures[i].reset();
99 HandleBase::ResetHandles();
The UnlimitedHandleResource class is a way to track handles.
Definition: UnlimitedHandleResource.h:36
Definition: HandlesInternal.h:26
Definition: priority_mutex.h:57