LCOV - code coverage report
Current view: top level - cppu/source/uno - eq.hxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 157 262 59.9 %
Date: 2015-06-13 12:38:46 Functions: 4 4 100.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : #ifndef INCLUDED_CPPU_SOURCE_UNO_EQ_HXX
      20             : #define INCLUDED_CPPU_SOURCE_UNO_EQ_HXX
      21             : 
      22             : #include <math.h>
      23             : 
      24             : #include "prim.hxx"
      25             : #include "destr.hxx"
      26             : 
      27             : 
      28             : namespace cppu
      29             : {
      30             : 
      31             : 
      32             : //#### equality ####################################################################################
      33             : 
      34             : 
      35             : 
      36        4511 : inline bool _equalObject(
      37             :     void * pI1, void * pI2,
      38             :     uno_QueryInterfaceFunc queryInterface, uno_ReleaseFunc release )
      39             : {
      40        4511 :     if (pI1 == pI2)
      41        2862 :         return true;
      42        1649 :     if ((0 == pI1) || (0 == pI2))
      43         116 :         return false;
      44        1533 :     bool bRet = false;
      45             : 
      46             :     typelib_TypeDescriptionReference * type_XInterface =
      47        1533 :         * typelib_static_type_getByTypeClass( typelib_TypeClass_INTERFACE );
      48        1533 :     if (0 == queryInterface)
      49           0 :         queryInterface = binuno_queryInterface;
      50        1533 :     pI1 = (*queryInterface)( pI1, type_XInterface );
      51        1533 :     if (0 != pI1)
      52             :     {
      53        1533 :         pI2 = (*queryInterface)( pI2, type_XInterface );
      54        1533 :         if (0 != pI2)
      55             :         {
      56        1533 :             bRet = (pI1 == pI2);
      57        1533 :             _release( pI2, release );
      58             :         }
      59        1533 :         _release( pI1, release );
      60             :     }
      61        1533 :     return bRet;
      62             : }
      63             : 
      64             : 
      65             : bool equalStruct(
      66             :     void * pDest, void *pSource,
      67             :     typelib_CompoundTypeDescription * pTypeDescr,
      68             :     uno_QueryInterfaceFunc queryInterface, uno_ReleaseFunc release );
      69             : 
      70      491807 : inline bool _equalStruct(
      71             :     void * pDest, void *pSource,
      72             :     typelib_CompoundTypeDescription * pTypeDescr,
      73             :     uno_QueryInterfaceFunc queryInterface, uno_ReleaseFunc release )
      74             : {
      75      492152 :     if (pTypeDescr->pBaseTypeDescription &&
      76         345 :         !equalStruct( pDest, pSource, pTypeDescr->pBaseTypeDescription, queryInterface, release ))
      77             :     {
      78          11 :         return false;
      79             :     }
      80             : 
      81      491796 :     typelib_TypeDescriptionReference ** ppTypeRefs = pTypeDescr->ppTypeRefs;
      82      491796 :     sal_Int32 * pMemberOffsets = pTypeDescr->pMemberOffsets;
      83      491796 :     sal_Int32 nDescr = pTypeDescr->nMembers;
      84             : 
      85     2285717 :     while (nDescr--)
      86             :     {
      87     1462427 :         sal_Int32 nOffset = pMemberOffsets[nDescr];
      88     2924854 :         if (! ::uno_type_equalData( static_cast<char *>(pDest) + nOffset,
      89     1462427 :                                     ppTypeRefs[nDescr],
      90     1462427 :                                     static_cast<char *>(pSource) + nOffset,
      91     1462427 :                                     ppTypeRefs[nDescr],
      92     4387281 :                                     queryInterface, release ))
      93             :         {
      94      160302 :             return false;
      95             :         }
      96             :     }
      97      331494 :     return true;
      98             : }
      99             : 
     100             : bool equalSequence(
     101             :     uno_Sequence * pDest, uno_Sequence * pSource,
     102             :     typelib_TypeDescriptionReference * pElementType,
     103             :     uno_QueryInterfaceFunc queryInterface, uno_ReleaseFunc release );
     104             : 
     105      229437 : inline bool _equalSequence(
     106             :     uno_Sequence * pDest, uno_Sequence * pSource,
     107             :     typelib_TypeDescriptionReference * pElementType,
     108             :     uno_QueryInterfaceFunc queryInterface, uno_ReleaseFunc release )
     109             : {
     110      229437 :     if (pDest == pSource)
     111       35306 :         return true;
     112      194131 :     sal_Int32 nElements = pDest->nElements;
     113      194131 :     if (nElements != pSource->nElements)
     114       65295 :         return false;
     115      128836 :     if (! nElements)
     116         289 :         return true;
     117             : 
     118      128547 :     void * pDestElements = pDest->elements;
     119      128547 :     void * pSourceElements = pSource->elements;
     120             : 
     121      128547 :     switch (pElementType->eTypeClass)
     122             :     {
     123             :     case typelib_TypeClass_CHAR:
     124           0 :         return (0 == memcmp( pDestElements, pSourceElements, sizeof(sal_Unicode) * nElements ));
     125             :     case typelib_TypeClass_BOOLEAN:
     126             :     {
     127          10 :         for ( sal_Int32 nPos = nElements; nPos--; )
     128             :         {
     129          12 :             if ((static_cast<sal_Bool *>(pDestElements)[nPos] != sal_False) !=
     130           6 :                 (static_cast<sal_Bool *>(pSourceElements)[nPos] != sal_False))
     131             :             {
     132           0 :                 return false;
     133             :             }
     134             :         }
     135           2 :         return true;
     136             :     }
     137             :     case typelib_TypeClass_BYTE:
     138          20 :         return (0 == memcmp( pDestElements, pSourceElements, sizeof(sal_Int8) * nElements ));
     139             :     case typelib_TypeClass_SHORT:
     140             :     case typelib_TypeClass_UNSIGNED_SHORT:
     141          52 :         return (0 == memcmp( pDestElements, pSourceElements, sizeof(sal_Int16) * nElements ));
     142             :     case typelib_TypeClass_LONG:
     143             :     case typelib_TypeClass_UNSIGNED_LONG:
     144         700 :         return (0 == memcmp( pDestElements, pSourceElements, sizeof(sal_Int32) * nElements ));
     145             :     case typelib_TypeClass_HYPER:
     146             :     case typelib_TypeClass_UNSIGNED_HYPER:
     147           4 :         return (0 == memcmp( pDestElements, pSourceElements, sizeof(sal_Int64) * nElements ));
     148             :     case typelib_TypeClass_FLOAT:
     149             :     {
     150          10 :         for ( sal_Int32 nPos = nElements; nPos--; )
     151             :         {
     152           6 :             if (static_cast<float *>(pDestElements)[nPos] != static_cast<float *>(pSourceElements)[nPos])
     153           0 :                 return false;
     154             :         }
     155           2 :         return true;
     156             :     }
     157             :     case typelib_TypeClass_DOUBLE:
     158             :     {
     159          10 :         for ( sal_Int32 nPos = nElements; nPos--; )
     160             :         {
     161           6 :             if (static_cast<double *>(pDestElements)[nPos] != static_cast<double *>(pSourceElements)[nPos])
     162           0 :                 return false;
     163             :         }
     164           2 :         return true;
     165             :     }
     166             :     case typelib_TypeClass_STRING:
     167             :     {
     168        3138 :         for ( sal_Int32 nPos = nElements; nPos--; )
     169             :         {
     170        2300 :             if (! (static_cast<OUString *>(pDestElements) +nPos)->equals( static_cast<const ::rtl::OUString *>(pSourceElements)[nPos] ))
     171           2 :                 return false;
     172             :         }
     173         418 :         return true;
     174             :     }
     175             :     case typelib_TypeClass_TYPE:
     176             :     {
     177           0 :         for ( sal_Int32 nPos = nElements; nPos--; )
     178             :         {
     179           0 :             if (! _type_equals( static_cast<typelib_TypeDescriptionReference **>(pDestElements)[nPos],
     180           0 :                                 static_cast<typelib_TypeDescriptionReference **>(pSourceElements)[nPos] ))
     181             :             {
     182           0 :                 return false;
     183             :             }
     184             :         }
     185           0 :         return true;
     186             :     }
     187             :     case typelib_TypeClass_ANY:
     188             :     {
     189         221 :         for ( sal_Int32 nPos = nElements; nPos--; )
     190             :         {
     191         114 :             uno_Any * pDest2 = static_cast<uno_Any *>(pDestElements) + nPos;
     192         114 :             uno_Any * pSource2 = static_cast<uno_Any *>(pSourceElements) + nPos;
     193         114 :             if (! ::uno_type_equalData( pDest2->pData, pDest2->pType,
     194             :                                         pSource2->pData, pSource2->pType,
     195         114 :                                         queryInterface, release ))
     196             :             {
     197           9 :                 return false;
     198             :             }
     199             :         }
     200          49 :         return true;
     201             :     }
     202             :     case typelib_TypeClass_ENUM:
     203           2 :         return (0 == memcmp( pDestElements, pSourceElements, sizeof(sal_Int32) * nElements ));
     204             :     case typelib_TypeClass_STRUCT:
     205             :     case typelib_TypeClass_EXCEPTION:
     206             :     {
     207      124288 :         typelib_TypeDescription * pElementTypeDescr = 0;
     208      124288 :         TYPELIB_DANGER_GET( &pElementTypeDescr, pElementType );
     209      124288 :         sal_Int32 nElementSize = pElementTypeDescr->nSize;
     210      477250 :         for ( sal_Int32 nPos = nElements; nPos--; )
     211             :         {
     212     1001016 :             if (! _equalStruct( static_cast<char *>(pDestElements) + (nPos * nElementSize),
     213      667344 :                                 static_cast<char *>(pSourceElements) + (nPos * nElementSize),
     214             :                                 reinterpret_cast<typelib_CompoundTypeDescription *>(pElementTypeDescr),
     215     1334688 :                                 queryInterface, release ))
     216             :             {
     217      104998 :                 TYPELIB_DANGER_RELEASE( pElementTypeDescr );
     218      104998 :                 return false;
     219             :             }
     220             :         }
     221       19290 :         TYPELIB_DANGER_RELEASE( pElementTypeDescr );
     222       19290 :         return true;
     223             :     }
     224             :     case typelib_TypeClass_SEQUENCE: // sequence of sequence
     225             :     {
     226        1275 :         typelib_TypeDescription * pElementTypeDescr = 0;
     227        1275 :         TYPELIB_DANGER_GET( &pElementTypeDescr, pElementType );
     228             :         typelib_TypeDescriptionReference * pSeqElementType =
     229        1275 :             reinterpret_cast<typelib_IndirectTypeDescription *>(pElementTypeDescr)->pType;
     230        2755 :         for ( sal_Int32 nPos = nElements; nPos--; )
     231             :         {
     232        2606 :             if (! equalSequence( static_cast<uno_Sequence **>(pDestElements)[nPos],
     233        1303 :                                  static_cast<uno_Sequence **>(pSourceElements)[nPos],
     234        2606 :                                  pSeqElementType, queryInterface, release ))
     235             :             {
     236        1098 :                 TYPELIB_DANGER_RELEASE( pElementTypeDescr );
     237        1098 :                 return false;
     238             :             }
     239             :         }
     240         177 :         TYPELIB_DANGER_RELEASE( pElementTypeDescr );
     241         177 :         return true;
     242             :     }
     243             :     case typelib_TypeClass_INTERFACE:
     244             :     {
     245        4073 :         for ( sal_Int32 nPos = nElements; nPos--; )
     246             :         {
     247        6120 :             if (! _equalObject( static_cast<void **>(pDestElements)[nPos], static_cast<void **>(pSourceElements)[nPos],
     248        4080 :                                 queryInterface, release ))
     249             :             {
     250        1411 :                 return false;
     251             :             }
     252             :         }
     253         311 :         return true;
     254             :     }
     255             :     default:
     256             :         OSL_ASSERT(false);
     257           0 :         return false;
     258             :     }
     259             : }
     260             : 
     261     2530967 : inline bool _equalData(
     262             :     void * pDest,
     263             :     typelib_TypeDescriptionReference * pDestType, typelib_TypeDescription * pDestTypeDescr,
     264             :     void * pSource,
     265             :     typelib_TypeDescriptionReference * pSourceType,
     266             :     uno_QueryInterfaceFunc queryInterface, uno_ReleaseFunc release )
     267             : {
     268             :     typelib_TypeClass eSourceTypeClass, eDestTypeClass;
     269     5410488 :     while (typelib_TypeClass_ANY == (eDestTypeClass = pDestType->eTypeClass))
     270             :     {
     271      348554 :         pDestTypeDescr = 0;
     272      348554 :         pDestType = static_cast<uno_Any *>(pDest)->pType;
     273      348554 :         pDest = static_cast<uno_Any *>(pDest)->pData;
     274             :     }
     275     5410488 :     while (typelib_TypeClass_ANY == (eSourceTypeClass = pSourceType->eTypeClass))
     276             :     {
     277      348554 :         pSourceType = static_cast<uno_Any *>(pSource)->pType;
     278      348554 :         pSource = static_cast<uno_Any *>(pSource)->pData;
     279             :     }
     280             : 
     281     2530967 :     switch (eDestTypeClass)
     282             :     {
     283             :     case typelib_TypeClass_VOID:
     284       29985 :         return eSourceTypeClass == typelib_TypeClass_VOID;
     285             :     case typelib_TypeClass_CHAR:
     286             :         return eSourceTypeClass == typelib_TypeClass_CHAR
     287          30 :             && *static_cast<sal_Unicode *>(pDest) == *static_cast<sal_Unicode *>(pSource);
     288             :     case typelib_TypeClass_BOOLEAN:
     289             :         return eSourceTypeClass == typelib_TypeClass_BOOLEAN
     290      259912 :             && ((*static_cast<sal_Bool *>(pDest) != sal_False)
     291      259912 :                 == (*static_cast<sal_Bool *>(pSource) != sal_False));
     292             :     case typelib_TypeClass_BYTE:
     293        1124 :         switch (eSourceTypeClass)
     294             :         {
     295             :         case typelib_TypeClass_BYTE:
     296        1124 :             return (*static_cast<sal_Int8 *>(pDest) == *static_cast<sal_Int8 *>(pSource));
     297             :         case typelib_TypeClass_SHORT:
     298           0 :             return ((sal_Int16)*static_cast<sal_Int8 *>(pDest) == *static_cast<sal_Int16 *>(pSource));
     299             :         case typelib_TypeClass_UNSIGNED_SHORT:
     300           0 :             return ((sal_Int32)*static_cast<sal_Int8 *>(pDest) == (sal_Int32)*static_cast<sal_uInt16 *>(pSource));
     301             :         case typelib_TypeClass_LONG:
     302           0 :             return ((sal_Int32)*static_cast<sal_Int8 *>(pDest) == *static_cast<sal_Int32 *>(pSource));
     303             :         case typelib_TypeClass_UNSIGNED_LONG:
     304           0 :             return ((sal_Int64)*static_cast<sal_Int8 *>(pDest) == (sal_Int64)*static_cast<sal_uInt32 *>(pSource));
     305             :         case typelib_TypeClass_HYPER:
     306           0 :             return ((sal_Int64)*static_cast<sal_Int8 *>(pDest) == *static_cast<sal_Int64 *>(pSource));
     307             :         case typelib_TypeClass_UNSIGNED_HYPER:
     308           0 :             return (*static_cast<sal_Int8 *>(pDest) >= 0 &&
     309           0 :                     (sal_Int64)*static_cast<sal_Int8 *>(pDest) == *static_cast<sal_Int64 *>(pSource)); // same size
     310             :         case typelib_TypeClass_FLOAT:
     311           0 :             return ((float)*static_cast<sal_Int8 *>(pDest) == *static_cast<float *>(pSource));
     312             :         case typelib_TypeClass_DOUBLE:
     313           0 :             return ((double)*static_cast<sal_Int8 *>(pDest) == *static_cast<double *>(pSource));
     314             :         default:
     315           0 :             return false;
     316             :         }
     317             :     case typelib_TypeClass_SHORT:
     318      155394 :         switch (eSourceTypeClass)
     319             :         {
     320             :         case typelib_TypeClass_BYTE:
     321           0 :             return (*static_cast<sal_Int16 *>(pDest) == (sal_Int16)*static_cast<sal_Int8 *>(pSource));
     322             :         case typelib_TypeClass_SHORT:
     323      155390 :             return (*static_cast<sal_Int16 *>(pDest) == *static_cast<sal_Int16 *>(pSource));
     324             :         case typelib_TypeClass_UNSIGNED_SHORT:
     325           0 :             return ((sal_Int32)*static_cast<sal_Int16 *>(pDest) == (sal_Int32)*static_cast<sal_uInt16 *>(pSource));
     326             :         case typelib_TypeClass_LONG:
     327           0 :             return ((sal_Int32)*static_cast<sal_Int16 *>(pDest) == *static_cast<sal_Int32 *>(pSource));
     328             :         case typelib_TypeClass_UNSIGNED_LONG:
     329           0 :             return ((sal_Int64)*static_cast<sal_Int16 *>(pDest) == (sal_Int64)*static_cast<sal_uInt32 *>(pSource));
     330             :         case typelib_TypeClass_HYPER:
     331           0 :             return ((sal_Int64)*static_cast<sal_Int16 *>(pDest) == *static_cast<sal_Int64 *>(pSource));
     332             :         case typelib_TypeClass_UNSIGNED_HYPER:
     333           0 :             return (*static_cast<sal_Int16 *>(pDest) >= 0 &&
     334           0 :                     (sal_Int64)*static_cast<sal_Int16 *>(pDest) == *static_cast<sal_Int64 *>(pSource)); // same size
     335             :         case typelib_TypeClass_FLOAT:
     336           0 :             return ((float)*static_cast<sal_Int16 *>(pDest) == *static_cast<float *>(pSource));
     337             :         case typelib_TypeClass_DOUBLE:
     338           0 :             return ((double)*static_cast<sal_Int16 *>(pDest) == *static_cast<double *>(pSource));
     339             :         default:
     340           4 :             return false;
     341             :         }
     342             :     case typelib_TypeClass_UNSIGNED_SHORT:
     343          47 :         switch (eSourceTypeClass)
     344             :         {
     345             :         case typelib_TypeClass_BYTE:
     346           0 :             return ((sal_Int32)*static_cast<sal_uInt16 *>(pDest) == (sal_Int32)*static_cast<sal_Int8 *>(pSource));
     347             :         case typelib_TypeClass_SHORT:
     348           0 :             return ((sal_Int32)*static_cast<sal_uInt16 *>(pDest) == (sal_Int32)*static_cast<sal_Int16 *>(pSource));
     349             :         case typelib_TypeClass_UNSIGNED_SHORT:
     350          47 :             return (*static_cast<sal_uInt16 *>(pDest) == *static_cast<sal_uInt16 *>(pSource));
     351             :         case typelib_TypeClass_LONG:
     352           0 :             return ((sal_Int32)*static_cast<sal_uInt16 *>(pDest) == *static_cast<sal_Int32 *>(pSource));
     353             :         case typelib_TypeClass_UNSIGNED_LONG:
     354           0 :             return ((sal_uInt32)*static_cast<sal_uInt16 *>(pDest) == *static_cast<sal_uInt32 *>(pSource));
     355             :         case typelib_TypeClass_HYPER:
     356           0 :             return ((sal_Int64)*static_cast<sal_uInt16 *>(pDest) == *static_cast<sal_Int64 *>(pSource));
     357             :         case typelib_TypeClass_UNSIGNED_HYPER:
     358           0 :             return ((sal_uInt64)*static_cast<sal_uInt16 *>(pDest) == *static_cast<sal_uInt64 *>(pSource));
     359             :         case typelib_TypeClass_FLOAT:
     360           0 :             return ((float)*static_cast<sal_uInt16 *>(pDest) == *static_cast<float *>(pSource));
     361             :         case typelib_TypeClass_DOUBLE:
     362           0 :             return ((double)*static_cast<sal_uInt16 *>(pDest) == *static_cast<double *>(pSource));
     363             :         default:
     364           0 :             return false;
     365             :         }
     366             :     case typelib_TypeClass_LONG:
     367      840765 :         switch (eSourceTypeClass)
     368             :         {
     369             :         case typelib_TypeClass_BYTE:
     370           0 :             return (*static_cast<sal_Int32 *>(pDest) == (sal_Int32)*static_cast<sal_Int8 *>(pSource));
     371             :         case typelib_TypeClass_SHORT:
     372           0 :             return (*static_cast<sal_Int32 *>(pDest) == (sal_Int32)*static_cast<sal_Int16 *>(pSource));
     373             :         case typelib_TypeClass_UNSIGNED_SHORT:
     374           0 :             return (*static_cast<sal_Int32 *>(pDest) == (sal_Int32)*static_cast<sal_uInt16 *>(pSource));
     375             :         case typelib_TypeClass_LONG:
     376      833415 :             return (*static_cast<sal_Int32 *>(pDest) == *static_cast<sal_Int32 *>(pSource));
     377             :         case typelib_TypeClass_UNSIGNED_LONG:
     378         566 :             return ((sal_Int64)*static_cast<sal_Int32 *>(pDest) == (sal_Int64)*static_cast<sal_uInt32 *>(pSource));
     379             :         case typelib_TypeClass_HYPER:
     380           0 :             return ((sal_Int64)*static_cast<sal_Int32 *>(pDest) == *static_cast<sal_Int64 *>(pSource));
     381             :         case typelib_TypeClass_UNSIGNED_HYPER:
     382           0 :             return (*static_cast<sal_Int32 *>(pDest) >= 0 &&
     383           0 :                     (sal_Int64)*static_cast<sal_Int32 *>(pDest) == *static_cast<sal_Int64 *>(pSource)); // same size
     384             :         case typelib_TypeClass_FLOAT:
     385           0 :             return ((float)*static_cast<sal_Int32 *>(pDest) == *static_cast<float *>(pSource));
     386             :         case typelib_TypeClass_DOUBLE:
     387           0 :             return ((double)*static_cast<sal_Int32 *>(pDest) == *static_cast<double *>(pSource));
     388             :         default:
     389        6784 :             return false;
     390             :         }
     391             :     case typelib_TypeClass_UNSIGNED_LONG:
     392         856 :         switch (eSourceTypeClass)
     393             :         {
     394             :         case typelib_TypeClass_BYTE:
     395           0 :             return ((sal_Int64)*static_cast<sal_uInt32 *>(pDest) == (sal_Int64)*static_cast<sal_Int8 *>(pSource));
     396             :         case typelib_TypeClass_SHORT:
     397           0 :             return ((sal_Int64)*static_cast<sal_uInt32 *>(pDest) == (sal_Int64)*static_cast<sal_Int16 *>(pSource));
     398             :         case typelib_TypeClass_UNSIGNED_SHORT:
     399           0 :             return (*static_cast<sal_uInt32 *>(pDest) == (sal_uInt32)*static_cast<sal_uInt16 *>(pSource));
     400             :         case typelib_TypeClass_LONG:
     401          90 :             return ((sal_Int64)*static_cast<sal_uInt32 *>(pDest) == (sal_Int64)*static_cast<sal_Int32 *>(pSource));
     402             :         case typelib_TypeClass_UNSIGNED_LONG:
     403         766 :             return (*static_cast<sal_uInt32 *>(pDest) == *static_cast<sal_uInt32 *>(pSource));
     404             :         case typelib_TypeClass_HYPER:
     405           0 :             return ((sal_Int64)*static_cast<sal_uInt32 *>(pDest) == *static_cast<sal_Int64 *>(pSource));
     406             :         case typelib_TypeClass_UNSIGNED_HYPER:
     407           0 :             return ((sal_uInt64)*static_cast<sal_uInt32 *>(pDest) == *static_cast<sal_uInt64 *>(pSource));
     408             :         case typelib_TypeClass_FLOAT:
     409           0 :             return ((float)*static_cast<sal_uInt32 *>(pDest) == *static_cast<float *>(pSource));
     410             :         case typelib_TypeClass_DOUBLE:
     411           0 :             return ((double)*static_cast<sal_uInt32 *>(pDest) == *static_cast<double *>(pSource));
     412             :         default:
     413           0 :             return false;
     414             :         }
     415             :     case typelib_TypeClass_HYPER:
     416         872 :         switch (eSourceTypeClass)
     417             :         {
     418             :         case typelib_TypeClass_BYTE:
     419           0 :             return (*static_cast<sal_Int64 *>(pDest) == (sal_Int64)*static_cast<sal_Int8 *>(pSource));
     420             :         case typelib_TypeClass_SHORT:
     421           0 :             return (*static_cast<sal_Int64 *>(pDest) == (sal_Int64)*static_cast<sal_Int16 *>(pSource));
     422             :         case typelib_TypeClass_UNSIGNED_SHORT:
     423           0 :             return (*static_cast<sal_Int64 *>(pDest) == (sal_Int64)*static_cast<sal_uInt16 *>(pSource));
     424             :         case typelib_TypeClass_LONG:
     425           0 :             return (*static_cast<sal_Int64 *>(pDest) == (sal_Int64)*static_cast<sal_Int32 *>(pSource));
     426             :         case typelib_TypeClass_UNSIGNED_LONG:
     427           0 :             return (*static_cast<sal_Int64 *>(pDest) == (sal_Int64)*static_cast<sal_uInt32 *>(pSource));
     428             :         case typelib_TypeClass_HYPER:
     429         872 :             return (*static_cast<sal_Int64 *>(pDest) == *static_cast<sal_Int64 *>(pSource));
     430             :         case typelib_TypeClass_UNSIGNED_HYPER:
     431           0 :             return (*static_cast<sal_Int64 *>(pDest) >= 0 &&
     432           0 :                     *static_cast<sal_Int64 *>(pDest) == *static_cast<sal_Int64 *>(pSource)); // same size
     433             :         case typelib_TypeClass_FLOAT:
     434           0 :             return ((float)*static_cast<sal_Int64 *>(pDest) == *static_cast<float *>(pSource));
     435             :         case typelib_TypeClass_DOUBLE:
     436           0 :             return ((double)*static_cast<sal_Int64 *>(pDest) == *static_cast<double *>(pSource));
     437             :         default:
     438           0 :             return false;
     439             :         }
     440             :     case typelib_TypeClass_UNSIGNED_HYPER:
     441          30 :         switch (eSourceTypeClass)
     442             :         {
     443             :         case typelib_TypeClass_BYTE:
     444           0 :             return (*static_cast<sal_Int8 *>(pSource) >= 0 &&
     445           0 :                     *static_cast<sal_uInt64 *>(pDest) == (sal_uInt64)*static_cast<sal_Int8 *>(pSource));
     446             :         case typelib_TypeClass_SHORT:
     447           0 :             return (*static_cast<sal_Int16 *>(pSource) >= 0 &&
     448           0 :                     *static_cast<sal_uInt64 *>(pDest) == (sal_uInt64)*static_cast<sal_Int16 *>(pSource));
     449             :         case typelib_TypeClass_UNSIGNED_SHORT:
     450           0 :             return (*static_cast<sal_uInt64 *>(pDest) == (sal_uInt64)*static_cast<sal_uInt16 *>(pSource));
     451             :         case typelib_TypeClass_LONG:
     452           0 :             return (*static_cast<sal_Int32 *>(pSource) >= 0 &&
     453           0 :                     *static_cast<sal_uInt64 *>(pDest) == (sal_uInt64)*static_cast<sal_Int32 *>(pSource));
     454             :         case typelib_TypeClass_UNSIGNED_LONG:
     455           0 :             return (*static_cast<sal_uInt64 *>(pDest) == (sal_uInt64)*static_cast<sal_uInt32 *>(pSource));
     456             :         case typelib_TypeClass_HYPER:
     457           0 :             return (*static_cast<sal_Int64 *>(pSource) >= 0 &&
     458           0 :                     *static_cast<sal_uInt64 *>(pDest) == (sal_uInt64)*static_cast<sal_Int64 *>(pSource));
     459             :         case typelib_TypeClass_UNSIGNED_HYPER:
     460          30 :             return (*static_cast<sal_uInt64 *>(pDest) == *static_cast<sal_uInt64 *>(pSource));
     461             :         case typelib_TypeClass_FLOAT:
     462           0 :             if (::floor( *static_cast<float *>(pSource) ) != *static_cast<float *>(pSource) || *static_cast<float *>(pSource) < 0)
     463           0 :                 return false;
     464           0 :             return (*static_cast<sal_uInt64 *>(pDest) == (sal_uInt64)*static_cast<float *>(pSource));
     465             :         case typelib_TypeClass_DOUBLE:
     466           0 :             if (::floor( *static_cast<double *>(pSource) ) != *static_cast<double *>(pSource) || *static_cast<double *>(pSource) < 0)
     467           0 :                 return false;
     468           0 :             return (*static_cast<sal_uInt64 *>(pDest) == (sal_uInt64)*static_cast<double *>(pSource));
     469             :         default:
     470           0 :             return false;
     471             :         }
     472             :     case typelib_TypeClass_FLOAT:
     473       44878 :         switch (eSourceTypeClass)
     474             :         {
     475             :         case typelib_TypeClass_BYTE:
     476           0 :             return (*static_cast<float *>(pDest) == (float)*static_cast<sal_Int8 *>(pSource));
     477             :         case typelib_TypeClass_SHORT:
     478           0 :             return (*static_cast<float *>(pDest) == (float)*static_cast<sal_Int16 *>(pSource));
     479             :         case typelib_TypeClass_UNSIGNED_SHORT:
     480           0 :             return (*static_cast<float *>(pDest) == (float)*static_cast<sal_uInt16 *>(pSource));
     481             :         case typelib_TypeClass_LONG:
     482           0 :             return (*static_cast<float *>(pDest) == (float)*static_cast<sal_Int32 *>(pSource));
     483             :         case typelib_TypeClass_UNSIGNED_LONG:
     484           0 :             return (*static_cast<float *>(pDest) == (float)*static_cast<sal_uInt32 *>(pSource));
     485             :         case typelib_TypeClass_HYPER:
     486           0 :             return (*static_cast<float *>(pDest) == (float)*static_cast<sal_Int64 *>(pSource));
     487             :         case typelib_TypeClass_UNSIGNED_HYPER:
     488           0 :             if (::floor( *static_cast<float *>(pDest) ) != *static_cast<float *>(pDest) || *static_cast<float *>(pDest) < 0)
     489           0 :                 return false;
     490           0 :             return ((sal_uInt64)*static_cast<float *>(pDest) == *static_cast<sal_uInt64 *>(pSource));
     491             :         case typelib_TypeClass_FLOAT:
     492       44878 :             return (*static_cast<float *>(pDest) == *static_cast<float *>(pSource));
     493             :         case typelib_TypeClass_DOUBLE:
     494           0 :             return ((double)*static_cast<float *>(pDest) == *static_cast<double *>(pSource));
     495             :         default:
     496           0 :             return false;
     497             :         }
     498             :     case typelib_TypeClass_DOUBLE:
     499       18662 :         switch (eSourceTypeClass)
     500             :         {
     501             :         case typelib_TypeClass_BYTE:
     502           0 :             return (*static_cast<double *>(pDest) == (double)*static_cast<sal_Int8 *>(pSource));
     503             :         case typelib_TypeClass_SHORT:
     504           0 :             return (*static_cast<double *>(pDest) == (double)*static_cast<sal_Int16 *>(pSource));
     505             :         case typelib_TypeClass_UNSIGNED_SHORT:
     506           0 :             return (*static_cast<double *>(pDest) == (double)*static_cast<sal_uInt16 *>(pSource));
     507             :         case typelib_TypeClass_LONG:
     508           1 :             return (*static_cast<double *>(pDest) == (double)*static_cast<sal_Int32 *>(pSource));
     509             :         case typelib_TypeClass_UNSIGNED_LONG:
     510           0 :             return (*static_cast<double *>(pDest) == (double)*static_cast<sal_uInt32 *>(pSource));
     511             :         case typelib_TypeClass_HYPER:
     512           0 :             return (*static_cast<double *>(pDest) == (double)*static_cast<sal_Int64 *>(pSource));
     513             :         case typelib_TypeClass_UNSIGNED_HYPER:
     514           0 :             if (::floor( *static_cast<double *>(pDest) ) != *static_cast<double *>(pDest) || *static_cast<double *>(pDest) < 0)
     515           0 :                 return false;
     516           0 :             return ((sal_uInt64)*static_cast<double *>(pDest) == *static_cast<sal_uInt64 *>(pSource));
     517             :         case typelib_TypeClass_FLOAT:
     518           0 :             return (*static_cast<double *>(pDest) == (double)*static_cast<float *>(pSource));
     519             :         case typelib_TypeClass_DOUBLE:
     520       12784 :             return (*static_cast<double *>(pDest) == *static_cast<double *>(pSource));
     521             :         default:
     522        5877 :             return false;
     523             :         }
     524             :     case typelib_TypeClass_STRING:
     525             :         return eSourceTypeClass == typelib_TypeClass_STRING
     526     1114718 :             && (static_cast<OUString *>(pDest))->equals(
     527     1114718 :                 *static_cast<OUString const *>(pSource) );
     528             :     case typelib_TypeClass_TYPE:
     529             :         return eSourceTypeClass == typelib_TypeClass_TYPE
     530           2 :             && _type_equals(
     531             :                 *static_cast<typelib_TypeDescriptionReference **>(pDest),
     532           2 :                 *static_cast<typelib_TypeDescriptionReference **>(pSource) );
     533             :     case typelib_TypeClass_ENUM:
     534      705800 :         return (_type_equals( pDestType, pSourceType ) &&
     535      705800 :                 *static_cast<sal_Int32 *>(pDest) == *static_cast<sal_Int32 *>(pSource));
     536             :     case typelib_TypeClass_STRUCT:
     537             :     case typelib_TypeClass_EXCEPTION:
     538      158379 :         if (! _type_equals( pDestType, pSourceType ))
     539         589 :             return false;
     540      157790 :         if (pDestTypeDescr)
     541             :         {
     542             :             return _equalStruct(
     543             :                 pDest, pSource,
     544             :                 reinterpret_cast<typelib_CompoundTypeDescription *>(pDestTypeDescr),
     545           0 :                 queryInterface, release );
     546             :         }
     547             :         else
     548             :         {
     549      157790 :             TYPELIB_DANGER_GET( &pDestTypeDescr, pDestType );
     550             :             bool bRet = _equalStruct(
     551             :                 pDest, pSource,
     552             :                 reinterpret_cast<typelib_CompoundTypeDescription *>(pDestTypeDescr),
     553      157790 :                 queryInterface, release );
     554      157790 :             TYPELIB_DANGER_RELEASE( pDestTypeDescr );
     555      157790 :             return bRet;
     556             :         }
     557             :     case typelib_TypeClass_SEQUENCE:
     558      234940 :         if (_type_equals( pDestType, pSourceType ))
     559             :         {
     560      228134 :             if (pDestTypeDescr)
     561             :             {
     562             :                 return _equalSequence(
     563             :                     *static_cast<uno_Sequence **>(pDest), *static_cast<uno_Sequence **>(pSource),
     564             :                     reinterpret_cast<typelib_IndirectTypeDescription *>(pDestTypeDescr)->pType,
     565           0 :                     queryInterface, release );
     566             :             }
     567             :             else
     568             :             {
     569      228134 :                 TYPELIB_DANGER_GET( &pDestTypeDescr, pDestType );
     570             :                 bool bRet = _equalSequence(
     571             :                     *static_cast<uno_Sequence **>(pDest), *static_cast<uno_Sequence **>(pSource),
     572             :                     reinterpret_cast<typelib_IndirectTypeDescription *>(pDestTypeDescr)->pType,
     573      228134 :                     queryInterface, release );
     574      228134 :                 TYPELIB_DANGER_RELEASE( pDestTypeDescr );
     575      228134 :                 return bRet;
     576             :             }
     577             :         }
     578        6806 :         return false;
     579             :     case typelib_TypeClass_INTERFACE:
     580        2781 :         if (typelib_TypeClass_INTERFACE == eSourceTypeClass)
     581        2471 :             return _equalObject( *static_cast<void **>(pDest), *static_cast<void **>(pSource), queryInterface, release );
     582         310 :         break;
     583             :     default:
     584             :         OSL_ASSERT(false);
     585           0 :         break;
     586             :     }
     587         310 :     return false;
     588             : }
     589             : 
     590             : }
     591             : 
     592             : #endif
     593             : 
     594             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11