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