95 lines
2.5 KiB
C++
95 lines
2.5 KiB
C++
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
|
|
#pragma once
|
|
|
|
#include "OculusXRAsyncRequestBase.h"
|
|
#include <Templates/SharedPointer.h>
|
|
#include <atomic>
|
|
|
|
namespace OculusXR
|
|
{
|
|
class FAsyncRequestSystem
|
|
{
|
|
public:
|
|
FAsyncRequestSystem();
|
|
|
|
static OCULUSXRASYNCREQUEST_API FAsyncRequestBase::EventId GenerateEventId();
|
|
|
|
template <typename RequestType, typename... TArgs>
|
|
static TSharedPtr<RequestType> CreateRequest(TArgs&&... Args)
|
|
{
|
|
auto request = MakeShared<RequestType>(std::forward<TArgs>(Args)...);
|
|
GetInstance().Requests.Add(request->GetEventId(), request);
|
|
|
|
return request;
|
|
}
|
|
|
|
static void RemoveRequest(FAsyncRequestBase::EventId Id)
|
|
{
|
|
auto& systemInstance = GetInstance();
|
|
auto foundPtr = systemInstance.Requests.Find(Id);
|
|
if (foundPtr)
|
|
{
|
|
systemInstance.RequestIdToEventIdMap.Remove((*foundPtr)->GetRequestId());
|
|
systemInstance.Requests.Remove(Id);
|
|
}
|
|
}
|
|
|
|
template <typename RequestType>
|
|
static TSharedPtr<RequestType> GetRequest(FAsyncRequestBase::EventId Id)
|
|
{
|
|
auto foundRequestPtr = GetInstance().Requests.Find(Id);
|
|
if (foundRequestPtr != nullptr)
|
|
{
|
|
return StaticCastSharedPtr<RequestType>(*foundRequestPtr);
|
|
}
|
|
|
|
return nullptr;
|
|
}
|
|
|
|
template <typename RequestType>
|
|
static TSharedPtr<RequestType> GetRequest(FAsyncRequestBase::RequestId Id)
|
|
{
|
|
auto& systemInstance = GetInstance();
|
|
|
|
auto foundEventId = systemInstance.RequestIdToEventIdMap.Find(Id);
|
|
if (foundEventId != nullptr)
|
|
{
|
|
auto foundRequestPtr = systemInstance.Requests.Find(*foundEventId);
|
|
if (foundRequestPtr)
|
|
{
|
|
return StaticCastSharedPtr<RequestType>(*foundRequestPtr);
|
|
}
|
|
}
|
|
|
|
return nullptr;
|
|
}
|
|
|
|
template <typename RequestType>
|
|
static void SetRequestId(FAsyncRequestBase::EventId EventId, FAsyncRequestBase::RequestId RequestId)
|
|
{
|
|
GetInstance().RequestIdToEventIdMap.Add(RequestId, EventId);
|
|
}
|
|
|
|
template <typename RequestType>
|
|
static void CompleteRequest(FAsyncRequestBase::EventId EventId, const typename RequestType::FResultType& Result)
|
|
{
|
|
auto& systemInstance = GetInstance();
|
|
|
|
auto request = systemInstance.GetRequest<RequestType>(EventId);
|
|
if (request.IsValid())
|
|
{
|
|
request->RequestCompleted(Result);
|
|
systemInstance.RemoveRequest(EventId);
|
|
}
|
|
}
|
|
|
|
private:
|
|
static OCULUSXRASYNCREQUEST_API FAsyncRequestSystem& GetInstance();
|
|
|
|
TMap<FAsyncRequestBase::EventId, TSharedPtr<FAsyncRequestBase>> Requests;
|
|
TMap<FAsyncRequestBase::RequestId, FAsyncRequestBase::EventId> RequestIdToEventIdMap;
|
|
std::atomic<uint64_t> EventIdCounter;
|
|
};
|
|
} // namespace OculusXR
|