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;
}