// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "Misc/TVariant.h" #include "Templates/SharedPointer.h" #include "UObject/Interface.h" #include "UObject/WeakInterfacePtr.h" #include namespace UE::PixelStreaming2 { template class TObserverVariant { public: TObserverVariant() = default; TObserverVariant(TVariant, TWeakInterfacePtr> ObserverVariant) : ObserverVariant(ObserverVariant) { } T* operator->() const { switch (ObserverVariant.GetIndex()) { case TVariant, TWeakInterfacePtr>::template IndexOfType>(): { if (TSharedPtr PinnedUserObserver = ObserverVariant.template Get>().Pin()) { return PinnedUserObserver.Get(); } break; } case TVariant, TWeakInterfacePtr>::template IndexOfType>(): { TWeakInterfacePtr WeakObserver = ObserverVariant.template Get>(); if (WeakObserver.IsValid()) { return WeakObserver.Get(); } break; } default: checkNoEntry(); } return nullptr; } operator bool() const { switch (ObserverVariant.GetIndex()) { case TVariant, TWeakInterfacePtr>::template IndexOfType>(): { return ObserverVariant.template Get>().IsValid(); } case TVariant, TWeakInterfacePtr>::template IndexOfType>(): { return ObserverVariant.template Get>().IsValid(); } default: checkNoEntry(); } return false; } private: TVariant, TWeakInterfacePtr> ObserverVariant; }; template inline TObserverVariant TObserver(TWeakPtr WeakObserver) { return TObserverVariant(TVariant, TWeakInterfacePtr>(TInPlaceType>(), WeakObserver)); } template inline TObserverVariant TObserver(TWeakInterfacePtr WeakObserver) { return TObserverVariant(TVariant, TWeakInterfacePtr>(TInPlaceType>(), WeakObserver)); } } // namespace UE::PixelStreaming2