Exemple #1
0
//------------------------------------------------------------------------------
void * reflectedCast( void * source, const TypeId & typeIdSource, const TypeId & typeIdDest, const IDefinitionManager & definitionManager )
{
	char * pRaw = static_cast< char * >( source );
	if (pRaw == nullptr)
	{
		return pRaw;
	}

	if (typeIdSource == typeIdDest)
	{
		return pRaw;
	}

	auto srcDefinition = definitionManager.getDefinition( typeIdSource.getName() );
	if (srcDefinition != nullptr)
	{
		auto dstDefinition = definitionManager.getDefinition( typeIdDest.getName() );
		if (dstDefinition != nullptr &&
			srcDefinition->canBeCastTo( *dstDefinition ))
		{
			auto result = srcDefinition->castTo( *dstDefinition, pRaw);
			assert( result != nullptr );
			return result;
		}
		else
		{
			return nullptr;
		}
	}

	return nullptr;
}
Exemple #2
0
	//------------------------------------------------------------------------------
	void forEachMetaData(
		const IClassDefinition & targetDefinition, const MetaData & metaData,
		const IDefinitionManager & definitionManager, MetaDataCallback callback) override
	{
		auto meta = &metaData;
		while (*meta != nullptr)
		{
			auto root = reflectedRoot(meta->getHandle(), definitionManager);
			auto rootDefinition = definitionManager.getDefinition(root.type().getName());
			TF_ASSERT(rootDefinition != nullptr);
			if (rootDefinition->canBeCastTo(targetDefinition))
			{
				callback(meta->getHandle());
			}
			meta = &meta->next();
		}
	}
Exemple #3
0
	//--------------------------------------------------------------------------
	ObjectHandle findFirstMetaData(
		const IClassDefinition& targetDefinition, const MetaData & metaData,
		const IDefinitionManager & definitionManager) override
	{
		auto meta = &metaData;
		while (*meta != nullptr)
		{
			auto root = reflectedRoot(meta->getHandle(), definitionManager);
			auto rootDefinition = definitionManager.getDefinition(root.type().getName());
			TF_ASSERT(rootDefinition != nullptr);
			if (rootDefinition->canBeCastTo(targetDefinition))
			{
				return meta->getHandle();
			}
			meta = &meta->next();
		}
		return nullptr;
	}