GBindingPool::ObjectKey GBindingPool::doMakeObjectKey(const GObjectGlueDataPointer & glueData) { return ObjectKey( glueData->getClassData() ? glueData->getClassData()->getMetaClass() : nullptr, objectAddressFromVariant(glueData->getInstance()), glueData->getCV() ); }
void GBindingPool::objectInstanceAdded(const GObjectInstancePointer & objectData) { void * instance = objectAddressFromVariant(objectData->getInstance()); auto it = this->instanceMap.find(instance); if(it == this->instanceMap.end() || it->second.expired()) { this->instanceMap[instance] = GWeakObjectInstancePointer(objectData); } }
GObjectInstancePointer GBindingPool::findObjectInstance(const GVariant & instance) { auto it = this->instanceMap.find(objectAddressFromVariant(instance)); if(it != this->instanceMap.end() && ! it->second.expired()) { GObjectInstancePointer data(it->second); return data; } return GObjectInstancePointer(); }
GAccessibleGlueDataPointer GBindingPool::newAccessibleGlueData(void * instance, IMetaAccessible * accessible) { const AccessibleKey key = AccessibleKey(objectAddressFromVariant(instance), accessible); GAccessibleGlueDataPointer result; auto it = this->accessibleMap.find(key); if(it != this->accessibleMap.end()) { result = it->second.lock(); } if(! result) { result = GAccessibleGlueDataPointer(new GAccessibleGlueData(this->context.lock(), instance, accessible)); } return result; }
GVariant GMetaCore::cast(const GVariant & instance, IMetaClass * targetMetaClass) { GVariant value = getVariantRealValue(instance); GMetaType type = getVariantRealMetaType(instance); if(canFromVariant<void *>(value) && type.getBaseName() != NULL) { GScopedInterface<IMetaService> metaService(this->scriptObject->getMetaService()); GScopedInterface<IMetaClass> sourceClass(metaService->findClassByName(type.getBaseName())); if(sourceClass) { void * ptr = objectAddressFromVariant(instance); void * oldPtr = ptr; if(ptr != NULL) { GMetaType targetType; if(targetMetaClass != NULL) { ptr = metaCastToDerived(oldPtr, sourceClass.get(), targetMetaClass); if(ptr == NULL) { ptr = metaCastToBase(oldPtr, sourceClass.get(), targetMetaClass); } targetType = metaGetItemType(targetMetaClass); } else { GScopedInterface<IMetaClass> derivedClass(findAppropriateDerivedClass(oldPtr, sourceClass.get(), &ptr)); if(derivedClass) { targetType = metaGetItemType(derivedClass.get()); } else { ptr = NULL; } } if(ptr != NULL) { targetType.addPointer(); return createTypedVariant(pointerToObjectVariant(ptr), targetType); } } } } return (void *)0; }
GVariant GMetaOperator::invokeFunctor(const GVariant & instance, GPP_REPEAT(REF_MAX_ARITY, VAR_PARAM_DEFAULT, GPP_EMPTY)) const { const GVariant * params[REF_MAX_ARITY]; int index = 0; GPP_REPEAT(REF_MAX_ARITY, FUNCTOR_LOAD_PARAM, GPP_EMPTY); size_t paramCount = 0; while(paramCount < REF_MAX_ARITY) { if(params[paramCount]->isEmpty()) { break; } ++paramCount; } if(this->baseData->hasDefaultParam()) { paramCount = this->baseData->getDefaultParamList()->loadDefaultParams(params, paramCount, this->baseData->getParamCount()); } return this->baseData->invokeFunctor(objectAddressFromVariant(instance), params, paramCount); }
void GBindingPool::objectInstanceDestroyed(const GObjectInstance * objectData) { void * instance = objectAddressFromVariant(objectData->getInstance()); this->instanceMap.erase(instance); }
void GBindingPool::glueDataRemoved(const GAccessibleGlueDataPointer & glueData) { const AccessibleKey key = AccessibleKey(objectAddressFromVariant(glueData->getInstance()), glueData->getAccessible()); this->accessibleMap.erase(key); }
void GBindingPool::glueDataAdded(const GAccessibleGlueDataPointer & glueData) { const AccessibleKey key = AccessibleKey(objectAddressFromVariant(glueData->getInstance()), glueData->getAccessible()); this->accessibleMap[key] = GWeakAccessibleGlueDataPointer(glueData); }