//------------------------------------------------------------------------------ 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; }
//------------------------------------------------------------------------------ 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(); } }
//-------------------------------------------------------------------------- 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; }