/** * @file XTPTypeId.cpp * * @copyright * (c) 1998-2025 Codejock Software, All Rights Reserved. * * This source file is the property of Codejock Software and must not be * redistributed by any means without the explicit written permission of * Codejock Software. * * The use of this source code is governed by the terms and conditions specified * in the Toolkit Pro license agreement. Codejock Software grants you, as a * single software developer, the limited right to use this software on one * computer only. * * Contact Information: * support@codejock.com * http://www.codejock.com * */ #include "StdAfx.h" #include "Common/XTPTypeId.h" #include "Common/Base/Diagnostic/XTPDisableNoisyWarnings.h" #ifdef _DEBUG # define new DEBUG_NEW # undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif CXTPTypeIdProviderBase::DerivedList::DerivedList(CXTPTypeId derivedTypeId, CXTPTypeIdProviderBase* pTypeProvider, void* pInstance, DerivedList* pFLink) : derivedTypeId(derivedTypeId) , pTypeProvider(pTypeProvider) , pInstance(pInstance) , pFLink(pFLink) { } CXTPTypeIdProviderBase::CXTPTypeIdProviderBase(CXTPTypeId typeId) : m_typeId(typeId) , m_pDerivedList(NULL) { } CXTPTypeIdProviderBase::~CXTPTypeIdProviderBase() { DerivedList* pNode = m_pDerivedList; while (NULL != pNode) { DerivedList* pNextNode = pNode->pFLink; delete pNode; pNode = pNextNode; } } CXTPTypeId CXTPTypeIdProviderBase::GetTypeId() const { return m_typeId; } void CXTPTypeIdProviderBase::AddDerived(CXTPTypeId typeId, CXTPTypeIdProviderBase* pTypeProvider, void* pInstance) { if (typeId != m_typeId) { m_pDerivedList = new DerivedList(typeId, pTypeProvider, pInstance, m_pDerivedList); } } void* CXTPTypeIdProviderBase::TryCastTo(CXTPTypeId typeId) const { void* pCasted = NULL; DerivedList* pNode = m_pDerivedList; while (NULL != pNode) { if (pNode->derivedTypeId == typeId) { pCasted = pNode->pInstance; break; } else { pCasted = pNode->pTypeProvider->TryCastTo(typeId); if (NULL != pCasted) { break; } } pNode = pNode->pFLink; } return pCasted; }