/**************************************************************
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
 *************************************************************/


#ifndef EQ_HXX
#define EQ_HXX

#include <math.h>
#include <rtl/memory.h>

#include "prim.hxx"
#include "destr.hxx"


namespace cppu
{

//##################################################################################################
//#### equality ####################################################################################
//##################################################################################################

//--------------------------------------------------------------------------------------------------
inline sal_Bool _equalObject(
	void * pI1, void * pI2,
	uno_QueryInterfaceFunc queryInterface, uno_ReleaseFunc release )
	SAL_THROW( () )
{
	if (pI1 == pI2)
		return sal_True;
	if ((0 == pI1) || (0 == pI2))
		return sal_False;
    sal_Bool bRet = sal_False;

    typelib_TypeDescriptionReference * type_XInterface =
        * typelib_static_type_getByTypeClass( typelib_TypeClass_INTERFACE );
	if (0 == queryInterface)
        queryInterface = binuno_queryInterface;
    pI1 = (*queryInterface)( pI1, type_XInterface );
    if (0 != pI1)
    {
        pI2 = (*queryInterface)( pI2, type_XInterface );
        if (0 != pI2)
        {
            bRet = (pI1 == pI2);
            _release( pI2, release );
        }
        _release( pI1, release );
    }
    return bRet;
}

//==================================================================================================
sal_Bool equalStruct(
	void * pDest, void *pSource,
	typelib_CompoundTypeDescription * pTypeDescr,
	uno_QueryInterfaceFunc queryInterface, uno_ReleaseFunc release )
	SAL_THROW( () );
//--------------------------------------------------------------------------------------------------
inline sal_Bool _equalStruct(
	void * pDest, void *pSource,
	typelib_CompoundTypeDescription * pTypeDescr,
	uno_QueryInterfaceFunc queryInterface, uno_ReleaseFunc release )
	SAL_THROW( () )
{
	if (pTypeDescr->pBaseTypeDescription &&
		!equalStruct( pDest, pSource, pTypeDescr->pBaseTypeDescription, queryInterface, release ))
	{
		return sal_False;
	}

	typelib_TypeDescriptionReference ** ppTypeRefs = pTypeDescr->ppTypeRefs;
	sal_Int32 * pMemberOffsets = pTypeDescr->pMemberOffsets;
	sal_Int32 nDescr = pTypeDescr->nMembers;

	while (nDescr--)
	{
		sal_Int32 nOffset = pMemberOffsets[nDescr];
		if (! ::uno_type_equalData( (char *)pDest + nOffset,
                                    ppTypeRefs[nDescr],
                                    (char *)pSource + nOffset,
                                    ppTypeRefs[nDescr],
                                    queryInterface, release ))
		{
			return sal_False;
		}
	}
	return sal_True;
}
//==================================================================================================
sal_Bool equalSequence(
	uno_Sequence * pDest, uno_Sequence * pSource,
	typelib_TypeDescriptionReference * pElementType,
	uno_QueryInterfaceFunc queryInterface, uno_ReleaseFunc release )
	SAL_THROW( () );
//--------------------------------------------------------------------------------------------------
inline sal_Bool _equalSequence(
	uno_Sequence * pDest, uno_Sequence * pSource,
	typelib_TypeDescriptionReference * pElementType,
	uno_QueryInterfaceFunc queryInterface, uno_ReleaseFunc release )
	SAL_THROW( () )
{
	if (pDest == pSource)
		return sal_True;
	sal_Int32 nElements = pDest->nElements;
	if (nElements != pSource->nElements)
		return sal_False;
	if (! nElements)
		return sal_True;

	void * pDestElements = pDest->elements;
	void * pSourceElements = pSource->elements;

	switch (pElementType->eTypeClass)
	{
	case typelib_TypeClass_CHAR:
		return (0 == ::rtl_compareMemory( pDestElements, pSourceElements, sizeof(sal_Unicode) * nElements ));
	case typelib_TypeClass_BOOLEAN:
	{
		for ( sal_Int32 nPos = nElements; nPos--; )
		{
			if ((((sal_Bool *)pDestElements)[nPos] != sal_False) !=
				(((sal_Bool *)pSourceElements)[nPos] != sal_False))
			{
				return sal_False;
			}
		}
		return sal_True;
	}
	case typelib_TypeClass_BYTE:
		return (0 == ::rtl_compareMemory( pDestElements, pSourceElements, sizeof(sal_Int8) * nElements ));
	case typelib_TypeClass_SHORT:
	case typelib_TypeClass_UNSIGNED_SHORT:
		return (0 == ::rtl_compareMemory( pDestElements, pSourceElements, sizeof(sal_Int16) * nElements ));
	case typelib_TypeClass_LONG:
	case typelib_TypeClass_UNSIGNED_LONG:
		return (0 == ::rtl_compareMemory( pDestElements, pSourceElements, sizeof(sal_Int32) * nElements ));
	case typelib_TypeClass_HYPER:
	case typelib_TypeClass_UNSIGNED_HYPER:
		return (0 == ::rtl_compareMemory( pDestElements, pSourceElements, sizeof(sal_Int64) * nElements ));
	case typelib_TypeClass_FLOAT:
	{
		for ( sal_Int32 nPos = nElements; nPos--; )
		{
			if (((float *)pDestElements)[nPos] != ((float *)pSourceElements)[nPos])
				return sal_False;
		}
		return sal_True;
	}
	case typelib_TypeClass_DOUBLE:
	{
		for ( sal_Int32 nPos = nElements; nPos--; )
		{
			if (((double *)pDestElements)[nPos] != ((double *)pSourceElements)[nPos])
				return sal_False;
		}
		return sal_True;
	}
	case typelib_TypeClass_STRING:
	{
		for ( sal_Int32 nPos = nElements; nPos--; )
		{
			if (! ((::rtl::OUString *)pDestElements +nPos)->equals( ((const ::rtl::OUString *)pSourceElements)[nPos] ))
				return sal_False;
		}
		return sal_True;
	}
	case typelib_TypeClass_TYPE:
	{
		for ( sal_Int32 nPos = nElements; nPos--; )
		{
			if (! _type_equals( ((typelib_TypeDescriptionReference **)pDestElements)[nPos],
                                ((typelib_TypeDescriptionReference **)pSourceElements)[nPos] ))
			{
				return sal_False;
			}
		}
		return sal_True;
	}
	case typelib_TypeClass_ANY:
	{
		for ( sal_Int32 nPos = nElements; nPos--; )
		{
			uno_Any * pDest2 = (uno_Any *)pDestElements + nPos;
			uno_Any * pSource2 = (uno_Any *)pSourceElements + nPos;
			if (! ::uno_type_equalData( pDest2->pData, pDest2->pType,
										pSource2->pData, pSource2->pType,
										queryInterface, release ))
			{
				return sal_False;
			}
		}
		return sal_True;
	}
	case typelib_TypeClass_ENUM:
		return (0 == ::rtl_compareMemory( pDestElements, pSourceElements, sizeof(sal_Int32) * nElements ));
	case typelib_TypeClass_STRUCT:
	case typelib_TypeClass_EXCEPTION:
	{
		typelib_TypeDescription * pElementTypeDescr = 0;
		TYPELIB_DANGER_GET( &pElementTypeDescr, pElementType );
		sal_Int32 nElementSize = pElementTypeDescr->nSize;
		for ( sal_Int32 nPos = nElements; nPos--; )
		{
			if (! _equalStruct( (char *)pDestElements + (nPos * nElementSize),
                                (char *)pSourceElements + (nPos * nElementSize),
                                (typelib_CompoundTypeDescription *)pElementTypeDescr,
                                queryInterface, release ))
			{
				TYPELIB_DANGER_RELEASE( pElementTypeDescr );
				return sal_False;
			}
		}
		TYPELIB_DANGER_RELEASE( pElementTypeDescr );
		return sal_True;
	}
	case typelib_TypeClass_UNION:
	{
		typelib_TypeDescription * pElementTypeDescr = 0;
		TYPELIB_DANGER_GET( &pElementTypeDescr, pElementType );
		sal_Int32 nElementSize = pElementTypeDescr->nSize;
		sal_Int32 nValueOffset = ((typelib_UnionTypeDescription *)pElementTypeDescr)->nValueOffset;
		for ( sal_Int32 nPos = nElements; nPos--; )
		{
			char * pDest2 = (char *)pDestElements + (nPos * nElementSize);
			char * pSource2 = (char *)pSourceElements + (nPos * nElementSize);
			typelib_TypeDescriptionReference * pSetType = _unionGetSetType(
                pDest2, pElementTypeDescr );
			sal_Bool bRet = ::uno_type_equalData(
                pDest2 + nValueOffset, pSetType,
                pSource2 + nValueOffset, pSetType,
                queryInterface, release );
			::typelib_typedescriptionreference_release( pSetType );
			if (! bRet)
			{
				TYPELIB_DANGER_RELEASE( pElementTypeDescr );
				return sal_False;
			}
		}
		TYPELIB_DANGER_RELEASE( pElementTypeDescr );
		return sal_True;
	}
	case typelib_TypeClass_SEQUENCE: // sequence of sequence
	{
		typelib_TypeDescription * pElementTypeDescr = 0;
		TYPELIB_DANGER_GET( &pElementTypeDescr, pElementType );
		typelib_TypeDescriptionReference * pSeqElementType =
			((typelib_IndirectTypeDescription *)pElementTypeDescr)->pType;
		for ( sal_Int32 nPos = nElements; nPos--; )
		{
			if (! equalSequence( ((uno_Sequence **)pDestElements)[nPos],
								 ((uno_Sequence **)pSourceElements)[nPos],
								 pSeqElementType, queryInterface, release ))
			{
				TYPELIB_DANGER_RELEASE( pElementTypeDescr );
				return sal_False;
			}
		}
		TYPELIB_DANGER_RELEASE( pElementTypeDescr );
		return sal_True;
	}
	case typelib_TypeClass_INTERFACE:
	{
		for ( sal_Int32 nPos = nElements; nPos--; )
		{
			if (! _equalObject( ((void **)pDestElements)[nPos], ((void **)pSourceElements)[nPos],
                                queryInterface, release ))
			{
				return sal_False;
			}
		}
		return sal_True;
	}
    default:
        OSL_ASSERT(false);
        return sal_False;
	}
}
//--------------------------------------------------------------------------------------------------
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;
}

}

#endif
