64template<
class InterfaceType>
92 :m_sharedPtr(managedPtr)
105 m_unmanagedPtr = ptr;
115 m_sharedPtr = managedPtr;
117 m_unmanagedPtr =
nullptr;
129 m_sharedPtr = rawPtr;
131 m_unmanagedPtr =
nullptr;
137 template <
typename T>
140 if (rawPtr ==
nullptr) {
146 InterfaceType* castedPtr =
dynamic_cast<InterfaceType*
> (rawPtr);
147 if (castedPtr !=
nullptr) {
168 m_sharedPtr = sharedPtr;
170 m_unmanagedPtr =
nullptr;
181 m_sharedPtr = ptr.m_sharedPtr;
183 m_unmanagedPtr = ptr.m_unmanagedPtr;
185 ptr.m_sharedPtr.
Reset();
186 ptr.m_unmanagedPtr =
nullptr;
205 m_sharedPtr = sharedPtr;
206 m_unmanagedPtr =
nullptr;
222 if (!source.IsValid()) {
232 m_sharedPtr = sharedPtr;
233 m_unmanagedPtr =
nullptr;
234 Q_ASSERT(!source.IsValid());
247 return (m_unmanagedPtr !=
nullptr) || m_sharedPtr.
IsValid();
259 return (m_unmanagedPtr !=
nullptr);
265 m_unmanagedPtr =
nullptr;
271 template<
typename InterfaceCast = InterfaceType>
277 if (m_unmanagedPtr !=
nullptr){
278 retVal = m_unmanagedPtr;
280 else if (m_sharedPtr.
IsValid()){
281 retVal = m_sharedPtr.
GetPtr();
287 if constexpr (std::is_same_v<InterfaceCast, InterfaceType>){
291 return dynamic_cast<const InterfaceCast*
>(retVal);
296 template<
typename InterfaceCast = InterfaceType>
302 if (m_unmanagedPtr) {
303 retVal = m_unmanagedPtr;
305 else if (m_sharedPtr.
IsValid()) {
306 retVal = m_sharedPtr.
GetPtr();
312 if constexpr (std::is_same_v<InterfaceCast, InterfaceType>) {
316 return dynamic_cast<InterfaceCast*
>(retVal);
323 Q_ASSERT(
GetPtr() !=
nullptr);
331 Q_ASSERT(
GetPtr() !=
nullptr);
339 Q_ASSERT(
GetPtr() !=
nullptr);
347 Q_ASSERT(
GetPtr() !=
nullptr);
358 m_sharedPtr = ptr.m_sharedPtr;
360 m_unmanagedPtr = ptr.m_unmanagedPtr;
369 m_sharedPtr = ptr.m_sharedPtr;
371 m_unmanagedPtr = ptr.m_unmanagedPtr;
377 explicit operator bool() const noexcept
383 inline void AssertInvariant()
const
385 Q_ASSERT((m_sharedPtr.
IsValid() && (m_unmanagedPtr ==
nullptr)) || (!m_sharedPtr.
IsValid() && (m_unmanagedPtr !=
nullptr)) || (!m_sharedPtr.
IsValid() && (m_unmanagedPtr ==
nullptr)));
bool IsValid() const noexcept
Interface * GetPtr() noexcept
A wrapper for managed and unmanaged interface pointers.
const Interface & operator*() const
const Interface * operator->() const
bool SetCastedPtr(TSharedInterfacePtr< T > &source)
istd::TSharedInterfacePtr< InterfaceType > SharedInterfacePtr
bool AdoptCastedRawPtr(T *rawPtr)
void TakeOver(TOptInterfacePtr &ptr)
TOptInterfacePtr(const TOptInterfacePtr &ptr)
Copy constructor.
void SetManagedPtr(SharedInterfacePtr managedPtr)
const InterfaceCast * GetPtr() const
TOptInterfacePtr(TOptInterfacePtr &&) noexcept=default
TOptInterfacePtr(UniqueInterfacePtr &managedPtr)
void SetUnmanagedPtr(Interface *ptr)
TOptInterfacePtr(SharedInterfacePtr managedPtr)
istd::TUniqueInterfacePtr< InterfaceType > UniqueInterfacePtr
bool TakeOver(TUniqueInterfacePtr< T > &source)
bool TakeOver(TUniqueInterfacePtr< T > &&source)
static TOptInterfacePtr FromUnmanaged(InterfaceType *ptr)
void AdoptRawPtr(Interface *rawPtr)
Adopts ownership of a raw pointer.The pointer must be allocated in a manner compatible with SharedInt...
TOptInterfacePtr & operator=(const TOptInterfacePtr &ptr)
Assign operator.
Shared ownership smart pointer for interface types.
static TSharedInterfacePtr CreateFromUnique(TUniqueInterfacePtr< OtherInterface > &uniquePtr) noexcept
Create a shared pointer from unique pointer of other type by transferring ownership if dynamic_cast s...
bool SetCastedPtr(TSharedInterfacePtr< SourceInterfaceType > &source) noexcept
Set from another shared pointer if dynamic_cast succeeds.
TSharedInterfacePtr & FromUnique(TUniqueInterfacePtr< DerivedType > &&uniquePtr) noexcept
Convert from unique to shared.
Unique ownership smart pointer for interface types.