inline sal_Bool _equalData()

in main/cppu/source/uno/eq.hxx [297:660]


inline sal_Bool _equalData(
	void * pDest,
	typelib_TypeDescriptionReference * pDestType, typelib_TypeDescription * pDestTypeDescr,
	void * pSource,
	typelib_TypeDescriptionReference * pSourceType, typelib_TypeDescription * pSourceTypeDescr,
	uno_QueryInterfaceFunc queryInterface, uno_ReleaseFunc release )
	SAL_THROW( () )
{
	typelib_TypeClass eSourceTypeClass, eDestTypeClass;
	while (typelib_TypeClass_ANY == (eDestTypeClass = pDestType->eTypeClass))
	{
		pDestTypeDescr = 0;
		pDestType = ((uno_Any *)pDest)->pType;
		pDest = ((uno_Any *)pDest)->pData;
	}
	while (typelib_TypeClass_ANY == (eSourceTypeClass = pSourceType->eTypeClass))
	{
		pSourceTypeDescr = 0;
		pSourceType = ((uno_Any *)pSource)->pType;
		pSource = ((uno_Any *)pSource)->pData;
	}
	
	switch (eDestTypeClass)
	{
	case typelib_TypeClass_VOID:
		return eSourceTypeClass == typelib_TypeClass_VOID;
	case typelib_TypeClass_CHAR:
		return eSourceTypeClass == typelib_TypeClass_CHAR
			&& *(sal_Unicode *)pDest == *(sal_Unicode *)pSource;
	case typelib_TypeClass_BOOLEAN:
		return eSourceTypeClass == typelib_TypeClass_BOOLEAN
			&& ((*(sal_Bool *)pDest != sal_False)
                == (*(sal_Bool *)pSource != sal_False));
	case typelib_TypeClass_BYTE:
		switch (eSourceTypeClass)
		{
		case typelib_TypeClass_BYTE:
			return (*(sal_Int8 *)pDest == *(sal_Int8 *)pSource);
		case typelib_TypeClass_SHORT:
			return ((sal_Int16)*(sal_Int8 *)pDest == *(sal_Int16 *)pSource);
		case typelib_TypeClass_UNSIGNED_SHORT:
			return ((sal_Int32)*(sal_Int8 *)pDest == (sal_Int32)*(sal_uInt16 *)pSource);
		case typelib_TypeClass_LONG:
			return ((sal_Int32)*(sal_Int8 *)pDest == *(sal_Int32 *)pSource);
		case typelib_TypeClass_UNSIGNED_LONG:
			return ((sal_Int64)*(sal_Int8 *)pDest == (sal_Int64)*(sal_uInt32 *)pSource);
		case typelib_TypeClass_HYPER:
			return ((sal_Int64)*(sal_Int8 *)pDest == *(sal_Int64 *)pSource);
		case typelib_TypeClass_UNSIGNED_HYPER:
			return (*(sal_Int8 *)pDest >= 0 &&
					(sal_Int64)*(sal_Int8 *)pDest == *(sal_Int64 *)pSource); // same size
		case typelib_TypeClass_FLOAT:
			return ((float)*(sal_Int8 *)pDest == *(float *)pSource);
		case typelib_TypeClass_DOUBLE:
			return ((double)*(sal_Int8 *)pDest == *(double *)pSource);
        default:
            return sal_False;
		}
	case typelib_TypeClass_SHORT:
		switch (eSourceTypeClass)
		{
		case typelib_TypeClass_BYTE:
			return (*(sal_Int16 *)pDest == (sal_Int16)*(sal_Int8 *)pSource);
		case typelib_TypeClass_SHORT:
			return (*(sal_Int16 *)pDest == *(sal_Int16 *)pSource);
		case typelib_TypeClass_UNSIGNED_SHORT:
			return ((sal_Int32)*(sal_Int16 *)pDest == (sal_Int32)*(sal_uInt16 *)pSource);
		case typelib_TypeClass_LONG:
			return ((sal_Int32)*(sal_Int16 *)pDest == *(sal_Int32 *)pSource);
		case typelib_TypeClass_UNSIGNED_LONG:
			return ((sal_Int64)*(sal_Int16 *)pDest == (sal_Int64)*(sal_uInt32 *)pSource);
		case typelib_TypeClass_HYPER:
			return ((sal_Int64)*(sal_Int16 *)pDest == *(sal_Int64 *)pSource);
		case typelib_TypeClass_UNSIGNED_HYPER:
			return (*(sal_Int16 *)pDest >= 0 &&
					(sal_Int64)*(sal_Int16 *)pDest == *(sal_Int64 *)pSource); // same size
		case typelib_TypeClass_FLOAT:
			return ((float)*(sal_Int16 *)pDest == *(float *)pSource);
		case typelib_TypeClass_DOUBLE:
			return ((double)*(sal_Int16 *)pDest == *(double *)pSource);
        default:
            return sal_False;
		}
	case typelib_TypeClass_UNSIGNED_SHORT:
		switch (eSourceTypeClass)
		{
		case typelib_TypeClass_BYTE:
			return ((sal_Int32)*(sal_uInt16 *)pDest == (sal_Int32)*(sal_Int8 *)pSource);
		case typelib_TypeClass_SHORT:
			return ((sal_Int32)*(sal_uInt16 *)pDest == (sal_Int32)*(sal_Int16 *)pSource);
		case typelib_TypeClass_UNSIGNED_SHORT:
			return (*(sal_uInt16 *)pDest == *(sal_uInt16 *)pSource);
		case typelib_TypeClass_LONG:
			return ((sal_Int32)*(sal_uInt16 *)pDest == *(sal_Int32 *)pSource);
		case typelib_TypeClass_UNSIGNED_LONG:
			return ((sal_uInt32)*(sal_uInt16 *)pDest == *(sal_uInt32 *)pSource);
		case typelib_TypeClass_HYPER:
			return ((sal_Int64)*(sal_uInt16 *)pDest == *(sal_Int64 *)pSource);
		case typelib_TypeClass_UNSIGNED_HYPER:
			return ((sal_uInt64)*(sal_uInt16 *)pDest == *(sal_uInt64 *)pSource);
		case typelib_TypeClass_FLOAT:
			return ((float)*(sal_uInt16 *)pDest == *(float *)pSource);
		case typelib_TypeClass_DOUBLE:
			return ((double)*(sal_uInt16 *)pDest == *(double *)pSource);
        default:
            return sal_False;
		}
	case typelib_TypeClass_LONG:
		switch (eSourceTypeClass)
		{
		case typelib_TypeClass_BYTE:
			return (*(sal_Int32 *)pDest == (sal_Int32)*(sal_Int8 *)pSource);
		case typelib_TypeClass_SHORT:
			return (*(sal_Int32 *)pDest == (sal_Int32)*(sal_Int16 *)pSource);
		case typelib_TypeClass_UNSIGNED_SHORT:
			return (*(sal_Int32 *)pDest == (sal_Int32)*(sal_uInt16 *)pSource);
		case typelib_TypeClass_LONG:
			return (*(sal_Int32 *)pDest == *(sal_Int32 *)pSource);
		case typelib_TypeClass_UNSIGNED_LONG:
			return ((sal_Int64)*(sal_Int32 *)pDest == (sal_Int64)*(sal_uInt32 *)pSource);
		case typelib_TypeClass_HYPER:
			return ((sal_Int64)*(sal_Int32 *)pDest == *(sal_Int64 *)pSource);
		case typelib_TypeClass_UNSIGNED_HYPER:
			return (*(sal_Int32 *)pDest >= 0 &&
					(sal_Int64)*(sal_Int32 *)pDest == *(sal_Int64 *)pSource); // same size
		case typelib_TypeClass_FLOAT:
			return ((float)*(sal_Int32 *)pDest == *(float *)pSource);
		case typelib_TypeClass_DOUBLE:
			return ((double)*(sal_Int32 *)pDest == *(double *)pSource);
        default:
            return sal_False;
		}
	case typelib_TypeClass_UNSIGNED_LONG:
		switch (eSourceTypeClass)
		{
		case typelib_TypeClass_BYTE:
			return ((sal_Int64)*(sal_uInt32 *)pDest == (sal_Int64)*(sal_Int8 *)pSource);
		case typelib_TypeClass_SHORT:
			return ((sal_Int64)*(sal_uInt32 *)pDest == (sal_Int64)*(sal_Int16 *)pSource);
		case typelib_TypeClass_UNSIGNED_SHORT:
			return (*(sal_uInt32 *)pDest == (sal_uInt32)*(sal_uInt16 *)pSource);
		case typelib_TypeClass_LONG:
			return ((sal_Int64)*(sal_uInt32 *)pDest == (sal_Int64)*(sal_Int32 *)pSource);
		case typelib_TypeClass_UNSIGNED_LONG:
			return (*(sal_uInt32 *)pDest == *(sal_uInt32 *)pSource);
		case typelib_TypeClass_HYPER:
			return ((sal_Int64)*(sal_uInt32 *)pDest == *(sal_Int64 *)pSource);
		case typelib_TypeClass_UNSIGNED_HYPER:
			return ((sal_uInt64)*(sal_uInt32 *)pDest == *(sal_uInt64 *)pSource);
		case typelib_TypeClass_FLOAT:
			return ((float)*(sal_uInt32 *)pDest == *(float *)pSource);
		case typelib_TypeClass_DOUBLE:
			return ((double)*(sal_uInt32 *)pDest == *(double *)pSource);
        default:
            return sal_False;
		}
	case typelib_TypeClass_HYPER:
		switch (eSourceTypeClass)
		{
		case typelib_TypeClass_BYTE:
			return (*(sal_Int64 *)pDest == (sal_Int64)*(sal_Int8 *)pSource);
		case typelib_TypeClass_SHORT:
			return (*(sal_Int64 *)pDest == (sal_Int64)*(sal_Int16 *)pSource);
		case typelib_TypeClass_UNSIGNED_SHORT:
			return (*(sal_Int64 *)pDest == (sal_Int64)*(sal_uInt16 *)pSource);
		case typelib_TypeClass_LONG:
			return (*(sal_Int64 *)pDest == (sal_Int64)*(sal_Int32 *)pSource);
		case typelib_TypeClass_UNSIGNED_LONG:
			return (*(sal_Int64 *)pDest == (sal_Int64)*(sal_uInt32 *)pSource);
		case typelib_TypeClass_HYPER:
			return (*(sal_Int64 *)pDest == *(sal_Int64 *)pSource);
		case typelib_TypeClass_UNSIGNED_HYPER:
			return (*(sal_Int64 *)pDest >= 0 &&
					*(sal_Int64 *)pDest == *(sal_Int64 *)pSource); // same size
		case typelib_TypeClass_FLOAT:
			return ((float)*(sal_Int64 *)pDest == *(float *)pSource);
		case typelib_TypeClass_DOUBLE:
			return ((double)*(sal_Int64 *)pDest == *(double *)pSource);
        default:
            return sal_False;
		}
	case typelib_TypeClass_UNSIGNED_HYPER:
		switch (eSourceTypeClass)
		{
		case typelib_TypeClass_BYTE:
			return (*(sal_Int8 *)pSource >= 0 &&
					*(sal_uInt64 *)pDest == (sal_uInt64)*(sal_Int8 *)pSource);
		case typelib_TypeClass_SHORT:
			return (*(sal_Int16 *)pSource >= 0 &&
					*(sal_uInt64 *)pDest == (sal_uInt64)*(sal_Int16 *)pSource);
		case typelib_TypeClass_UNSIGNED_SHORT:
			return (*(sal_uInt64 *)pDest == (sal_uInt64)*(sal_uInt16 *)pSource);
		case typelib_TypeClass_LONG:
			return (*(sal_Int32 *)pSource >= 0 &&
					*(sal_uInt64 *)pDest == (sal_uInt64)*(sal_Int32 *)pSource);
		case typelib_TypeClass_UNSIGNED_LONG:
			return (*(sal_uInt64 *)pDest == (sal_uInt64)*(sal_uInt32 *)pSource);
		case typelib_TypeClass_HYPER:
			return (*(sal_Int64 *)pSource >= 0 &&
					*(sal_uInt64 *)pDest == (sal_uInt64)*(sal_Int64 *)pSource);
		case typelib_TypeClass_UNSIGNED_HYPER:
			return (*(sal_uInt64 *)pDest == *(sal_uInt64 *)pSource);
		case typelib_TypeClass_FLOAT:
			if (::floor( *(float *)pSource ) != *(float *)pSource || *(float *)pSource < 0)
				return sal_False;
			return (*(sal_uInt64 *)pDest == (sal_uInt64)*(float *)pSource);
		case typelib_TypeClass_DOUBLE:
			if (::floor( *(double *)pSource ) != *(double *)pSource || *(double *)pSource < 0)
				return sal_False;
			return (*(sal_uInt64 *)pDest == (sal_uInt64)*(double *)pSource);
        default:
            return sal_False;
		}
	case typelib_TypeClass_FLOAT:
		switch (eSourceTypeClass)
		{
		case typelib_TypeClass_BYTE:
			return (*(float *)pDest == (float)*(sal_Int8 *)pSource);
		case typelib_TypeClass_SHORT:
			return (*(float *)pDest == (float)*(sal_Int16 *)pSource);
		case typelib_TypeClass_UNSIGNED_SHORT:
			return (*(float *)pDest == (float)*(sal_uInt16 *)pSource);
		case typelib_TypeClass_LONG:
			return (*(float *)pDest == (float)*(sal_Int32 *)pSource);
		case typelib_TypeClass_UNSIGNED_LONG:
			return (*(float *)pDest == (float)*(sal_uInt32 *)pSource);
		case typelib_TypeClass_HYPER:
			return (*(float *)pDest == (float)*(sal_Int64 *)pSource);
		case typelib_TypeClass_UNSIGNED_HYPER:
			if (::floor( *(float *)pDest ) != *(float *)pDest || *(float *)pDest < 0)
				return sal_False;
			return ((sal_uInt64)*(float *)pDest == *(sal_uInt64 *)pSource);
		case typelib_TypeClass_FLOAT:
			return (*(float *)pDest == *(float *)pSource);
		case typelib_TypeClass_DOUBLE:
			return ((double)*(float *)pDest == *(double *)pSource);
        default:
            return sal_False;
		}
	case typelib_TypeClass_DOUBLE:
		switch (eSourceTypeClass)
		{
		case typelib_TypeClass_BYTE:
			return (*(double *)pDest == (double)*(sal_Int8 *)pSource);
		case typelib_TypeClass_SHORT:
			return (*(double *)pDest == (double)*(sal_Int16 *)pSource);
		case typelib_TypeClass_UNSIGNED_SHORT:
			return (*(double *)pDest == (double)*(sal_uInt16 *)pSource);
		case typelib_TypeClass_LONG:
			return (*(double *)pDest == (double)*(sal_Int32 *)pSource);
		case typelib_TypeClass_UNSIGNED_LONG:
			return (*(double *)pDest == (double)*(sal_uInt32 *)pSource);
		case typelib_TypeClass_HYPER:
			return (*(double *)pDest == (double)*(sal_Int64 *)pSource);
		case typelib_TypeClass_UNSIGNED_HYPER:
			if (::floor( *(double *)pDest ) != *(double *)pDest || *(double *)pDest < 0)
				return sal_False;
			return ((sal_uInt64)*(double *)pDest == *(sal_uInt64 *)pSource);
		case typelib_TypeClass_FLOAT:
			return (*(double *)pDest == (double)*(float *)pSource);
		case typelib_TypeClass_DOUBLE:
			return (*(double *)pDest == *(double *)pSource);
        default:
            return sal_False;
		}
	case typelib_TypeClass_STRING:
        return eSourceTypeClass == typelib_TypeClass_STRING
            && ((::rtl::OUString *)pDest)->equals(
                *(::rtl::OUString const *)pSource );
	case typelib_TypeClass_TYPE:
        return eSourceTypeClass == typelib_TypeClass_TYPE
            && _type_equals(
                *(typelib_TypeDescriptionReference **)pDest,
                *(typelib_TypeDescriptionReference **)pSource );
	case typelib_TypeClass_ENUM:
		return (_type_equals( pDestType, pSourceType ) &&
				*(sal_Int32 *)pDest == *(sal_Int32 *)pSource);
	case typelib_TypeClass_STRUCT:
	case typelib_TypeClass_EXCEPTION:
		if (! _type_equals( pDestType, pSourceType ))
			return sal_False;
		if (pDestTypeDescr)
		{
			return _equalStruct(
				pDest, pSource,
				(typelib_CompoundTypeDescription *)pDestTypeDescr,
				queryInterface, release );
		}
		else
		{
			TYPELIB_DANGER_GET( &pDestTypeDescr, pDestType );
			sal_Bool bRet = _equalStruct(
				pDest, pSource,
				(typelib_CompoundTypeDescription *)pDestTypeDescr,
				queryInterface, release );
			TYPELIB_DANGER_RELEASE( pDestTypeDescr );
			return bRet;
		}
	case typelib_TypeClass_UNION:
		if (_type_equals( pDestType, pSourceType ) &&
			*(sal_Int64 *)pDest == *(sal_Int64 *)pSource) // same discriminant
		{
			sal_Bool bRet;
			if (pDestTypeDescr)
			{
				typelib_TypeDescriptionReference * pSetType = _unionGetSetType(
                    pDest, pDestTypeDescr );
				bRet = ::uno_type_equalData(
					(char *)pDest + ((typelib_UnionTypeDescription *)pDestTypeDescr)->nValueOffset,
                    pSetType,
					(char *)pSource + ((typelib_UnionTypeDescription *)pDestTypeDescr)->nValueOffset,
                    pSetType,
					queryInterface, release );
				typelib_typedescriptionreference_release( pSetType );
			}
			else
			{
				TYPELIB_DANGER_GET( &pDestTypeDescr, pDestType );
				typelib_TypeDescriptionReference * pSetType = _unionGetSetType(
                    pDest, pDestTypeDescr );
				bRet = ::uno_type_equalData(
					(char *)pDest + ((typelib_UnionTypeDescription *)pDestTypeDescr)->nValueOffset,
                    pSetType,
					(char *)pSource + ((typelib_UnionTypeDescription *)pDestTypeDescr)->nValueOffset,
                    pSetType,
					queryInterface, release );
				typelib_typedescriptionreference_release( pSetType );
				TYPELIB_DANGER_RELEASE( pDestTypeDescr );
			}
			return bRet;
		}
		return sal_False;
	case typelib_TypeClass_SEQUENCE:
		if (_type_equals( pDestType, pSourceType ))
		{
			if (pDestTypeDescr)
			{
				return _equalSequence(
					*(uno_Sequence **)pDest, *(uno_Sequence **)pSource,
					((typelib_IndirectTypeDescription *)pDestTypeDescr)->pType,
					queryInterface, release );
			}
			else
			{
				TYPELIB_DANGER_GET( &pDestTypeDescr, pDestType );
				sal_Bool bRet = _equalSequence(
					*(uno_Sequence **)pDest, *(uno_Sequence **)pSource,
					((typelib_IndirectTypeDescription *)pDestTypeDescr)->pType,
					queryInterface, release );
				TYPELIB_DANGER_RELEASE( pDestTypeDescr );
				return bRet;
			}
		}
		return sal_False;
	case typelib_TypeClass_INTERFACE:
		if (typelib_TypeClass_INTERFACE == eSourceTypeClass)
			return _equalObject( *(void **)pDest, *(void **)pSource, queryInterface, release );
        break;
    default:
        OSL_ASSERT(false);
        break;
	}
	return sal_False;
}