Beispiel #1
0
GBindingPool::ObjectKey GBindingPool::doMakeObjectKey(const GObjectGlueDataPointer & glueData)
{
	return ObjectKey(
		glueData->getClassData() ? glueData->getClassData()->getMetaClass() : nullptr,
		objectAddressFromVariant(glueData->getInstance()),
		glueData->getCV()
	);
}
Beispiel #2
0
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);
	}
}
Beispiel #3
0
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();
}
Beispiel #4
0
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;
}
Beispiel #5
0
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;
}
Beispiel #6
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);
}
Beispiel #7
0
void GBindingPool::objectInstanceDestroyed(const GObjectInstance * objectData)
{
	void * instance = objectAddressFromVariant(objectData->getInstance());
	this->instanceMap.erase(instance);
}
Beispiel #8
0
void GBindingPool::glueDataRemoved(const GAccessibleGlueDataPointer & glueData)
{
	const AccessibleKey key = AccessibleKey(objectAddressFromVariant(glueData->getInstance()), glueData->getAccessible());
	this->accessibleMap.erase(key);
}
Beispiel #9
0
void GBindingPool::glueDataAdded(const GAccessibleGlueDataPointer & glueData)
{
	const AccessibleKey key = AccessibleKey(objectAddressFromVariant(glueData->getInstance()), glueData->getAccessible());
	this->accessibleMap[key] = GWeakAccessibleGlueDataPointer(glueData);
}